[PHP] include i switch - jak zrobić aktywne linki?


(mariuseq) #1

Stronę podzieliłem na trzy kolumny. Z lewej i prawej są odnośniki do treści, która pokazuje się w środku. Wykorzystuję taki skrypt:

i tu wszystko działa. Nie wiem, co zrobić, jak podlinkować, aby z tej środkowej kolumny (gdzie jest zasadnicza treść) można było przechodzić na inne podstrony. Bo format taki, jak powyżej nie działa, tzn. wyświetla się informacja o złym adresie strony.

| <?php $id = $_GET['id']; if(!empty($id)) { if( (file_exists("$id.php")) && (preg_match('|^[[:alpha:]-]+$|', $id)) ) include "$id.php"; // jezeli plik nie istnieje wyswietla się komunikat else include '404.php'; } // jezeli zmienna $id jest pusta wyswietla się strona glowna else include 'start.php'; ?> |

Linki z kolumn bocznych mają taką formę
[code][Forum dyskusyjne](index.php?id=forum)


(Blazej X) #2

Może dokładniej bo nie wiem, czy błąd jest dlatego, że nie ma odpowiedniego pliku, czy dlatego że link jest źle wygenerowany (źle przekazana zmienna w adresie, lub złe odczytanie zmiennej z adresu)?

Ale tak czy inaczej to w ogóle masz zły pomysł :slight_smile: Jeżeli robisz coś takiego:

include "$id.php"

to musisz przefiltrować zmienną $id trochę dokładniej, niż tylko pozbywając się kilu nieporządnych w nazwie pliku znaków. Takie beztroskie inlude może skończyć się tym, że w zmienną $id użytkownik podstawi adres pliku, którego nie powinien zobaczyć, a Twój skrypt to wyświetli. Listę kategorii (home, forum, galeria itp itd) masz zapewne zdefiniowane od początku, więc nazwę pliku możesz sprawdzić switch'em:

switch htmlspecialchars($id) {

    case "forum":

       include "forum.php"

        break;

    case "cokolwiek":

       include "cokolwiek.php"

        break;

    default:

       include "start.php"

       break

}

tyle tylko, że zajmuje to trochę miejsca w kodzie. Możesz też zdefiniować (albo załadować z bazy danych) do tablicy listę kategorii i zweryfikować przesłaną zmienną tak:

$kategorie=array("forum", "cokolwiek");

if in_array($id, $kategorie) {

 include "$id.php" 

}else{ 

include "start.php" 

}

A zmienną, w której będziesz miał id konkretnego artykułu, obrazka czy czegośtam sprawdzisz tylko funkcją is_numeric(); i wszystko gra :slight_smile:

Najlepszym rozwiązaniem jest jednak chyba mod_rewrite - bezpieczna, czytelna, przyjazna dla przeglądarek i użytkownika metoda na linkowanie poszczególnych kategorii :slight_smile: Ale o tym nie będę się rozpisywał - oddaję głos wujkowi Google :slight_smile:


(mariuseq) #3

Wyświetlany błąd ma treść: page not found. Jestem początkujący w php, nie jestem pewien, czy w odpowiednie miejsce wpisałem treść tamtego kodu ze switchem:

| <?php $id = $_GET['id']; if(!empty($id)) { if( (file_exists("$id.php")) && (preg_match('|^[[:alpha:]-]+$|', $id)) ) include "$id.php"; switch htmlspecialchars($id) { case "kluby": include "kluby.php" break; case "kalendarium": include "kalendarium.php" break; default: include "start.php" break } // jezeli plik nie istnieje wyswietla się komunikat else include '404.php'; } // jezeli zmienna $id jest pusta wyswietla się strona glowna else include 'start.php'; ?> |

[/code]

Lista kategorii rzeczywiście jest skonfigurowana powyżej.

Konkretnie chcę osiągnąć coś takiego: w liście kategorii wybieram opcję KWIATY i wówczas w środkowej kolumnie wyświetla mi się lista np. RÓŻE, FIOŁKI, TULIPANY itp. Jak zrobić, żeby można po kliknięciu na FIOŁKI przejść do kolejnej podstrony z opisem tego rodzaju kwiatów? Opcja stosowana przeze mnie index.php?id=fiolki jako link nie działa. Oczywiście, jak w adresie strony wpiszę pełną ścieżkę dostępu do tego pliku fiolki.php, to się wyświetli, ale wówczas jest "goły", nie ma menu i pozostałych dwóch bocznych kolumn.


(kalamita) #4

Czy plik "fiolki.php" znajduje się w tym samym katalogu co plik "index.php" ?

Tak jak wspomniał l ight_neon spróbuj użyć is_numeric($id) lub is_string($id) - w zależności jakiego typu jest $id i powinno działać lepiej, dopiero po tym zastosuj wyrażenia regularne.


(Monczkin) #5

mariuseq , nazwij proszę temat konkretnie, bez zbędnych problemów w tytule. Inaczej wyciągnę konsekwencje. Przeczytaj ten temat. viewtopic.php?f=16&t=394978


(mariuseq) #6

Temat zmieniłem na polecenie moderatora, mam nadzieję, że teraz jest bardziej czytelny. Przepraszam za zamieszanie.

Udało mi się samodzielnie rozwiązać problem, który zgłaszałem w nocy. Błąd wynikał z mojej nieuwagi i był następujący: otóż w środkowej kolumnie było zamiast

Fiołek[/code]
było

[code][Fiołek](index?id=fiolek)

Teraz wszystko funkcjonuje tak, jak bym sobie tego życzył, a zatem problem rozwiązany!

Zaintrygowało mnie jednak to, co pisał w nocy l ight_neon. Jak mogę sprawdzić, czy polecenie switch działa poprawnie? I czy ktoś mógłby zerknąć w ten kod i stwierdzić, czy jest poprawny?