Instruction require _once" dans une boucle while()

Fermé
DGDB Messages postés 6 Date d'inscription jeudi 10 janvier 2013 Statut Membre Dernière intervention 1 février 2013 - 1 févr. 2013 à 12:37
 Utilisateur anonyme - 1 févr. 2013 à 14:35
Bonjour,

Je me heurte à un problème relatif à l'appel d'un "require _once" dans une boucle while()
.
Cette construction fonctionne mais renvoie une réponse erronée, étant donné qu'elle double la dernière ligne.

Soyons plus clair :

Contexte :
Construire dynamiquement la structure d'une page par l'appel, au choix, de différents fichiers .inc,
parmi une collection d'un nombre n de modules par ex : modul_a, modul_b, ... modul_n

La page au final, pourrait être constituée, par ex de 4 modules consécutifs : modul_c, modul_a, modul_g, modul_e.


Environnement :

1) Une BDD</gras> dont
une table (struct_article - champs : 'id', 'id_site', 'page', 'module', 'ordr') : configuration de la structure d'un article dans une page, choix souhaité par un utilisateur.

2) Dans le serveur, les fichiers modul_n.inc

3) en php, le code :

<?php

$result = mysql_query ("SELECT * FROM struct_article WHERE id_site ='$id_site' AND page='$page' ORDER BY ordr");

$format .= '<!-- struct -->';

while ( $row = mysql_fetch_array ( $struct_article, MYSQL_NUM ) ){
$c = $row[3];
require_once ('envir/article/'.$c.'.inc');
}

$format .= '<!-- fin struct -->';
echo $format;
?>

4) Résultat :

a - Test
Ce code fonctionne, et pour le contrôle, l'instruction : require_once ('envir/article/'.$c.'.inc');
est remplacée par le texte : $format .= 'Nbr de modules : '.$nbrCorp.'<br>'.$c.'<br>';

La réponse obtenue est correcte :
Nbr de modules : 4
modul_c
Nbr de modules : 4
modul_a
Nbr de modules : 4
modul_g
Nbr de modules : 4
modul_e

b - Exécution
Lors de l'exploitation de l'instruction require_once dans la boucle,
la dernière ligne est bouclée, le modul_e s'affiche 2 fois !!!


Dans la Littérature sur cette instruction ou commande require_once, il est dit :

" La commande require_once se remplace elle-même par le fichier spécifié, un peu comme les commandes de préprocesseur C #include , et ressemble sur ce point à require .
La principale différence est qu'avec require_once , vous êtes assurés que ce code ne sera ajouté qu'une seule fois, évitant de ce fait les redéfinitions de variables ou de fonctions, génératrices d'alertes."

"La commande require_once doit être utilisée dans les cas où le même fichier risque d'être inclus et évalué plusieurs fois durant l'exécution d'un script. Vous serez alors sûrs qu'il ne sera inclus qu'une fois et vous éviterez les problèmes de re-déclarations de fonctions ou autres."



Cela semble erroné, ou plus modestement, ma construction, intégrant un require_once dans une boucle while pourrait-elle en être la cause.

Quoiqu'il en soit, j'ai testé d'autres formes de boucle (for, foreach, ...) idem.
J'ai, construit en dur l'appel des require_once issue de la boucle, avec switch ... idem .

Auriez-vous une idée lumineuse à me suggérer ?

Merci

2 réponses

le_joker_fou Messages postés 765 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 7 août 2014 239
1 févr. 2013 à 14:06
Bonjour,

As tu essais de faire un echo dans ton while pour voir si le problème ne se produit pas dedans

while ( $row = mysql_fetch_array ( $struct_article, MYSQL_NUM ) ){
$c = $row[3];
echo $c;
} 
0
Utilisateur anonyme
1 févr. 2013 à 14:35
Bonjour

As-tu essayé de changer l'ordre des modules pour voir si c'est toujours le dernier ou toujours le modul_e qui présente cette particularité ?
Le problème est peut-être à l'intérieur du modul_e lui-même, qui double tout seul son affichage.
0