Niedziałają podstrony..

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
Patol89
Nowy
Nowy
Posty: 34
Rejestracja: śr paź 24, 2007 10:28 am
Kontakt:

Niedziałają podstrony..

Post 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.
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Niedziałają podstrony..

Post 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.
Patol89
Nowy
Nowy
Posty: 34
Rejestracja: śr paź 24, 2007 10:28 am
Kontakt:

Re: Niedziałają podstrony..

Post 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';
			?>
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Niedziałają podstrony..

Post 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ń.
Ostatnio zmieniony pt cze 06, 2008 12:59 pm przez gorylek, łącznie zmieniany 1 raz.
Patol89
Nowy
Nowy
Posty: 34
Rejestracja: śr paź 24, 2007 10:28 am
Kontakt:

Re: Niedziałają podstrony..

Post 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. :)
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Niedziałają podstrony..

Post 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ą.
Patol89
Nowy
Nowy
Posty: 34
Rejestracja: śr paź 24, 2007 10:28 am
Kontakt:

Re: Niedziałają podstrony..

Post 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?
Patol89
Nowy
Nowy
Posty: 34
Rejestracja: śr paź 24, 2007 10:28 am
Kontakt:

Re: Niedziałają podstrony..

Post autor: Patol89 »

Z niewiadomych przyczyn zrobił się double post, za co przepraszam i proszę o usunięcie dubla :)
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Niedziałają podstrony..

Post autor: gorylek »

Ja się w ogóle zdziwiłem że chodzi :P 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.
Patol89
Nowy
Nowy
Posty: 34
Rejestracja: śr paź 24, 2007 10:28 am
Kontakt:

Re: Niedziałają podstrony..

Post 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ć :D
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 :)
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Niedziałają podstrony..

Post autor: gorylek »

Od tego jest to forum, pozdrawiam.
Patol89
Nowy
Nowy
Posty: 34
Rejestracja: śr paź 24, 2007 10:28 am
Kontakt:

Re: Niedziałają podstrony..

Post autor: Patol89 »

Mam jeszcze jeden problem. Piszę tutaj żeby nie zakładać nowego tematu.

Jak zrobić coś takiego by działało?:

Kod: Zaznacz cały

$wiadomosc = include ('a.txt');
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 :(
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Niedziałają podstrony..

Post 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.
Ostatnio zmieniony sob cze 07, 2008 9:11 am przez gorylek, łącznie zmieniany 1 raz.
Patol89
Nowy
Nowy
Posty: 34
Rejestracja: śr paź 24, 2007 10:28 am
Kontakt:

Re: Niedziałają podstrony..

Post 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 :P
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+’);
gorylek
Zaczyna działać
Zaczyna działać
Posty: 427
Rejestracja: śr gru 19, 2007 7:29 pm

Re: Niedziałają podstrony..

Post 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.
ODPOWIEDZ