Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/02/2012, 19h37   #1
Invité de passage
 
Inscription : octobre 2010
Messages : 24
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France

Informations forums :
Inscription : octobre 2010
Messages : 24
Points : 0
Points : 0
Par défaut Navigation site PHP

Bonjour, j'aurais besoin d'éclaircissements à propos de la navigation que je souhaite réaliser sur mon site en utilisant les includes.
J'ai une page d'accueil index.php sur laquelle tout le site s'appuie mais je ne sais pas si c'est la bonne solution...:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
	<head>
		<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
 
		<style type="text/css">
			@import "CSS/design_index.css";
 
		</style>
 
		<link rel="shortcut icon" href="images/ico1.ico" /><!-- icône à choisir-->
 
		<title>
			Site NERD
		</title>
	</head>
 
<body>
	<!--<div id="haut_de_page">-->
 
	<?php include("./pages/en_tete.php"); ?>
	<!--</div>-->
 
	<div id="corps">
	<?php
		/*echo $_GET;*/
		if (empty($_GET['page']))	{
			include('pages/accueil.php');
		}	else	{
			if (file_exists($_GET['page'].'.php'))	{
				include($_GET['page'].'.php');
				}	else	{
				include('pages/erreur.php');
			}
		}
 
	?>
	</div>
 
	<?php include("pages/pied_de_page.php"); ?>
 
</body>
 
 
</html>
et la page entete.php qui va chercher le "corps" des pages:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div id= "haut_de_page">
	<a href="index.php?page=pages/accueil" title="Accueil"> <h1>µMind Localisation</h1></a>	
		<ul id="menuhdp">
			<li><a href="index.php?page=pages/page1" title="cible 1">lien 1</a>
				<ul class="sous-menu">
				<li><a href="index.php?page=pages/page11">sous-lien 1.1</a></li>
				<li><a href="index.php?page=pages/page12">sous-lien 1.2</a></li>
				<li><a href="index.php?page=pages/page13">sous-lien 1.3</a></li>
				</ul>
			</li>
			<li><a href="index.php?page=pages/page2" title="cible 2">lien 2</a>
				<ul class="sous-menu">
				<li><a href="index.php?page=pages/page21">sous-lien 2.1</a></li>
				<li><a href="index.php?page=pages/page22">sous-lien 2.2</a></li>
				<li><a href="index.php?page=pages/page23">sous-lien 2.3</a></li>
				</ul>		
			</li>, etc...
Seulement, le style sera le même pour tout le site et je voudrais qu'il change selon le lien choisit; j'ai réussi à le faire en incluant une page entière dans le "div corps" mais ce n'est pas très propre puisque le style est alors chargé deux fois.
Je me demande alors s'il ne serait pas judicieux de recopier la page index sur tout le site et de changer à chaque fois le corps mais je ne pourrais alors plus utiliser la fonction $_GET qui me renvoie l'adresse de la page à afficher, pourrais-je avoir des avis?
boy30 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 20h49   #2
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 817
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 817
Points : 1 539
Points : 1 539
Pour ce que tu veux faire tu devrais te pencher vers du MVC (Modèle Vue Contrôleur) ce serait plus facile à manipuler.

Même si on ne part pas sur un développement POO (la majorité des cours et tutoriaux ne présente cela qu'en orienté objet) il faut savoir qu'on peut très bien implémenter du MVC sans cela. Il suffit de faire le traitement avant tout affichage.
Ainsi avant même d'afficher du HTML tu auras déjà toutes les informations.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 07h09   #3
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
+1 pour ci-dessus.

Cela fait partie d'une des erreurs que font ceux qui débutent.
En faite, le déroulement du code Php est effectué selon le déroulement de celui du Html, et c'est là grosse erreur.

Il n'y a pas à tenir compte du déroulement du code Html, faite en 1er tout le Php, et en dernier on génère le code Html.

Il faut vraiment comprendre que le code Php qui lui est interprété coté serveur sert en partie à générer du code Html, puis ce code Html (uniquement le code Html) sera renvoyé via le réseau vers le post client (navigateur), et ce ne sera qu'à partir de cet instant (donc bien après) que ce code Html sera interprété par ce navigateur.


Toujours est il que le fait d'avoir effectué le code Php qui s'occupe à vérifier et inclure l'existence du fichier demandé (comme page10.php) après l'inclusion de l'entête, et bien on est coincé.

Faire ainsi par exemple devient possible :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
// Partie traitements
$page = 'index';
//
if (isset($_GET[page]) && !empty($_GET['page'])) {
    if (file_exists($_GET['page'].'.php')) {
	$page = $_GET['page'];
    }
    else {
        $page = 'erreur';
    }
}
 
// Partie interface
?>
<html>
<head>
    <title>UN TITRE</title>
    <link rel="stylesheet" type="text/css" href="/css/<?php echo $page; ?>.css" />
</head>
<body>
 
    <?php include('./pages/en_tete.php'); ?>
    <div id="corps">
    <?php include('./pages/'.$page.'.php'); ?>
    </div>
    <?php include('pages/pied_de_page.php'); ?>
 
</body>
</html>
Maintenant on a la possibilité d'exploiter cette variable $page à n'importe quel moment dans la partie Html, comme dans l'exemple ci-dessus pour l'import du Css.

Encore que dans cet exemple, du fait d'inclure à cet endroit la page demandée les traitements seront exécuté en plein corps de la page Html, ce qui peut être à nouveau problématique.
On peu améliorer cela en procédant par exemple comme ceci :
page10.php
Code :
1
2
3
<?php
$contenu_corps = 'Il était une fois ...';
?>
index.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
// Partie traitements
$page = 'index';
//
if (isset($_GET[page]) && !empty($_GET['page'])) {
    if (file_exists($_GET['page'].'.php')) {
	$page = $_GET['page'];
    }
    else {
        $page = 'erreur';
    }
}
//
include('./pages/'.$page.'.php');
 
// Partie interface
?>
<html>
<head>
    <title>UN TITRE</title>
    <link rel="stylesheet" type="text/css" href="/css/<?php echo $page; ?>.css" />
</head>
<body>
 
    <?php include('./pages/en_tete.php'); ?>
    <div id="corps">
    <?php echo $contenu_corps; ?>
    </div>
    <?php include('pages/pied_de_page.php'); ?>
 
</body>
</html>
Grosso modo, on construit le corps de cette page en stockant le contenu dans une variable, et en dernier on génère ce contenu.
L'exécution du code se faisant avant le moindre renvoie de contenu (avant le doctype, html, etc ...).

En résumé, la page index.php ferait office de FrontController, et chaque page (page1, page2, etc ...) de controller.
entete.php, pied_de_page.php sont des Vues.
Reste donc à séparer les Requêtes SQL pour s'approcher d'une structure MVC.


Citation:
mais je ne pourrais alors plus utiliser la fonction $_GET qui me renvoie l'adresse de la page à afficher, pourrais-je avoir des avis?
Si tu pourras.
$_GET (qui n'est pas une fonction) est un tableau superglobal, ce qui veut dire que tout ce qu'il contient est disponible dès la toute 1ère ligne de code de la page jusqu'à la dernière, y compris visible dans les fonctions et classes.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 15h22   #4
Membre expérimenté
 
Avatar de redoran
 
Homme
Developpeur- Amateur
Inscription : juin 2010
Messages : 989
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 40
Localisation : Algérie

Informations professionnelles :
Activité : Developpeur- Amateur
Secteur : Santé

Informations forums :
Inscription : juin 2010
Messages : 989
Points : 581
Points : 581
Envoyer un message via Skype™ à redoran
Re ;
Citation:
....if (empty($_GET['page'])).....

là avec $_Get sa pose pas un problème de sécurité parce que tous est affiché dans la barre bien sur si je me trompe pas!!!!
redoran est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 18h27   #5
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 817
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 817
Points : 1 539
Points : 1 539
Tant que tu gères un array contenant la liste des scripts autorisés cela ne pose aucun souci que ça soit visible ou non dans l'url.

Et si le problème est que les visiteurs auront l'url pour accéder directement au fichier il suffit de jouer sur une constante :
Code php :
if( !defined('MA_CONSTANTE') ) exit();
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2012, 19h13   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Citation:
Envoyé par redoran
Là avec $_Get sa pose pas un problème de sécurité
Oui et non, disons qu'il faut éviter la paranoïa sur les données en GET.
Tu omets tout de même qu'il y a ceci :
Code :
if (file_exists($_GET['page'].'.php'))
Il faut bien au départ qu'une demande soit faite de la part de l'internaute, il faut donc que la donnée soit clairement lisible.

Si on a une URL comme :
-http://www.domaine.com/contact.php
ou encore -http://www.domaine.com/partenaires.php
domaine.com, contact ou partenaires sont bien en clair, non ? donc quelque part en GET.

Si on regarde par exemple ce forum pour ce topic, le lien est :
-http://www.developpez.net/forums/d1182536/php/langage/debuter/navigation-site-php/
Ce qui peu donner quelque chose comme : (dû à la réécriture)
-http://www.developpez.net?forums=d1182536&php=langage&debuter=navigation-site-php
Donc tout passe en GET.
Le but étant que les topics puissent être référencés dans des moteurs de recherches.

Si on ne fait pas ça on ne sera jamais "visible" nulle part.

Il faut juste vérifier que les contenus demandés soient conforment, comme par exemple l'existence d'une page.
Si toutes les pages sont stockées dans un répertoire bien précis (comme "pages"), et bien si quelqu'un demande une page inexistante, alors on rejette ou on fournis une page par défaut.
Son principe repose la dessus, ça me semble une solution valable.

Si dans ce même répertoire "pages" il y a certaines contenant des données sensibles/confidentielles, là il peu avoir un problème.
Mais on ne sait pas.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2012, 19h10   #7
Invité de passage
 
Inscription : octobre 2010
Messages : 24
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France

Informations forums :
Inscription : octobre 2010
Messages : 24
Points : 0
Points : 0
Euh, désolé de relancer le sujet mais je ne m'y suis pas attelé depuis...
J'ai donc choisi la réponse de RunCodePhp pour naviguer sur le site et j'ai des questions par rapport aux réponses que vous m'avez expliqué mais j'ai maintenant un autre souci mineur que je n'avais pas avant avec la fonction file_exist; il ne trouve pas la page que je lui envoieen $_GET mais il trouve quand même la page erreur, ce doit être le file_exist qui ne cherche pas au bon endroit mais je n'arrive pas à lui "dire" où chercher:
J'ai ceci au début de ma page index.php et mes pages sont dans /pages par rapport à index
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
<?php
/*echo $_GET;*/
/*$page = 'index';*/
 
	if (empty($_GET['page']))	{
		$page = 'accueil';
	}	else	{
		if (file_exists('/pages/'$_GET['page'].'.php'))	{
			$page = $_GET['page'];
		}	else	{
			echo 'le file existe pas!!!';
			echo $_GET['page'];
			$page = 'erreur';
		}
	}
?>
Cette syntaxe me donne une erreur division par zéro et ne trouve pas la page autremet si je mets seulement $_GET['page'] !
boy30 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2012, 20h21   #8
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 817
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 817
Points : 1 539
Points : 1 539
Code :
if (file_exists('/pages/'$_GET['page'].'.php'))	{
Il te manque un opérateur de concaténation et là il recherche dans le dossier racine à cause du premier slash.
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h06.


 
 
 
 
Partenaires

Hébergement Web