8741 sujets

Développement web côté serveur, CMS

Pages :
Bonsoir.
Je souhaiterai creer un site web comprenant plusieurs "frame" en me servant de la fonction include décrite ici

Le code obtenu est le suivant :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Accueil</title>
<style type="text/css">
<!--
#Head {
	position:absolute;
	left:0px;
	top:0px;
	width:1043px;
	height:170px;
	z-index:1;
	background-color: #0099CC;
}
#MenuGauche {
	position:absolute;
	left:12px;
	top:170px;
	width:167px;
	height:456px;
	z-index:2;
	visibility: visible;
	overflow: auto;
	background-color: #999999;
}
#Centre {
	position:absolute;
	left:182px;
	top:170px;
	width:861px;
	height:452px;
	z-index:3;
	overflow: auto;
	visibility: visible;
	background-color: #999999;
}
-->
</style>
</head>

<body>
<div id="Head">
<?php 
if (!isset($_GET['page'])) $page= 'Accueil'; else $page= $_GET['page']; 
 switch($page)
{
case 'accueil': include ('up.htm');break;
case 'IPA': include ('up.htm');break;
case 'PGD':include ('up.htm');break;
case 'Sociologie':include ('up.htm');break;
case 'TQ':include ('up.htm');break;
} 
?>
</div>


<div id="MenuGauche">

<?php 
if (!isset($_GET['page'])) $page= 'Accueil'; else $page= $_GET['page']; 
 switch($page)
{
case 'accueil': include ('left_Accueil.htm');break;
case 'IPA': include ('/Cours/left_IPA.htm');break;
case 'PGD':include ('/Cours/left_PGD.htm');break;
case 'Sociologie':include ('/Cours/left_Sociologie.htm');break;
case 'TQ':include ('/Cours/left_Techniques_quantitatives.htm');break;
} 
?>
</div>


<div id="Centre">
<?php 
if (!isset($_GET['page'])) $page= 'Accueil'; else $page= $_GET['page']; 
 switch($page)
{
case 'accueil': include ('Accueil.htm');break;
case 'IPA': include ('/Cours/IPA.htm');break;
case 'PGD':include ('/Cours/PGD.htm');break;
case 'Sociologie':include ('/Cours/Sociologie.htm');break;
case 'TQ':include ('/Cours/Techniques_quantitatives.htm');break;
} 
?>
</div>
</body>
</html>


La page web se situe ici (Je sais, les div ne sont pas alignés). Probleme : rien ne s'affiche dans les div. Quelqu'un pourrait il m'indiquer ou est ce que j'ai foiré le truc ? Merci d'avance Smiley smile
Salut.

Il me semble qu'il manque les deux points dans ton if :
if (condition) [b][#red]:[/#][/b] action si vrai ; else : action si faux ; endif;
Peut-être qu'il s'agit d'un problème de chemin et que php ne trouve donc pas les fichiers à inclure. Remplace les include par des require pour contrôler ça.

Sinon, vu que tu utilises un switch, tu peux te passer de tes if en ajoutant un default:


<?php 

 switch($page)
{
	case 'IPA': 
		include ('up.htm');
	break;

	case 'PGD':
		include ('up.htm');
	break;

	case 'Sociologie':
		include ('up.htm');
	break;

	case 'TQ':
		include ('up.htm');
	break;

	case 'accueil': 
	default:
		include ('up.htm');
	break;
} 

?>

Modifié par Vikchill (06 Nov 2006 - 10:03)
J'aurais plutôt tendance à coder la ligne comme suit:

(!isset($_GET['page'])) ? $page='Accueil' : $page=$_GET['page'];

C'est l'écriture raccourcie
On ne met pas de if, juste la condition, le ? annonce l'action à faire si la condition est remplie et le : est le else.
Et effectivement rajouter un paramètre default en bas du switch au cas où la personne aurait tapé n'importe quoi comme variable de page dans l'URL.
Ce que je voulais dire, c'est que le test d'existence de la variable passée en GET n'a plus beaucoup d'importance si on mets un default dans le switch.
Et dans le cas ou la variable $_GET['page'] n'existe pas ?
Je n'ai pas dit vide, mais inexistante Smiley smile
L'utilisation de la variable $page supposerait que register_global soit sur On dans php.ini, ce qui est fortement déconseillé pour des raisons de sécurité.
Et en plus ça rend le codage plus propre parce qu'on sait d'où sort la variable Smiley cligne
Dans tous les autres cas il faut passer le contenu de $_GET['page'] à la main dans $page.
Du moment ou register_global est sur Off, le script retourne une erreur signalant que la variable n'est pas définie.

Au passage, pour ne pas me casser la tête avec des boucle if pour toutes mes variables GET et POST, je passe par une boucle.

foreach($_GET as $cle=>$valeur)
{
$$cle=$valeur;
}

$_GET['page']='accueil' devient $page='accueil'.
En rajoutant des fonctions pour épurer les paramètres, genre $$cle=strip_tags($valeur) etc etc...
Là je récupère des $page directement sans passer par des if else... le tout exploitable dans un switch rapidement.
Modifié par BruceFeuillette (06 Nov 2006 - 16:18)
BruceFeuillette a écrit :
Et dans le cas ou la variable $_GET['page'] n'existe pas ?



Je suis à côté de la plaque, ou dans ce cas on entre simplement dans le default? Smiley sweatdrop

[Edit] Pour être plus clair, on fait le test du switch sur la variable en $_GET, pas sur $page, je pense que le quiproquo vient peut-être de là.
Modifié par Vikchill (06 Nov 2006 - 16:53)
Heuuu...
Je viens de tester, on entre dans default.
Normalement c'est sensé mettre un message d'erreur parce que $page n'est pas initialisé Smiley mur
Comprend plus... Smiley sweatdrop

C'est pour ça que je fais un test avant, pour ne pas avoir de message d'erreur.
Modifié par BruceFeuillette (06 Nov 2006 - 16:57)
Ouaip Smiley smile
Visiblement c'était un "bug", ce message d'erreur est ignoré dans les dernières versions de PHP5
C'était Notice: Undefined index... blablabla.
BruceFeuillette a écrit :
foreach($_GET as $cle=>$valeur)

{

$$cle=$valeur;

}

Voilà ce que j'appelle "un code de goret"
Le genre de truc qu'il faut absolument éviter. Smiley ohwell
Les variables dynamiques c'est de la daube inmaintenable. Smiley fache

Même chose pour le switch()

Un array et rien d'autre Smiley cligne


EDIT : Une erreur de notice, c'est pas un bug !
Modifié par Bison (06 Nov 2006 - 17:28)
Bonsoir.
Oserais-je demander à Bison quelle solution il apporte au problême ?
Le code proposé plus haut m'avait paru futé (le premier, je veux dire), mais je suis novice; Si une "array" peut remplacer plus simplement et solidement le "switch / case"… J'aimerai bien une petite démonstration de code. Et celà résoudrai peut_être la question ?
Bonjour.
Voilà une solution que j'imagine dans l'esprit de Bison.

Codé comme ça, il ne peut y avoir aucun message de type NOTICE étant donné que l'existence des variables GET et ARRAY est testé avec "isset()".

L'usage d'opérateurs ternaire (?:) garantit l'initialisation effective des variables $action et $cible.

Enfin, cet exemple introduit une nuance (optionnelle) entre page par défaut et page erronée (il peut être pratique en développement de distinguer les deux notions).

	$action = (isset($_GET["page"])) ? $_GET["page"] : "default";

	$pages = array
	(
		"page1"  => "./test1.php",
		"page2" => "./test2.php",
		"default" => "./index.php"
	);

	$cible = isset($pages[$action]) ? $pages[$action] : "./warning.php";
	require $cible;
<?php
$mespages = array(

	'page1'  => 'test1.php',

	'page2' => 'test2.php',

	'page3' => 'test3.php'

	);

if (isset($_GET['page']) && array_key_exists($_GET['page'],$mespages))
{
include $mespages[$_GET['page']];
}
else
include 'index.php';
}


Travailler avec des ' plutôt que des "
Un tableau est bien plus efficace qu'un switch (dans ce cas)

De plus, on peut améliorer en vérifiant par exemple ce que contient $_GET['page'] et/ou en prefixant les valeurs de l'array.
Modifié par Bison (08 Nov 2006 - 09:16)
Bison a écrit :

Voilà ce que j'appelle "un code de goret"
Le genre de truc qu'il faut absolument éviter. Smiley ohwell


Je tiens à préciser que je n'utilise ce code que quand tout le script a été codé en s'appuyant sur un register_globals activé.
Bah oui, je n'ai pas spécialement le temps de reprendre 700 lignes de code pour retrouver toutes les variables issues de formulaire.

Pour le reste les switch/case sont plus lisible pour moi.
Avec register_global à "on", il y a un problème de pérénnité du script.

La tendance est de progressivement pousser les hébergeurs à commuter sur off, pour des problèmes de sécurité.
L'utilisation de $_SESSION, $_GET et $_POST doit permettre de se passer de register_global = "ON".
Il y a fort à parier que les futures version de php n'autorisent plus "ON".
Alors, plutôt que d'être pris au dépourvu, il est sage de modifier le code tant qu'il est temps.
Modifié par GeorgesM (08 Nov 2006 - 09:58)
BruceFeuillette a écrit :
Je tiens à préciser que je n'utilise ce code que quand tout le script a été codé en s'appuyant sur un register_globals activé.
Bah oui, je n'ai pas spécialement le temps de reprendre 700 lignes de code pour retrouver toutes les variables issues de formulaire.

Pour le reste les switch/case sont plus lisible pour moi.

En deux lignes, tu as mis le doigt sur tout ce qu'il ne faut pas faire en PHP. Smiley ohwell
Coder en tenant compte du register_globals à ON c'est du code à la php3, sans compter la porte ouverte aux failles de sécu...
Je te signales qu'on en est à PHP 5.2.0 Smiley smile

Enfin, bref c'est ton code... du moins je l'espère. Smiley langue
Dans le cas contraire je n'aimerais pas être ton client. Smiley ohwell
GeorgesM a écrit :
Il y a fort à parier que les futures version de php n'autorisent plus "ON".

C'est officiel pour la version 6, register_globals disparaît totalement Smiley smile
En passant, les arrays sont peut-être plus performants qu'un switch, mais c'est moins lisible pour le débutant. Et pour 5 ou 6 valeurs à tester, l'impact doit rester microscopique pour le serveur, non ?
Pages :