Strona 1 z 2
Niedziałają podstrony..
: śr cze 04, 2008 10:17 am
autor: Patol89
Wiam mam na stronie coś takiego:
Odnośnik do podstrony:
<a href="index.php?id=a" class="left_menu_link">a</a>
<a href="index.php?id=b" class="left_menu_link">b</a>
<a href="index.php?id=c" class="left_menu_link">c</a>
skrypt:
<?php
if(empty($id) or $id=="a"){
include("a.php");
}
if($id=="b"){
include("b.php");
}
if($id=="c"){
include("c.php");
}
?>
Problem polega na tym że gdy stoi to na webservie to wszystko gra i podstrony się ładują prawidłowo lecz gdy wrzucę to na np. republikę lub też yoyo to nie działa załaduję się tylko strona główna a odnośniki nie chcą działać

Da się to jakoś naprawić czy powinienem użyć innego skryptu?
Z góry dziękuję za pomoc i pozdrawiam.
Re: Niedziałają podstrony..
: śr cze 04, 2008 5:12 pm
autor: gorylek
zapewne masz włączone register globals czy jak to tam szło (wieki tego nie używałem). Wystarczy drobna modyfikacja i będzie chodzić jak złoto.
Kod: Zaznacz cały
<?php
$id = $_GET['id'];
if(empty($id) or $id=="a"){
include("a.php");
}
if($id=="b"){
include("b.php");
}
if($id=="c"){
include("c.php");
}
?>
Tylko teraz bierz pod uwagę to że w ten sposób można dobrać się do dowolnego pliku odpowiednio modyfikując parametr id.
Re: Niedziałają podstrony..
: czw cze 05, 2008 6:15 pm
autor: Patol89
Dziękuję bardzo już sobie z tym poradziłem zrobiłem to tak:
Kod: Zaznacz cały
<?php
if($_GET['id']!="")
{
switch( $_GET['id']) {
case 'a':
include 'a.php';
break;
case 'b':
include 'b.php';
break;
case 'c':
include 'c.php';
break;
}
}
else include 'a.php';
?>
Re: Niedziałają podstrony..
: pt cze 06, 2008 9:49 am
autor: gorylek
<?php
if($_GET['id']!="")
{
switch( $_GET['id']) {
case 'a':
include 'a.php';
break;
case 'b':
include 'b.php';
break;
case 'c':
include 'c.php';
break;
}
}
else include 'a.php';
?>
1. if($_GET['id']!="") nie jest potrzebne. Po prostu ustawiasz DEFAULT (tak jak
case 'c': piszesz
default:.
Wtedy w wypadku pustej zmiennej, zostanie wczytana strona domyślna. Tak samo jeżeli ktoś poda inny parametr niż te które są zawarte w switchu.
2. Skrypt nadal ma dziury. Podając odpowiedni parametr, mogę odwołać się do dowolnego pliku Twojej strony i dołączyć go do strony. Jeżeli miał byś dla przykładu forum
phpbb2 w folderze forum to podając jako parametr
forum/config.php, dodamy plik config a jeżeli dalej gdzieś ten plik wyświetlasz, w tym momencie mogę zobaczyć dane Twojej bazy mySQL i dobrać sie do niej (mam adres serwera, login i hasło). To tylko przykład, możliwości jest znacznie więcej. W tej wersji skryptu nie ma takiej możliwości oczywiście ale należy brać pod uwagę że będziesz chciał to inaczej rozwiązać przy większej ilości plików. Taka rada na przyszłość, switch to porażka do takich rozwiązań.
Re: Niedziałają podstrony..
: pt cze 06, 2008 11:22 am
autor: Patol89
Szczerze mówiąc to jestem początkujący w php i nie za bardzo wiem jak się z tym uporać.
Mógł bym prosić o jakąś wskazówkę? (nie chcę gotowca!).
Pozdrawiam.

Re: Niedziałają podstrony..
: pt cze 06, 2008 12:52 pm
autor: gorylek
No dla przykładu, można założyć że nazwy plików będą zawierały
tylko litery i cyfry.
Wtedy można napisać coś takiego:
<?php
if(ctype_alnum($_GET['id']===false))
{
$id = 'blad';
}
else
{
$id = $_GET['id'];
}
switch($id)
{
case 'a':
include('a.php');
break;
case 'b':
include('b.php');
break;
case 'c':
include('c.php');
break;
default:
include('a.php');
break;
}
?>
Jak to zadziała ?
if(ctype_alnum($_GET['id']===false))
ctype_alnum oznacza że przekazany ciąg może zawierać tylko
litery i cyfry. Więcej możesz przeczytać
tutaj.
Można to zapisać w postaci:
if(ctype_alnum($_GET['id']))
gdyż funkcja zwraca
true albo
false ale nie chciałem Ci motać. Po co znak identyczności ? (
===). Po to by w wypadku gdy parametr wynosił
zero, skrypt nie odebrał go jako
false. Identyczność rozróżnia
0 od
false gdzie operator porównania (
==) tej różnicy nie widzi.
W każdym razie dalej chyba zrozumiałe, jeżeli
ciąg jest zły to zmienna
$id dostaje wartość
blad. Można to zostawić albo wykorzystać w switchu. Jeżeli ktoś nie podał wartości (wszedł przez link w stylu
www.mojastrona.pl zamiast
www.mojastrona.pl?id=c lub jeżeli podany parametr będzie inny niż ten który jest podany w
switch to zostanie domyślnie wczytana strona
a.php.
Teraz czemu się czepiałem. Obecnie skrypt jest ok ale np przy większej ilości podstron szkoda się ze switchem bawić. Do tego ma on to do siebie że wszyta wszystkie podstrony a następnie doda tą którą mu każesz poprzez parametr. Lepiej zrobić tak że dołączony zostanie plik o nazwie będącej parametrem z rozszerzeniem php pod warunkiem że plik istnieje. Np coś takiego:
<?php
if(ctype_alnum($_GET['plik']===false))
{
$plik= 'blad.php';;
}
else
{
$plik= $_GET['plik'].'.php';
}
if(file_exists($plik)===true)
{
include($plik);
}
else
{
include('blad.php');
}
To oczywiście tylko przykład. W takim wypadku wymagana jest filtracja $_GET musi być przeprowadzona ale bierz pod uwagę że jeżeli chce dołączyć kolejny plik, np z podstroną to nie edytuje absolutnie niczego. Zwyczajnie dokładam plik do innych i dodaje link w menu. W wypadku wywołania albo plik zostanie dodany albo zostanie dodana strona blad.php z odpowiednią informacją.
Re: Niedziałają podstrony..
: pt cze 06, 2008 4:14 pm
autor: Patol89
No tak czyli rozumiem że ma to również wpływ na szybkość wczytywania się strony przy większej ilości podstron.
Mam jeszcze jedno pytanie czy includowanie podstrony które wygląda tak:
include 'a.php';
a nie tak:
include ('a.php');
Ma jakiś wpływ na bezpieczeństwo strony, czy może jest to obojętne czy wstawię nawiasy czy nie?
Re: Niedziałają podstrony..
: pt cze 06, 2008 4:14 pm
autor: Patol89
Z niewiadomych przyczyn zrobił się double post, za co przepraszam i proszę o usunięcie dubla

Re: Niedziałają podstrony..
: pt cze 06, 2008 4:30 pm
autor: gorylek
Ja się w ogóle zdziwiłem że chodzi

Zawsze stosowałem formę z nawiasami i nawet mi do głowy nie przyszło że tak można.
Co do switcha który dodaje podstrony to wpadł mi w oko tekst mówiący o tym że tak czy siak wczytywane są wszystkie i wydajność spada wraz z kolejnymi plikami. Switch raczej używany jest do odpalania odpowiedniego kodu. Wczytanie podstron można zrobić bardzo wygodnie w ten sposób jaki pokazałem.
Jeżeli chcesz uwzględnić wszystkie znaki możliwe w nazwie plików, trzeba już się bawić z wyrażeniami regularnymi.
Re: Niedziałają podstrony..
: pt cze 06, 2008 4:43 pm
autor: Patol89
hehe no tak chodzi i nie widzę różnicy w działaniu ale następnym razem będę dawał nawiasy bo w końcu tak powinno być

A co do przykładu który mi pokazałeś:
Kod: Zaznacz cały
<?php
if(ctype_alnum($_GET['plik']===false))
{
$plik= 'blad.php';
}
else
{
$plik= $_GET['plik'].'.php';
}
if(file_exists($plik)===true)
{
include($plik);
}
else
{
include('blad.php');
}
Zaskoczył mnie pozytywnie bo nie myślałem że można zrobić to w ten sposób. Działa świetnie a do tego to szybki sposób i nie trudny

Re: Niedziałają podstrony..
: pt cze 06, 2008 5:09 pm
autor: gorylek
Od tego jest to forum, pozdrawiam.
Re: Niedziałają podstrony..
: pt cze 06, 2008 8:03 pm
autor: Patol89
Mam jeszcze jeden problem. Piszę tutaj żeby nie zakładać nowego tematu.
Jak zrobić coś takiego by działało?:
nie wiem jak includować plik za $wiadomosc =
Próbowałem już coś w tym stylu:
Kod: Zaznacz cały
$plik = 'a.txt';
$wiadomosc = fopen($plik,"r");
ale też nie działa

Re: Niedziałają podstrony..
: sob cze 07, 2008 8:03 am
autor: gorylek
1. Zawsze najpierw pasuje sprawdzić czy plik istnieje (masz to w powyższym przykładzie. Następnie:
$plik= fopen('a.txt', ‘r+’); ~otwieramy plik
$wiadomosc = fread($plik, filesize('a.txt')); ~pobiera cały plik txt
fclose($plik); ~zamykamy plik
Teraz w zmiennej $wiadomosc masz całą zawartość pliku a.txt. Nie wiem czy gdzieś nie popełniłem błędu, ostatni raz cokolwiek zapisującego w pliku txt pisałem pewnie ponad rok temu i tylko dlatego że klient uparł się że nie chce bazy mySQL.
Re: Niedziałają podstrony..
: sob cze 07, 2008 8:38 am
autor: Patol89
No niestety coś nie halo
Ja usiłuję zrobić skrypt który na gg wysyła newsy i chodzi o to by wczytywał treść z pliku. Po zastosowaniu tego skryptu dostaję puste wiadomości
myślałem że problem tkwi tutaj:
$plik= fopen($dane, ‘r+’);
i zmieniłem na :
$plik= fopen($dane, 'r+');
lecz niestety to nie pomogło i wygląda na to że to początek mojego problemu

Musze jeszcze zrobić by skrypt wysyłał wiadomości co określoną ilość czasu ale nie wiem czy dobrze kombinuję może coś takiego by zdało egzamin?:
<php?
$godzina = date("H");
$czas = "15";
if ($czas <= $godzina) {
skrypt wysyłający wiadomość
}
?>
Najlepiej gdyby dało określić się dzień tygodnia w jaki skrypt by się uaktywniał.
A i jeszcze jedno pytanie z kąd się wzięło
$dane?:
$plik= fopen($dane, ‘r+’);
Re: Niedziałają podstrony..
: sob cze 07, 2008 9:15 am
autor: gorylek
Trochę się rozpędziłem. W $dane trzymałem ścieżkę do pliku, Tobie wystarczy tam a.txt, już poprawiłem.
Musze jeszcze zrobić by skrypt wysyłał wiadomości co określoną ilość czasu ale nie wiem czy dobrze kombinuję może coś takiego by zdało egzamin?:
Nie zda niestety. Taki skrypt musi być wywołany czyli Ty albo ktoś inny musiał by odpalić ten plik.
Rozwiązaniem jest CRON. Tu jest pierwszy wynik pod frazą "php cron".
http://home.pl/pomoc/funkcje/cgi/cron
Pogrzeb w google, coś znajdziesz na ten temat.