switch....case pentru mai multe pagini

Secţiune dedicată începatorilor.

Moderatori: Moderatori, Start Moderator

dianagaby2002
PHPRomania Supporter
Mesaje: 19
Membru din: Mie Aug 05, 2015 10:09 am

switch....case pentru mai multe pagini

Mesajde dianagaby2002 » Lun Aug 17, 2015 12:41 pm

Vreau sa folosesc un SWITCH...CASE asa:


Cod: Selectaţi tot

<a href="?link=1">Page 1</a>
<a href="?link=2">Page 2</a>
<a href="?link=3">Page 3</a>

<?php
$link = $_GET['link'];

switch($link){
    case 1: $page = "page1.php";
    break;
   
    case 2: $page = "page2.php";
    break;
   
    case 3: $page = "page3/page3.php";
    break;
}
   
@include "$page";
  ?>


Ar fi greu de procesat daca am in jur de 800-1.000 pagini? Adica sa mi se includa intr-o pagina o alta pagina(cea aleasa de utilizator; va alege dintr-o lista de linkuri)
Multumesc anticipat!



emanu31
PHPRomania Supporter
Mesaje: 27
Membru din: Mar Sep 02, 2014 11:55 am

Re: switch....case pentru mai multe pagini

Mesajde emanu31 » Lun Aug 17, 2015 1:44 pm

Pai tu vrei sa pui in switch cate un case pt fiecare: 1, 2, 3 ... 800 ... 1000?

In mod normal nu se face asa... poti sa ai un switch care sa-ti verifice un numar limitat de posibilitati. Ar trebui sa ai link-urile in baza de date, sa cauti dupa ele si sa aduci de acolo continutul.

Nu mai pune @ in fata functiilor, nu o sa vezi erorile si in cazul de fata, in loc sa dai un 404 ca nu ai fisierul la include (deci nu ai pagina) o sa ai o eroare ascunsa.

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: switch....case pentru mai multe pagini

Mesajde nevvermind » Lun Aug 17, 2015 1:47 pm

Ce faci tu sa numeste "router", dar al tau e foarte "manual".
Foloseste unul mai dinamic (https://packagist.org/search/?q=router, https://github.com/nikic/FastRoute) - adica $_GET['link'] il mapezi la "page{PAGE_ID}.php".

Incearca sa fii consistenta in URL-uri:
1 = page1.php
2 = page2.php
3 = page3/page3.php (??)

Orice router capabil iti va permite astfel de exceptii, dar prefera consistenta.

Dar, daca vrei sa continui cu ce faci, macar fa asa:

Cod: Selectaţi tot

if (!isset($_GET['link']) && !($link = (int) $_GET['link'])) {
    header("HTTP/1.0 404 Not Found");
    die;


switch ($link) {
    case 3:
        $page = "page3/page3.php";
        break;
    default:
        $page = "page" . $link . ".php";
}

Ai grija la securitatea codului, fiindca oricine poate injecta ceva in URL ($_GET) si tu vei actiona direct asupra acelei includeri straine.
Fii paranoia si curata inputurile mereu.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

CristianG
Average Member
Mesaje: 85
Membru din: Mie Oct 30, 2013 4:45 pm

Re: switch....case pentru mai multe pagini

Mesajde CristianG » Lun Aug 17, 2015 2:33 pm

@nevermind ai dreptatea ta dar nu este necesar sa treaca prin switch pentru a prelua paginile definite !

Poti da exemple mai demne si mai bune nu trebuie sa gandesti problema cum ai gandit`o in momentul asta in primu rand aici nu e vorba de caz si nu este vorba sa verifici 1.000 de pagini daca sunt setate incat sa le setezi pe fiecare dupa caz poi atunci inebunesti. O simpla verificare este deajuns incat sa faca tot si nu conteaza ca sunt 10.000 de pagini.

Be smart @never :)

Ideea e simpla ce are de facut el

index.php

Cod: Selectaţi tot

<a href="?link=1">Page 1</a>
<a href="?link=2">Page 2</a>
<a href="?link=3">Page 3</a>
<?php
if (!isset($_GET['link']) && !($link = (int) $_GET['link'])) {
   header("HTTP/1.0 404 Not Found");
   die;
}
if(isset($_GET['link'])) {
   define("DOC_ROOT", str_replace(array("/index.php", "\index.php"), "", realpath(__FILE__)));
   $filename = DOC_ROOT."/page{$_GET['link']}.php";
   if (is_file($filename)) {
      include_once($filename);
      //echo "The file {$filename} exists";
   } else {
      echo "The page does not exist";
      die;
   }
}


Am definit DOC_ROOT ca real patch unde vei putea detecta patch-ul tau. Trebuie sa verifici daca din link`ul oferit exista fisierul pentru a il include inainte de toate !

Nu trebuie sa dai nici un caz si plus nu este nevoie sa scri un INCLUDE in moment ce in index.php default nu ai variabila definita odata ce ai cerut.


Cod: Selectaţi tot

<?php
$link = $_GET['link'];

switch($link){
    case 1: $page = "page1.php";
    break;
   
    case 2: $page = "page2.php";
    break;
   
    case 3: $page = "page3/page3.php";
    break;
}
   
@include "$page";
  ?>


In codul tau dupa cum vezi ai fost fortat de a defini @include "$page"; din motivul in care nu este definit dar de ce sa faci asta cand poti defini ca mine printr`o verificare inainte ca includele sa fie definit pe index`ul tau !

Tu ai multe optiuni care le poti face doar sa incerci sa nu gandesti lucru asta ca trebuie verificat prin cazuri sau prin if elseif etc... !


Succes

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: switch....case pentru mai multe pagini

Mesajde nevvermind » Lun Aug 17, 2015 3:31 pm

Pai tu ai pus un singur caz, fiindca nu acoperi exceptia "case 3: $page = "page3/page3.php".
De asta ii sugeram consistenta; daca n-ar fi existat cazul ala, da, totul mergea pe o singura linie.

PS: "if(isset($_GET['link']))" e redundant in snippet-ul tau.

PPS: as aprecia daca reply-urile tale n-ar mai contine replici precum "hei, fa-o mai bine. BE SMART! poti da exemple mai demne si mai bune". No shit, sherlock. Da, stiu ca pot da exemple mai demne (demne? cum adica DEMNE? :)) sa scriu cod cu onoare sau ce? sa scriu cod cu furculitza aurita?) si mai bune, dar:
- poate n-am chef
- poate am indigestie si ma grabesc
- poate nu stiu
- poate nu vreau
Valei, ce ma mai enerveaza stilul tau de a raspunde... Mai lasa-i pe ceilalti.

PPPS: Mai foloseste si virgula cand scrii!
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

CristianG
Average Member
Mesaje: 85
Membru din: Mie Oct 30, 2013 4:45 pm

Re: switch....case pentru mai multe pagini

Mesajde CristianG » Lun Aug 17, 2015 4:19 pm

Asta e si intentia :))

Daca tot ai inceput sa imi vanezi topicurile si raspunsurile mele o sa le intorc si eu asa cum faci si tu :P

Codul era un exemplu poate acoperi usor si restul precum

Cod: Selectaţi tot

if (is_dir(DOC_ROOT."/$folder/page{$_GET['link']}.php)) {


E vorba de detectia lui si indiferent poate face foarte multe lucruri dar nu cum ai dat tu exemplu pentru ca pana la urma @include este null la index.php si se aplica doar in _GET so dude exemplu meu poate fi adaptat oricand nu stau sa ii dau tot codul ca pana la urma trebuie sa invete si sa incerce sa faca si el nu numai noi !

Si @never nu te-am intrebat de ce, dai reply`uri asa :)) nici nu am nevoie de explicatiile tele ca nu ai cef sau nu vrei, intelegi :))


PS: daca tot ai dorit un exemplu ia de aicilia :))

Cod: Selectaţi tot

<a href="?link=1">Page 1</a>
<a href="?link=2">Page 2</a>
<a href="?link=3">Page 3</a>
<?php
if (!isset($_GET['link']) && !($link = (int) $_GET['link'])) {
   header("HTTP/1.0 404 Not Found");
   die;
}
if(isset($_GET['link'])) {
   define("DOC_ROOT", str_replace(array("/index.php", "\index.php"), "", realpath(__FILE__)));
   if($_GET['link'] == "3") {
      $filename = DOC_ROOT."/folder/page{$_GET['link']}.php";
   } else {
      $filename = DOC_ROOT."/page{$_GET['link']}.php";
   }
   if (is_file($filename)) {
      include_once($filename);
      //echo "The file {$filename} exists";
   } else {
      echo "The page does not exist";
      die;
   }
}


desigur poti folosi chiar si switch in caz de vrei ca link=3 sa seteze folder dar asa cum spuneam indiferent de exemple tu trebuie sa gandesti codul inainte de toate trebuie sa il faci incat sa nu faci 1.000 de lini inutile.
Plus mare atentie exact cum spunea si @emanu31 nu incerca sa acoperi cu "@" functiile, variabilele inainte ca sa fie setate trebuie in primu rand sa fie definite !
Mai exact incearca sa faci conditile necesare si apoi definestele nu arunca un @include aiurea si mai ales global daca nu este definit.


Respect,

dianagaby2002
PHPRomania Supporter
Mesaje: 19
Membru din: Mie Aug 05, 2015 10:09 am

Re: switch....case pentru mai multe pagini

Mesajde dianagaby2002 » Mar Aug 18, 2015 2:24 pm

Aham, inteleg ca era ok metoda daca erau mult mai putine pagini.

@nevvermind, am pus si varianta "page3/page3.php" pentru ca o sa am directoare diferite si subdirectoare, sub-subdirectoare...

Am vrut varianta asta ca sa nu folosesc la cai "../../" ca nu prea merge(m-am uitat si pe net si am numarat cate directoare merg inapoi, dar...). Mai bine includ meniul in fiecare pagina...

Multumesc totusi pentru sugestii ;) O zi frumoasa! :bigsmurf:

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: switch....case pentru mai multe pagini

Mesajde nevvermind » Mar Aug 18, 2015 2:58 pm

Nu conteaza cate pagini ai: poti avea mii. Conteaza sa creezi dinamic calea catre ele, pt a nu o scrie de fiecare data.

Si mai bine ar fi sa ai pagini create dinamic, nu doar cai dinamice catre pagini statice.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

emanu31
PHPRomania Supporter
Mesaje: 27
Membru din: Mar Sep 02, 2014 11:55 am

Re: switch....case pentru mai multe pagini

Mesajde emanu31 » Mar Aug 18, 2015 5:38 pm

@dianagaby2002 ti s-au dat cateva sfaturi, dar cred ca nu poti face diferenta datorita faptului ca au fost comentariile mai "cu mot"

1. tu ziceai de switch pt cateva mii de pagini; Ideea aici ar fi sa nu ai tot cateva mii de case-uri in switch, adica poti folosi switch daca faci cazuri generale care sa-ti cuprinda mai multe situatii (dar sa le poti numara pe degete). Avand in vedere ca tu folosesti niste id-uri page1, page2 ... page1000, nu prea ai cum sa generalizezi cazurile asa.
2.
Am vrut varianta asta ca sa nu folosesc la cai "../../" ca nu prea merge
pt asta CristianG a spus (sau incarca sa-ti spuna) sa ai un singur punct de intrare in aplicatie - index.php si acolo sa-ti definesti o constanta DOC_ROOT. Astfel nu o sa mai ai batai de cap cu path-ul ("calea", nu "patch-ul", cum a scris el - termeni diferiti), deoarece in DOC_ROOT ai avea calea catre folderul unde ai tu gazduit site-ul si de acolo doar ai adauga foldere si fisiere.
As mai avea ceva de adaugat aici referitor la codul asta, este o reinventare a rotii

Cod: Selectaţi tot

define("DOC_ROOT", str_replace(array("/index.php", "\index.php"), "", realpath(__FILE__)));

e mai simplu si clar sa folosesti functia dirname

Cod: Selectaţi tot

define("DOC_ROOT", dirname(__FILE__));

3. atunci cand creezi un path catre un fisier, nu mai folosi / foloseste constanta predefinita DIRECTORY_SEPARATOR astfel nu o sa ai probleme cu path-urile de Windows vs Linux sau Mac.
4. in siturile mai mari (nu neaparat complexe, dar cu numar mare de pagini cum ai tu), chiar daca poate nu mai este la rubrica incepatori pe forum (dar e bine de stiut) ar trebui sa folosesti un mediu, unde sa-ti salvezi cel putin url-urile. Prin mediu se pot intelege - un fisier (ar fi usor de implementat, dar neindicat ca si performanta), o baza de date (cel mai intalnit, relativ usor de implementat, performanta ok), un sistem rapid de cacheing (mai avansat, dar cel mai performant) - aici trebuie sa intelegi ca unele resurse sunt citite de pe hard disk la o anumita viteza (mai mare in cazul ssd-urilor), pe cand altele sunt citite din ram (mai rapid decat ssd-ul).

Cel mai bine, cum a zis si @nevvermind incarca sa-ti faci continutul (implicit si paginile) dinamice, o varianta de incepatori ar fi stocand datele pe care le vrei la o pagina (continut, titlu, descriere, keywords...) intr-o tabela in mysql. Atunci pt orice url ai putea cauta in tabela respectiva sa-ti returneze detaliile de mai sus.

Mai bine includ meniul in fiecare pagina...
???

nevvermind
Senior Member
Mesaje: 1264
Membru din: Mar Iun 22, 2010 3:17 pm

Re: switch....case pentru mai multe pagini

Mesajde nevvermind » Mar Aug 18, 2015 5:49 pm

3. Trivia: Nu e nevoie de DIRECTORY_SEPARATOR decat cand primesti cai de la sistem, nu cand le folosesti. Windows-ul intelege foarte bine "/". Deci folositi fw-slash cu incredere.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

CristianG
Average Member
Mesaje: 85
Membru din: Mie Oct 30, 2013 4:45 pm

Re: switch....case pentru mai multe pagini

Mesajde CristianG » Mar Aug 18, 2015 7:12 pm

@emanu31 good point !

Dupa cum inteleg se pare ca el tot nu a inteles ideea de baza ! Tot ce e iti comunicam un simplu mod de lucru asa cum am specificat si in topicul meu cat si ce ti-au explicat colegi e simplu.

1. Nu lasa o functie variabila in default nedefinita !
2. Nu rezolvi problemele cu "@"
3. Orice caz trebuie verificat inainte de a include

Daca tot nu ai inteles atunci USE PHP-MANUAL !

Respect,

dianagaby2002
PHPRomania Supporter
Mesaje: 19
Membru din: Mie Aug 05, 2015 10:09 am

Re: switch....case pentru mai multe pagini

Mesajde dianagaby2002 » Joi Aug 20, 2015 6:00 pm

Mersi. O sa incerc stocand datele de la pagini (continut, titlu, descriere, keywords...) intr-o tabela in mysql.

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6380
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Re: switch....case pentru mai multe pagini

Mesajde Birkoff » Joi Aug 20, 2015 10:10 pm

dianagaby2002 scrie:Mersi. O sa incerc stocand datele de la pagini (continut, titlu, descriere, keywords...) intr-o tabela in mysql.


nu am citit toata discutia, dar ma gandeam sa iti prezint sistemul folosit in cms-ul meu poate te ajuta sa iti dezvolti sistemul tau.

la mine cms-ul e modular, construit din module si actiuni.
exista un loader care verifica ce modul se cere si il incarca, apoi acel modul verifica ce actiune se cere si o ruleaza.
in url linurile sunt initial de forma index.php?m=nume_modul&action=nume_actiune (dar se pot rescrie ulterior din htaccess in functie de cum vrea fiecare client)

modulul, e un script php care are in partea de control un switch cu actiunile existente si se va rula doar cazul cerut in acel moment (action=ceva...)

exemple de module:
users (actiuni: lista_useri_existenti, profil_user, modificare_detalii_profil, etc)
login (actiuni: login, logout, register, lost_pass, ban_user, confirm_register etc)
content (actiuni: show_page, list_pages, add_page, edit_page, del_page etc)

Sa detaliez modulul content cazul show_page:

- se preia din url id-ul sau numele paginii (la mine e numele paginii) + limba
- se preia din bd pagina cu acel nume in limba specificata (daca nu exista afisam eroare si link la cazul list_pages de exemplu)
- se seteaza din datele primite din bd titlul, descriere, keywords, fb_image si se genereaza continutul pentru pagina

ca sistem de template, folosesc ideea din tutorialul asta http://www.tutorialeonline.net/ro/artic ... ine-simplu
in controler de fapt datele primite din bd le pasez la un array de forma $tpl['title'], $tpl['description'], $tpl['content'] etc iar in template doar pun {TITLE} {CONTENT} si se inlocuiesc cu ce am in acel array.

PS (ideile spuse aici le poti vedea in linkul din tutorialul ala, tot site-ul e construit pe sistemul explicat aici)

In bd am tabelul organizat de forma

id | title | url | keyword | description | language | author | email | content | aproved | user_id | date_added | date_modified

unde language e char(2) exemplu ro/en/it etc si specifica in ce limba e pagina respectiva
url e titlul convertit url (url_encode sau raw_url_encode ca sa nu aiba spatii sau caractere speciale)
author e numele autorului articolului (poate fi diferit de editorul care publica articolul si care e setat in user_id)
email - emailul autorului (in general nu se face public)
content - este mediumtext (text permite doar 65535 caractere si am patit sa am pagini cu texte mult mai mari) charset utf8_general_ci (charsetul asta permite diacritice din mai multe limbi, atat romana cat si alte limbi)
aproved - tinyint(1) - 0 neaprobat, 1 articol aprobat (vizibil pe site de la data specificata in date_added - care poate fi o data in viitor, la tutoriale asa faceam setam sa apara 1 articol pe zi si le aprobam cu 1 saptamana inainte de exemplu)

cam asta ar fi in mare explicatiile pentru afisarea continutului, daca ti se pare interesanta abordarea mai gasesti pe aici discutii mai vechi legate de cms (cauti prin formul cms + autor birkoff)
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

dianagaby2002
PHPRomania Supporter
Mesaje: 19
Membru din: Mie Aug 05, 2015 10:09 am

Re: switch....case pentru mai multe pagini

Mesajde dianagaby2002 » Sâm Aug 22, 2015 2:16 pm

Birkoff scrie:
dianagaby2002 scrie:Mersi. O sa incerc stocand datele de la pagini (continut, titlu, descriere, keywords...) intr-o tabela in mysql.


nu am citit toata discutia, dar ma gandeam sa iti prezint sistemul folosit in cms-ul meu poate te ajuta sa iti dezvolti sistemul tau.

Mersi ;)

clickymedia
Junior Member
Mesaje: 45
Membru din: Mie Iun 17, 2015 2:11 pm
Contact:

Re: switch....case pentru mai multe pagini

Mesajde clickymedia » Sâm Aug 22, 2015 7:58 pm

Daca faci un site mic poti face ceva de genu

header.php (header site)
footer.php (footer site)

Pagina index.php
include('header.php');
continut pagina HOME
include('footer.php');


Pagina despre-noi.php
include('header.php');
continut pagina despre noi
include('footer.php');

Pagina contact.php
include('header.php');
continut pagina contact
include('footer.php');
Recent am realizat un magazin online cu haine bebelusi ieftine si de calitate.


Înapoi la “PHP Incepători”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 67 vizitatori