Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Podstrony w php
Forum PHP.pl > Forum > PHP
adi2005
Tworzę mała witrynę w php. Podstrony wczytuję za pomoca zmiennych np. "/index.php?zmienna=". Wszystko jest oki ale przecież cała witryna nie moze być zbudowana na jednym pliku index.php! Jak zrobić by naprzykład plik "podstrona.php" nie zawierał tego co "index.php" a witryna zawierała to?questionmark.gif
PS. Strona nie jest zbudowana na tabelach tylko na DIV'ach i CSSie!
Cysiaczek
W manualu są opisane takie funkcje jak
include() oraz require() - za ich pomoca zrobisz to, co chcesz zrobić.
nasty
albo:
  1. <?php
  2. switch($_GET['zmenna']) {
  3. case 'a':
  4. break;
  5. [...]
  6. }
  7. ?>


ale sprecyzuj pytanie to ci powiem co i jak dokladniej
adi2005
np strona: "clubbing.pl": W lewym menu każdy link odnosi się do innego skryptu *.php. Klikasz w link a menu pozostaje i napewno nie zaiwerają go podstony. Jesli uzyję funkcji "include" wtedy powórnie mi sie wczyta menu obok i bede miał 2 menu....
Cysiaczek
Wszystko zależy od tego jak zaprojektujesz stronę. Możesz stworzyć "ramówkę" do której będziesz wpychał kawałki stron.
np. Najprostszy przykład dla zobrazowani a sytuacji

index.php
  1. [php]include ('head.php');[/php]
  2. [php]include ('body.php');[/php]
  3. </html>


head.php
  1. <title>jakis tytul</title>


etc. Powyższy kod nie jest za bardzo przydatny, ale ilutsruje tylko same założenie, czyli wydzielanie teg, co na stronie jest zmienne.
nasty
... albo jakies szablony (smarty)
... czy frameworki typu prado

jest kilka mozliwosci
mateofi
  1. <?php
  2. $id=$_GET["id"];
  3.  if(!isset($id)) {
  4. include("$id/index.php");
  5.  }
  6.  else {
  7.  if(is_file("id/$id.php")) {
  8.  include("id/$id.php");
  9.  }
  10.  else
  11.  include("id/error.php");
  12.  }
  13. ?>


i podstrony

index.php?id=news
index.php?id=forum
LamaMASTER
Jak widzę podstrony na switch i case to mi się śmiać chce smile.gif
Najlepiej kod jaki podał mateofi, ale lepiej zrobić go tak:
  1. <?
  2. $id = $_GET['id'];
  3. if (empty($id)) {
  4. include('glowna.php');
  5. }
  6. else {
  7. if (file_exists($id)) {
  8.  include('podstrony/'.$id.'.php');
  9. }
  10. else {
  11.  ?> Nie ma takiej podstrony <?
  12. }
  13. }
  14. ?>

I na przyszłość mateofi nie ucz początkujących wyświetlania wartości zmiennych tak: "$zmienna".
thornag
LamaMaster -> Smiej sie smiej, ja i tak uwazam ze switchowy szybszy i bezpieczniejszy. Zamiast tony ifow dajesz default: include("404.pgp"); na przyklad, do tego nie ma zabardzo mozliwosci wstawienia jakiejkolwiek innej zmiennej bo switch poprostu pojdzie na default. A z tego co wiem przy takim includowaniu nawet z file_egzists miozna podstawic jakies ta ciekawe stringi do adresu. Ale kto wie moze sie myle.

Pozatym nie rozumiem skad taka zmiana na mentora php smile.gif Niedawno byl problem z cookies i odejmowaniem dat ! Swoja droga zaintrygowales mnie, dlaczego chce Ci sie smiac z Switchow ?

A wracajac do tematu u mnie to zawsze wyglada tak...

  1. <?php
  2.  
  3. if(!isset($_GET['page'])) {
  4. include("podooch/home.php");
  5. }
  6. else {
  7. switch ($_GET['page']) {
  8. case "user_auth":
  9. include("lib/user_login.php");
  10. break;
  11. case "logout":
  12. include("lib/user_logout.php");
  13. break;
  14. // tutaj inne case'y //
  15. default:
  16. include("podooch/home.php");
  17. }
  18. }
  19. ?>
revyag
Rozwiązanie ze switch może być dobre dla małej ilości podstron. A co kiedy mój serwis ma ich 100 ? Np. archiwum newsów, atrykułów itp. Zrobisz switcha ze 100 warunkami ?
file_exists sprawdzi czy plik istnieje na dysku, więc nie wiem co byś musiał podać w urlu, żeby zaincludować swój plik, chyba hokus pokus snitch.gif
Można ewentulanie jeszcze zmienną z adresu objąć basename.
thornag
No ja przyzwyczailem sie do innego typu. Switch mi odpowiada jak najbardziej smile.gif

Kiedy mam 10 glownych 'dzialow' a w kazdym z nich jest po 10 podstron, to u mnie jest 10 dodatkowych switchow, index.php5?section=dzial&dzial=podstrona, a casy dodaje w trakcie tworzenia.

Jakos bardziej to do mnie przemawia. Jesli jest znaczna roznica w predkosci wykonywania, czy tez przewaga ifow nad switchem to prosze o dobitne argumenty smile.gif Calkiem mozliwe ze zdanie zmienie smile.gif

Co do tego archowum np, to przeciez masz tylko strony z np lista i podgladem newsa. W tym skrypty pobierajace z bazy danych i wyswietlajace :0 Nie mam zamiaru robic switcha dla kazdego news_id :DDDD
LamaMASTER
Hehe z cookies to ja nigdy nie miałem problemu, tylko ostatnio mi wylogowywanie nie działało, bo IE nie usuwa tego cookies (a kod jest poprawny). Być może wina leży po innej stronie.
A dodawanie dat to taka prosta sprawa nie jest winksmiley.jpg
Tak czy siak nie jestem żadnym mistrzem php, ale ładowanie podstron to rzecz podstawowa.
Po pierwsze switch jest wolniejszy, a po drugie co jak ktoś będzie miał 120 podstron? Zrobisz 120 razy case?
Poza tym ja wskazałem ścieżkę:
'podstrony/'.$id.'.php', więc ona musi znajdować się na serwerze. Co innego jeżeli ścieżka to było same $id. Ktoś musiałby coś zuploadować do tamtego katalogu żeby odpalić. Dlatego skrypt jest jak najbardziej bezpieczny.

PS: dopiero teraz czytałem dalsze posty - widzisz tu też gadają o tylu casach smile.gif
Ify przeważają - są szybsze i można więcej rzeczy nimi zrobić, a dobry if nigdy nie jest niebezpieczny.
Co prawda różnicy w prędkości nigdy nie zauważysz winksmiley.jpg

edit

a ja w moim rozwiązaniu znalazłem buga:
  1. <?php
  2. if (file_exists($id)) {
  3.  include('podstrony/'.$id.'.php');
  4. }
  5. ?>

Z rozpędu sprawdza samo $id smile.gif
Oczywiście ma być tak:
  1. <?php
  2. $id = 'podstrony/'.$id.'.php';
  3. if (file_exists($id)) {
  4.  include($id);
  5. }
  6. ?>
revyag
Przykład za archiwum to tylko przykład. Nie mówiłem nic o bazie danych, chodziło mi o serwis z dużą ilością stron bez bazy.
  1. <?php
  2. $file = basename($_GET['page']);
  3. if(file_exists('katalog/'.$file.'.php') {
  4. require_once('katalog/'.$file.'.php');
  5. } else {
  6. require_once('katalog/default.php');
  7. }
  8. ?>

Prównaj to ze swoim kodem, nadal nie widzisz różnicy ?
Tak jak napisałem wcześniej, kiedy w serwisie masz masz niedużo podstron to rób switcha, ale jeśli jest ich więcej i będzie przybywać to takie rozwiązanie jest bez sensu, bo będziesz musiał ciągle dodawać dodatkowe warunki do switcha.
A kod który podałem napiszesz raz i tyle smile.gif
Cysiaczek
Cytat
Ify przeważają - są szybsze i można więcej rzeczy nimi zrobić, a dobry if nigdy nie jest niebezpieczny.


Możesz to rozwinąć? Osobiście jedyna różnica jaką widzę, to zastosowanie - gdzieś jest dobry if else, a gdzieś indziej switch

switch [ang], przełącz - mówi samo za siebie
LamaMASTER
Ogólnie warunki wykonują się szybciej niż porównywanie do casów. Więcej rzeczy można nimi zrobić - no ify nie są tylko do ładowania podstron, a poza tym wyżej jest podany kod, który mówi sam za siebie co można za pomocą ifa zrobić smile.gif
thornag
Serwisy ktore dotychczas robilem raczej opieraja sie na niewielkiej ilosci plikow(szablonow) do ktorych jest ladowane wszystko z bazy. Takze dla mnei if przyjemniejszy smile.gif

Cytat
Tak jak napisałem wcześniej, kiedy w serwisie masz masz niedużo podstron to rób switcha, ale jeśli jest ich więcej i będzie przybywać to takie rozwiązanie jest bez sensu, bo będziesz musiał ciągle dodawać dodatkowe warunki do switcha.


Takze zostaje caly czas przy swoim smile.gif Poki robienie nie wiecej niz 10 casow dla switcha mi nie przeszkadza bede robil to dalej smile.gif Co do ifow to rzeczywiscie przy wielu podstronach nie ma sensu przelaczac. Jednak zazwyczaj jak juz pisalem opieram strone na 10(przykladowo) glownych dzialac wiec mam 'glowna sterownie' zlozona z niezbyt duzego switcha.

No to doszlismy do jakis wnioskow smile.gif
Cysiaczek
@lamaMASTER - Oprócz szybkości działania (potestowałem troszkę happy.gif), to nie widzę przewagi if else nad switchem. Za pomocą switch zrobisz to samo.
  1. <?php
  2. switch (file_exists($file)){
  3. case true: include($file);break;
  4. case false: die("Ooops!");break;
  5. }
  6. ?>


Już gdzieś pisałem, że jeśli trzeba reagować na więcej niż trzy wartosci, to switch jest lepszy, bo bardziej przejrzysty.
thornag
Dodam jeszcze ze np

Czasem nie chce includowac pliku tylko przekierowac na niego (header(Location);

Eg : index.php5?page=home zostaje w tym samym oknie.(tzn includuje do srodka)
index.php5?page=faq przekierowuje na storne z innym layoutem.

Od razu dodam ze wiem ze moge poprostu linka wstawic zamiast index.php5 daj faq.php. Ale ja wole utrzymac wszystko w strukturze page= to dzial do wyswietlenia.

Wtedy switchem zrobie to bez problemu, uzywajac tylko IF statement musze dodac kolejny warunek sprawdzajacy czy zmienna eg page jest rowna faq jesli tak to zamiast include header.
LamaMASTER
Co do przykładu ze switchem - mi się wydaje, że if jest jednak bardziej przejrzysty smile.gif Tak samo można zrobić:
  1. <?php
  2. if (file_exists($file)) { include($file); }
  3. else { die('Ooops!'); }
  4. ?>

Na dodatek if nie potrzebuje break smile.gif
Cysiaczek
Cytat(Cysiaczek @ 18.07.2006, 11:02 ) *
Już gdzieś pisałem, że jeśli trzeba reagować na więcej niż trzy wartosci, to switch jest lepszy, bo bardziej przejrzysty.


Nie w tej sytuacji, tylko gdy masz więcej możliwych rezultatów. np od 1 do 50 . Będziesz robił 50 razy if elseif elseif ... else ? No chyba lepiej switch nieprawdaż? laugh.gif
jezoo
Cytat(Cysiaczek @ 18.07.2006, 11:02 ) *
@lamaMASTER - Oprócz szybkości działania (potestowałem troszkę happy.gif), to nie widzę przewagi if else nad switchem. Za pomocą switch zrobisz to samo.
  1. <?php
  2. switch (file_exists($file)){
  3. case true: include($file);break;
  4. case false: die("Ooops!");break;
  5. }
  6. ?>


niestety nie dziala, dowod:
Cytat
Warning: include(./text/) [function.include]: failed to open stream: Permission denied in C:\wamp\www\fpon\source\function_page.php on line 14

Warning: include() [function.include]: Failed opening './text/' for inclusion (include_path='.;C:\php5\pear') in C:\wamp\www\fpon\source\function_page.php on line 14


Cytat(Cysiaczek @ 18.07.2006, 11:02 ) *
switch jest lepszy, bo bardziej przejrzysty.


owszem przejzysty ale nie zawsze to idzie w parze z funkcjonalnoscia
thornag
Kod
: Permission denied in C:\wamp\www\fpon\source\function_page.php on line 14


Eee ? Czy aby napewno nie dziala ? Poczytaj moze komunikaty bledu.

RE DOWN: Hyhyhy,
jezoo
uuups, o qrcze smile.gif faktycznie smile.gif zwracam Honor smile.gif

porwalem sie z motyka na slonce winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.