Varialbe indéfinie suite à paramètre transmise via url php

Eléphanteau du PHP | 15 Messages

16 juil. 2011, 20:29

Bonjour,

J'essaie de mettre sur pied un blog personnel selon la méthode Modèle vue contrôle. Quand j'accède en local sur ma page d'accueil j'ai mes bilets qui s'affichent correctement. Mais quand dans ma page d'acceuil je ciique sur :
 <a href="vue/commentaire/index.php?billet=<?php echo $billet['id_billet'];?>">
pour accéder à ma page avec un article choisi et ses commentaires easyphp tout en affichant ma page n'affiche pas mon billet et dit :

Notice: Undefined variable: billets in C:\Program Files\EasyPHP-5.3.6.0\www\BLOG\vue\commentaire\index.php on line 35

Warning: Invalid argument supplied for foreach() in C:\Program Files\EasyPHP-5.3.6.0\www\BLOG\vue\commentaire\index.php on line 35


Je joins ICI MES SCRIPTS DANS MON MVC au cas où une âme charitable voudrait bien m'aider car depuis quatre jours je tourne en rond. Merci pour votre aide.

Mammouth du PHP | 2278 Messages

16 juil. 2011, 20:57

un premier test, si j'ai bien compris l'architecture, serait d'ajouter dans la fonction get_billets:
print_r ($billets); // test
die(); // test
return $billets;
On saurait ainsi si les billets en question ont été lus correctement
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 15 Messages

18 juil. 2011, 16:05

Bonsoir Sirakawa,

J'ai testé mais ça ne ne change rien au problème. Merci quand même.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 juil. 2011, 16:15

Notice: Undefined variable: billets in C:\Program Files\EasyPHP-5.3.6.0\www\BLOG\vue\commentaire\index.php on line 35

cela veux dire qu'a la ligne 35 du fichier BLOG\vue\commentaire\index.php tu utilise la variable $billets alors qu'elle n'existe pas.

si cette ligne correspond au ce que tu a mis, on ne peux pas plus t'aider, $billets existe pas faut voir ton code complet pour que l'on sache ce qui ne va pas (utilise la balise php pour l'afficher :) ).

si tu tente d'utiliser la valeur que tu passe dans l'url (le billet=truc), ce que je pense, tu a cette erreur car tu utiliser $billets au lieu de $_GET['billet'] !

Toutes les valeurs passées par l'url sont dans le tableau $_GEt, l'auto déclaration des variables est une méthode obsolète de fonctionnement ;)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 15 Messages

18 juil. 2011, 16:59

Bonjour Moogli je rappelle mon problème et mets directement les scripts sur le forum,

Dans le cadre de la structuration d'un blog j'emploie la méthode Modèle Vue Contrôle où une page accueil communique avec une page commentaire

J'ai donc à ma racine deux contrôleurs globaux ctraccueil.php et ctrcommenaire.php pour chacune de mes pages et 3 répertoires principaux avec des sous répertoires contenant des fichiers comme suit ( je passe sur le css etc qui ne sauraient avoir d'incidences sur le bon fonctionnement du site):

Modèle/
/accueil/get_billets.php + connexion_sql.php
/commentaire/get_billets.php + connexion_sql.php

Vue/
/accueil/index.php
/commentaire/index.php

Contrôleur/
/accueil/index.php
/commentaire/index.php

Lorsque je clique à ma racine en local avec easyphp sur ctraccueil.php j'accéde à ma page d'accueil avec la liste de mes articles, la date, résumé etc... ( donc ici aucun problème ).

Mais lorsque je vais sur la page commentaire via le lien "commentaire" se trouvant sur ma page d'accueil, les billets ne s'affichent pas et l'erreur suivante se présente :

Notice: Undefined variable: billets in C:\Program Files\EasyPHP-5.3.6.0\www\BLOG\vue\commentaire\index.php on line 36

Warning: Invalid argument supplied for foreach() in C:\Program Files\EasyPHP-5.3.6.0\www\BLOG\vue\commentaire\index.php on line 36


Apparemment le foreach semble aussi causer problème lorsque je passe de mon accueil à mon commentaire alors même que ce foreach ne cause aucun problème à l'ouverture de ma page d'accueil puisqu'il figure dans le script mais je ne sais comment y remédier d'autant plus que voulant garder mes scripts selon cette forme. Si j'enlève foreach et suivant dans ma page d'accueil c'est ce message me signalant que la variable $billet n'existe pas ou est indéfinie :

Notice: Undefined variable: billet in C:\Program Files\EasyPHP-5.3.6.0\www\BLOG\vue\commentaire\index.php on line 41



Notice: Undefined variable: billet in C:\Program Files\EasyPHP-5.3.6.0\www\BLOG\vue\commentaire\index.php on line 45
le
Notice: Undefined variable: billet in C:\Program Files\EasyPHP-5.3.6.0\www\BLOG\vue\commentaire\index.php on line 46



Notice: Undefined variable: billet in C:\Program Files\EasyPHP-5.3.6.0\www\BLOG\vue\commentaire\index.php on line 53



J'ai testé le script de façon intuitive c'est à dire sans tenir compte du mvc et ça marche correctement. Toutefois j'aimerai qu'il soit en MVC.

Voilà pourquoi je demande si quelqu'un maitrisant le MVC pourrait me venir en aide en tenant compte de mes scripts qui fonctionnent mis a part ce détail. Je reporte ci-dessous chacun des scripts. Merci pour votre aide. J'ai bien mis l'array dans commentaire/get_billet.php.

contrôleurs globaux

ctraccueil
 
 <?php
include_once('modele/accueil/connexion_sql.php');
if(!isset($_GET['section']) OR  $_GET['section']=='index')
{
include_once('controleur/accueil/index.php');

}
?> 
ctrcommentaire
<?php
include_once('modele/accueil/connexion_sql.php');
if(!isset($_GET['section']) OR  $_GET['section']=='index')
{
include_once('controleur/accueil/index.php');

}
?> 
Modèle/
/accueil/get_billets.php
<?php
function get_billets($offset,$limit)
{
global $bdd;
$offset=(int)$offset;
$limit=(int)$limit;

$req=$bdd->prepare('SELECT id_billet, image, titre, contenu, auteur, categorie, resume, DATE_FORMAT(date_de_creation,\'%d/%m/%Y à %Hh%imin%ss\') AS
date_de_creation_fr FROM billets
ORDER BY date_de_creation DESC LIMIT :offset,:limit');
$req->bindParam(':offset',$offset, PDO::PARAM_INT);
$req->bindParam(':limit',$limit,PDO::PARAM_INT);
$req->execute();
$billets=$req->fetchAll();

return $billets;
}
?> 
/commentaire/get_billets.php
<?php

function get_billets($offset,$limit)
{
global $bdd;
$offset=(int)$offset;
$limit=(int)$limit;

$req=$bdd->prepare('SELECT id_billet, image, titre, contenu, auteur, categorie, resume, DATE_FORMAT(date_de_creation,\'%d/%m/%Y à %Hh%imin%ss\') AS
date_de_creation_fr FROM billets WHERE id=?');


$req->bindParam(':offset',$offset, PDO::PARAM_INT);
$req->bindParam(':limit',$limit,PDO::PARAM_INT);
$req->execute(array($_GET['billets']));//TABLEAU concerné
$billets=$req->fetchAll();

return $billets;
}
?> 

Contrôleur/
accueil/index.php // c'est le même code pour le commentaire/index.php sauf que $billet=get-billets je ne sais pas trop ce que je dois y mettre si ce n'est le chiffre 1 ?!!!
 <?php
//on demande les cinq derniers billets(modèle)
include_once('modele/accueil/get_billets.php');

$billets = get_billets(0,5);

//On effectue du traitement sur les données (contrôleur)
//Ici on doit surtout sécuriser l'affichage
foreach($billets as $cle=>$billet)

{
	
	$billets[$cle]['titre']=htmlspecialchars($billet['titre']);
	$billets[$cle]['contenu']=nl2br(htmlspecialchars($billet['contenu']));
	$billets[$cle]['auteur']=htmlspecialchars($billet['auteur']);
	$billets[$cle]['date_de_creation_fr']=($billet['date_de_creation_fr']);
	$billets[$cle]['categorie']=htmlspecialchars($billet['categorie']);
	$billets[$cle]['resume']=nl2br(htmlspecialchars($billet['resume']));
	
}


//On affiche la page (vue)
include_once('vue/accueil/index.php');
?>
 
Vue/
accueil/index.php
[<!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>ACCEUIL</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1"/>
<link href="vue/blog/style.css" rel="stylesheet" type="text/css"/>

</head>

<body >

<!--L'ENTETE-->

<div id="entete"><h1>ACCUEIL</h1> </div>

<!--LE MENUENTETE-->

<?php include_once("menu/menuentete.php");?>

<!--LE BLOC DE DROITE-->

<div id="menudroite"><h2>COULEURS</h2>

<?php include_once("menu/elementmenudroite.php");?>


</div>


<!--LE CORPS-->
<div id="corps">



<?php


foreach($billets as $cle=> $billet)
{
?>
<div class="news">
<h2>
	<?php echo $billet['categorie'];?>
</h2>

<h3>
	<?php echo $billet['titre'];?>
	<em>le <?php echo $billet['date_de_creation_fr'];?></em>
</h3>



<p>

<?php echo $billet['contenu'];?>
<br/>
<em><a href="vue/commentaire/index.php?billets=<?php echo $billet['id_billet'];?>">
Commentaires</a></em>
</p>
</div>
<?php
}
?>




</div>

<!--PIEDDEPAGE-->
<div id="pieddepage">XXXXXXX</div>



</body>
</html>  

commentaire/index.php
<!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>
<title>COMMENTAIRE</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1"/>
<link href="../../vue/blog/style.css" rel="stylesheet" type="text/css"/>

</head>

<body >

<!--L'ENTETE-->

<div id="entete"><h1>COMMENTAIRES</h1> </div>
<p><a href="../../ctraccueil.php">Retour à la liste des billets</a>

<!--LE MENUENTETE-->

<?php include_once("../../menu/menuentete.php");?>

<!--LE BLOC DE DROITE-->

<div id="menudroite"><h2>COULEURS</h2>

<?php include_once("../../menu/elementmenudroite.php");?>


</div>


<!--LE CORPS-->
<div id="corps">
<?php
foreach($billets as $cle=>$billet)
{
?>

<div class="news">
<h2>
	<?php echo $billet['categorie'];?>
</h2>

<h3>
	<?php echo $billet['titre'];?>
	<em>le <?php echo $billet['date_de_creation_fr'];?></em>
</h3>



<p>

<?php echo $billet['contenu'];?>
<br/>
</div><!--div de fin new-->

<?php
}
?>


<div><!--div début commentaire-->
<h2>Commentaires</h2>
<?include_once("menu/recuperationcommentaire.php");?>


</p>
</div>




</div><!--div de fin de corps-->

<!--PIEDDEPAGE-->
<div id="pieddepage">XXXXX</div>



</body>
</html>  




<config>Windows 7 / Internet Explorer 9.0</config>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 juil. 2011, 17:18

je suis d'accord avec moi même : dans BLOG\vue\commentaire\index.php à la ligne 36 (celle du foreach) $billets n'existe pas !!! (d'ailleurs tu peux le voir par toi même il n'y a pas de déclaration de la variables $billets dans les 35 premières lignes :mrgreen:
je ne pense pas que les deux include pour les menus la déclare (si c'est le cas revoir ton modèle hein ;) ).

Quand au reste du code :
- pourquoi dupliquer get_billets() ? la tu ne respecte pas trop la simplicité de maintenance que devrais amener un MVC. (si tu fait une modif tu la recopie dans combien de fichier ?).
- ton contrôleur, appel le modèle puis la vue, commentaire/index.php c'est une vue (html + affichage) c'est pas un contrôleur, donc ton MVC n'est pas respecté si tu appel ce fichier directement !
- il faut que tu ai un controleur qui appel le modèle avec la fonction get_billets() et qui l'utilise et ensuite que tu appel ton index (qui est une vue ! (d'ailleurs ton get_billets ne récupère pas des commentaires mais des billets (d'après le nom des champs) donc, heu au final je ne suis pas bien sur que tu sache ce que tu veux récupèrer(a moins d'un malheureux copier / collé).

je te conseil de revoir la notion de MVC et de revoir ta façon de l'appliquer avant d'aller plus loin. Ajoute aussi des test dans la vue pour être certain d'avoir les infos dont tu a besoin pour l'affichage avant de commencer (la typiquement un if(isset($billets)) te permet de soit afficher un message d'erreur soit les billets).

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 15 Messages

20 juil. 2011, 07:52

Bonjour, merci pour vos critiques constructives. J'ai tout simplement mal reporté une variable. Tout est rentré dans l'ordre :D donc RESOLU mais comment signaler au modérateur que c'est résolu ?