Page 1 sur 1
Re-pb de boucle
Posté : 29 août 2007, 14:50
par laeti
Bonjour,
Je souhaite afficher des éléments saisis dans un formulaire récapitulatif. J'ai fait une boucle pour récupérer mes données. Celle-ci fonctionne mais ne fait apparaître que 3 enregistrements alors que je peux en saisir bien plus.
<div id="P10">
Titres des données souhaitées :<BR>
<?php
$sql = "SELECT str_bdi.bdi_id,bdi_titre FROM str_bdi, besoin_donnee_identifiee WHERE str_id=".$str_id." AND str_bdi.bdi_id=besoin_donnee_identifiee.bdi_id";
$req = pg_query($sql) or die('Erreur SQL !'.$sql.'<br>'.pg_resul_error());
for ($i=0; isset($_SESSION['str_id'][$i]); $i++) {
$resul_bdi_titre = pg_fetch_object($req);
$resul .= $resul_bdi_titre->bdi_titre."\n";
}
?>
<textarea style="width:660px" id="Bdi_titre" name="Bdi_titre" rows="4"><?php echo $resul;?></textarea>
</div>
Est-ce quelqu'un a une idée?
Merci par avance.
Posté : 29 août 2007, 14:55
par Ryle
Tous les index de ton tableau $_SESSION['str_id'] sont-ils consécutifs ? au moindre "trou", le isSet() utiliser dans le for() retournera faux et quitteras la boucle prématurément...
C'est d'ailleurs pas courrant d'utiliset un isSet() dans un for... un " $i < count(...) " ou même un foreach à la place du for serait plus adapté je pense

Posté : 29 août 2007, 14:58
par laeti
Houlala, j'ai pas très bien compris de quoi tu parles.
$str_id est toujours le même dans ma boucle. En ce qui concerne le isset, je ne sais pas si c'est le plus approprié mais c'est comme ça que l'on m'a montré et pour l'instant, je n'ai jamais eu de problème avec.
Posté : 29 août 2007, 15:07
par Ryle
Bah en fait, quand je te demande si ton tableau $_SESSION['str_id'] comporte des "trous", c'est pour savoir s'il peut être du genre :
$_SESSION['str_id'][0] => ...
$_SESSION['str_id'][1] => ...
$_SESSION['str_id'][2] => ...
$_SESSION['str_id'][5] => ...
$_SESSION['str_id'][27] => ...
Ou si tous les index se suivent nécessairement (0,1,2,3,4,5). S'ils ne se suivent pas, quand ton compteur $i arrive à 3 (dans mon exemple), isSet($_SESSION['str_id'][3]) retournera faux et tu sortiras de la boucle après la 3ème itération, alors qu'il reste encore des éléments dans le tableau

Posté : 29 août 2007, 15:12
par laeti
OK
Non je n'ai pas de trous. Donc qu'est ce que ça peut être?
Posté : 29 août 2007, 15:16
par Ryle
L'autre possibilité, c'est que tu as moins d'éléments dans ton tableau que dans ta base... si ta requête te renvoi 5 enregistrements et que ton tableau n'en contient que 3, une fois encore tu quitteras la boucle avant d'avoir lu l'ensemble des enregistrements provenant de la base

Posté : 29 août 2007, 15:29
par laeti
non, j'ai autant d'élément dans mon tableau que dans ma base.
Excuse-moi, tu as raison, j'ai bien moins d'élément dans mon tableau que dans ma base.
Comment cela se fait-il?
Posté : 29 août 2007, 16:09
par Ryle
Bah je vois pas d'autre explication par rapport à ton code... essaye de trouve un cas ou tu devrais avoir plus de résultats que ceux afficher et vérifies la requête en la jouant directement en base, affiche les variables $i et $resul à chaque itération pour voir comment elles se comportent, affiche également ton tableau de session et le résultat du isSet() pour voir quand est ce qu'il quitte la boucle et tu devrais voir quand et donc pourquoi il te saute des résultats...
Posté : 29 août 2007, 16:18
par laeti
Dans le cas où j'ai plus de résultats que ceux affichés, ma requête marche dans PgAdmin. (4 résultats pour 3 affichés).
L'affichage du isset me met 1 avant l'affichage de chaque résultat. Je quitte donc la boucle après le 3ème résultat.
Je ne comprends pas très bien pourquoi.
Posté : 29 août 2007, 18:32
par Sékiltoyai
Fais un vardump() de $_SESSION['str_id'] pour voir…
Posté : 30 août 2007, 09:30
par laeti
Le var_dump() me donne:
string(3) "315"
315 correspond bien à l'identifiant de cette variable et 3 correspond au nombre de résultats affichés alors que ça devrait être 4.
En fait, quelque soit le nombre de saisie que je fais, la boucle est bloquée sur 3 itérations. Comment cela est-il possible?
J'ai changé mon for par un while et ça marche.
Posté : 30 août 2007, 15:19
par Sékiltoyai
Donc Ryle avait raison, tu n'as bien que 3 éléments dans ton tableau (ici c'est une chaine) $_SESSION['str_id']. Donc c'est ici que ce trouve ton problème.