Résolu PHP : organiser les pages web

Solutions (10)
Tags :
  • Php
  • Programmation
|
Bonjour,

J'utilise les pseudo-frame pour simplifier la maintenance et l'organisation de mes pages web, j'utilise le code suivant :

  1. <?php
  2.  
  3. // On définit le tableau contenant les pages autorisées
  4. // ----------------------------------------------------
  5. $pageOK = array('page1' => './page1.php',
  6.  
  7. 'page2' => './page2.php');
  8.  
  9. // On teste que le paramètre d'url existe et qu'il est bien autorisé
  10. // -----------------------------------------------------------------
  11. if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) ) {
  12. include($pageOK[$_GET['page']]); // Nous appelons le contenu central de la page
  13. } else {
  14. include('../../Erreur/404.php'); // Page par défaut quant elle n'existe pas dans le tableau
  15. }
  16.  
  17. ?>


Ensuite j'ajoute des includes pour insérer mon thème :

  1. <?php include('./entete.php') ?>
  2.  
  3.  
  4. <?php
  5.  
  6. // On définit le tableau contenant les pages autorisées
  7. // ----------------------------------------------------
  8. $pageOK = array('page1' => './page1.php',
  9.  
  10. 'page2' => './page2.php');
  11.  
  12. // On teste que le paramètre d'url existe et qu'il est bien autorisé
  13. // -----------------------------------------------------------------
  14. if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) ) {
  15. include($pageOK[$_GET['page']]); // Nous appelons le contenu central de la page
  16. } else {
  17. include('../../Erreur/404.php'); // Page par défaut quant elle n'existe pas dans le tableau
  18. }
  19.  
  20. ?>
  21.  
  22. <?php include(./footer.php') ?>


Pour l'instant pas de problème mais il y a des pages où j'utilise la fonction header(), donc si j'utilise le code ci-dessus , j'aurai une erreur puisque la fonction "header()" doit se trouver avant tous code html (mon entête et du html).

Comment je pourrai organiser mes pages web sans avoir besoin de créer plusieurs pages d'includes?
Contenus similaires
Meilleure solution
partage
, Ex-AdMiN |
Bon, rapidement, voici, ce que j'aurais fait pour améliorer ton code sans en changer foncièrement la logique voulu initialement.

j'aurais toujours laissé un paramètre $_GET['page'] cependant j'aurais vérifié par sécurité que ce dernier ne contient que des caractère de l'alphabet en minuscule ainsi que des chiffres. Cela se fait super simplement avec la fonction preg_match(). En l'occurrence le pattern est le suivant, '/^[a-z0_9]+$/' donc là j'ai au moins un caractère (sinon j'aurais eu * au lieu de +) et ce n'est que des chiffres ou des lettre minuscule. Laisser plus de caractère est un peu risqué, surtout le / et le . avec la méthode que je vais utiliser maintenant donc voilà.

Maintenant je pars du principe que j'ai un répertoire avec l'ensemble de mes partials de page. Mes morceaux de page si tu préfères. Tu vas stocker ce répertoire dans un fichier de configuration par ex ou bien tu peux dire que ce répertoire est qqpart en fonction de là ou du est. ex.

  1. $dir = dirname(__FILE__).'/../pages


La je reprend ce que j'avais expliqué il y a qqjours avec le répertoire include différent du répertoire www. Je crois que c'était à toi que j'expliquais ça sur un problème de .htaccess non ? Bref l'intéret est d'avoir un $dir qqpart.

Maintenant je sais que dans $page provenant de $_GET['page'] j'ai une chaine alphanumérique parfaite pour faire un nom de fichier si je rajoutais un '.php' par exemple. Faisons !

Pour rappel preg_match va renvoyer 1 si il trouve soit vrai. Donc on doit renvoyer une erreur si il renvois 0 si il ne trouve pas.

  1. $dir = dirname(__FILE__).'/../pages;
  2. $page = $_GET['page'];
  3.  
  4. if(!preg_match('/^[a-z0_9]+$/') {
  5. // hum bizarre ce qu'on m'a envoyé là ...
  6. // je retourne une 404
  7. include $dir.'/error404.php';
  8. exit; // on vérifie bien qu'on ne va pas plus loin dans l'exécution surtout.
  9. }
  10.  
  11. //on va déduire le nom du fichier à partir de $page
  12. $filename = $page.'.php';


Maintenant j'ai un répetoire et un nom de fichier, bah j'ai plus qu'à regarder si le fichier existe non ? oui :) 

  1. $dir = dirname(__FILE__).'/../pages;
  2. $page = $_GET['page'];
  3.  
  4. if(!preg_match('/^[a-z0_9]+$/') {
  5. // hum bizarre ce qu'on m'a envoyé là ...
  6. // je retourne une 404
  7. include $dir.'/error404.php';
  8. exit; // on vérifie bien qu'on ne va pas plus loin dans l'exécution surtout.
  9. }
  10.  
  11. //on va déduire le nom du fichier à partir de $page
  12. $filename = $page.'.php';
  13. $file = $dir.'/'.$filename;
  14. if(file_exist($file)) {
  15. include $file;
  16. } else {
  17. // sinon on demand eune page qui n'existe pas 404.
  18. include $dir.'/error404.php';
  19. }



Maintenant pour ajouter des pages tu n'as plus qu'à rajouter des fichiers avec un nom correct dans le répertoire qui va bien ;)  Tu n'as plus à toucher à la logique de ton code et rajouter des infos dans des tableaux etc.

Alors il y a plein de limite, mais bon, c'est du code à l'ancienne on dira.
  • Commenter cette solution |
Score
0
òh
òi
, Ex-AdMiN |
A la rigueur.

Remplace l'expression régulière par

  1. preg_match('/^[a-z0_9]+[a-z0_9-]+$/',$search)


Comme ça tu acceptes les caractère alphanumérique au début mais pas le tiret puis le tiret à partir du second caractère.

Citation :

simon@fanny:~$ phpsh
Starting php
PHP Warning: Module 'xdebug' already loaded in Unknown on line 0
type 'h' or 'help' to see instructions & features
php> var_dump(preg_match('/^[a-z0_9-]+[a-z0_9]+$/','toto'));
int(1)

php> var_dump(preg_match('/^[a-z0_9-]+[a-z0_9]+$/','-toto'));
int(1)

php> var_dump(preg_match('/^[a-z0_9]+[a-z0_9-]+$/','-toto'));
int(0)

php> var_dump(preg_match('/^[a-z0_9]+[a-z0_9-]+$/','t-oto'));
int(1)



On remarque bien que le 3ième test est faux. Ensuite tu remplaces bien évidement le caractère - par / avec str_replace().


NB :
Pour ce qui se demande quel outil m'a permis de faire ça dans un terminal, il s'agit de phpsh de facebook.
  • Commenter cette réponse |
Score
0
òh
òi
|
Ok,

merci encore d'avoir pris du temps pour moi, je vais garder ta solution pour avoir tous de même un minimum de sécurité.
  • Commenter cette réponse |
Score
0
òh
òi
, Ex-AdMiN |
Dans ce cas j'exploserais avec un explode sur le / puis je ferais une vérification récursive dans l'arborescence. Car fait attention si tu acceptes le / tu ouvres potentiellement un gros prob de sécu.
  • Commenter cette réponse |
Score
0
òh
òi
|
Ok, merci je vais regardé ça, j'ai eu juste un petit problème avec la fonction "preg_match()", il faut mettre la variable, sinon il renvoi une erreur :

  1. if(!preg_match('/^[a-z0_9]+$/', $page)) {



Par contre l'inconvénient c'est que je ne peux pas mettre plusieurs direction, par exemple :

  1. $dir = dirname(__FILE__).'/../pages;
  2. $dir = dirname(__FILE__).'/../pages/xxxxx;
  3. $dir = dirname(__FILE__).'/../pages/yyyy;


Donc dans chaque dossier je doit créer une page avec ce script.
  • Commenter cette réponse |
Score
0
òh
òi
|
D'accord, merci.
Car j'aimerai vraiment organiser correctement mes pages web, car pour l'instant je faisais des liens basique, et surtout quand je modifiais un paramètre je me répété X fois...
  • Commenter cette réponse |
Score
0
òh
òi
, Ex-AdMiN |
Mon exemple ne reprend absolument pas ton code au dessus mais est un exemple purement générique de, je met la logique au dessus, l'accès aux données puis j'affiche pour éviter les problèmes que tu as.

Je vais te faire un exemple plus spécifique à ton problème avant ce soir.
  • Commenter cette réponse |
Score
0
òh
òi
|
Merci de ta réponse j'ai quelque questions :

  1. <?php
  2. $id = $_GET['id'];
  3. if(!is_numeric($id)) {
  4. // faire une 404
  5. renvoyer un include spécifique par ex
  6. }


Ici si je comprend bien, si l'id n'est pas une valeur numérique on le renvoi vers une erreur, si l'id entrer n'existe pas l'utilisateur a quand même accès à la suite;
je créer donc une table avec le contenu de mes pages associé à un id et je fais une requête pour vérifier si la page existe?
Ensuite mes pages sont sous la forme : test.php?page=page1, donc si l'id 1 correspond dans mon tableau à : page1, il faudrai également que dans le script je définis l'id qui est égale à page1.

Ce qui fais beaucoup de chose pour vérifier la page (si je ne suis pas à coté de la plaque...).

-------

  1. $sql = "SELECT truc FROM matable WHERE id=$id";
  2. $result = mysql_query($sql);
  3. $data = mysql_fetch_array($result);


Donc ici dans ma table contiendrai tous mes pages avec leur contenu (entete,footer,corps...)?
Ça me parai étrange.
  • Commenter cette réponse |
Score
0
òh
òi
, Ex-AdMiN |
Tu arrives au limite du PHP en mode purement itératif en mélangeant accès au donnée, logique métier et affichage.

Tu sembles vraiment faire pas mal de PHP, je te conseil vivement de te renseigner sur les framework PHP comme Symfony. Ca permet vraiment de mieux coder en beaucoup plus pro. Ok, il faut réapprendre beaucoup de chose mais ensuite tu développes beaucoup plus vite et mieux.

En l'occurrence quand je dis séparer 3 choses, il s'agit de respecter le design pattern MVC.

Enfin pour en revenir à ton problème. Ta solution est très mauvaise car tu vas faire faire 2 requêtes http à ton visiteurs. En fait il faut que tu sépares ta logique en début puis ensuite, une fois que tu as tes données tu les mettes en forme. Exemple :

  1. <?php
  2. $id = $_GET['id'];
  3. if(!is_numeric($id)) {
  4. // faire une 404
  5. renvoyer un include spécifique par ex
  6. }
  7.  
  8. // ensuite accès au donnée
  9. $sql = "SELECT truc FROM matable WHERE id=$id";
  10. $result = mysql_query($sql);
  11. $data = mysql_fetch_array($result);
  12.  
  13. /* maintenant que j'ai l'ensemble des donnée n"cessaire pour faire ma page j'affiche ma page bref, je commence les echo ou je peux fermer ?> Ainsi avant tu pouvais bien envoyer des fonction header, cookie etc car l'entete n'était pas envoyé. En oublie trop souvent la composante en-ete http qui fait vraiment partie d'une page web. */
  • Commenter cette réponse |
Score
0
òh
òi
|
J'ai trouvé une solution mais je ne pense pas quelle soit judicieuse j'attends vos conseils pour m'éclairer , à la place de mettre une simple include entête je met une condition :

  1. <?php
  2. if ($_GET['page'] == "page1") {
  3. header ("Refresh: 3;URL=./pageX.php");
  4. include('./entete.php');
  5. }
  6. else { include('./entete.php');}
  7. ?>


Ce code me permet de gérer mes pages sur une seul.
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS