OVH Cloud OVH Cloud

Probleme dans boucle for()

9 réponses
Avatar
Yann
Salut,

Voici le problème : dans une boucle for($i=0; $i < $j; $i++),
j'ai $i qui devient plus grand que $j !

Voici la boucle :
$donnees = mysql_fetch_array($resultat);
$j = mysql_num_fields($resultat);
for ($i=0; $i < $j; $i++) {
echo "i = $i, j = $j<br>";
$field_name = mysql_field_name($resultat, $i);
// Utiliser sql2text ou sql2html selon le cas :
$$field_name = sql2html4($donnees["$field_name"]);
}

Et voici ce qu'elle affiche :
i = 0, j = 14
i = 1, j = 14
i = 2, j = 14
i = 3, j = 14
i = 4, j = 14
i = 5, j = 14
i = 6, j = 14
i = 7, j = 14
i = 8, j = 14
i = 9, j = 14
i = 10, j = 14
i = 11, j = 14
i = 12, j = 14
i = 13, j = 14
i = 14, j = 14

Warning: mysql_field_name(): Field 14 is invalid for MySQL result index 12
in actus.php on line 500 i = 15, j = 14

Warning: mysql_field_name(): Field 15 is invalid for MySQL result index 12
in actus.php on line 500 i = 16, j = 14

Warning: mysql_field_name(): Field 16 is invalid for MySQL result index 12
in actus.php on line 500 i = 17, j = 14

etc... ça continue longtemps.
Je précise qu'il n'y a aucun champs dans la table qui s'appelle i ou j,
et qu'aucun champ n'est à "Null".

Savez-vous d'où ça peut venir ?
J'utilise : PHP Version 4.3.4, Apache/1.3.29, MySQL 3.23.58

En attendant, j'ai mis une boucle while() et ça marche, mais j'aimerais
bien comprendre où est mon erreur ;-)

Merci pour votre aide
Yann

--

9 réponses

Avatar
Paul Delannoy
Yann a écrit:
Salut,

Voici le problème : dans une boucle for($i=0; $i < $j; $i++),
j'ai $i qui devient plus grand que $j !

Voici la boucle :
$donnees = mysql_fetch_array($resultat);
$j = mysql_num_fields($resultat);
for ($i=0; $i < $j; $i++) {
echo "i = $i, j = $j<br>";
$field_name = mysql_field_name($resultat, $i);
// Utiliser sql2text ou sql2html selon le cas :
$$field_name = sql2html4($donnees["$field_name"]);
}


ce code est il bien complet ? car il ne devrait pas essayer i... ou
bien il traine un caractère bizarre dans le $i < $j ??? ...



--

Avatar
Yann
ce code est il bien complet ?


Oui, la boucle for() est entière. Avant la boucle, il y a la
partie de connexion à la base et d'exécution de la requête.

car il ne devrait pas essayer i... ou
bien il traine un caractère bizarre dans le $i < $j ??? ...


Je viens de vérifier, il n'y en a pas. Que des espaces classiques.
Je précise que je suis sous Linux, aussi bien pour mes développements
que sur le serveur.

Yann

--

Avatar
Benoit F
ce code est il bien complet ?
Oui, la boucle for() est entière. Avant la boucle, il y a la

partie de connexion à la base et d'exécution de la requête.


J'ai beau regarder ce code, la seule hypotèse qu'un reste c'est q'un
champ de la base se nomme "j" ou "i" et donc le $$field_name écraserai
la veleur du compteur.

Pouvez vous déplacer la ligne d'affichage en fin de boucle plustot qu'un
début et réafficher la trace ?

--
Benoit F.

--


Avatar
Paul Delannoy
Yann a écrit:
ce code est il bien complet ?



Oui, la boucle for() est entière. Avant la boucle, il y a la
partie de connexion à la base et d'exécution de la requête.


car il ne devrait pas essayer i... ou
bien il traine un caractère bizarre dans le $i < $j ??? ...



Je viens de vérifier, il n'y en a pas. Que des espaces classiques.
Je précise que je suis sous Linux, aussi bien pour mes développements
que sur le serveur.


Bof, ça reste un mystère pour moi aussi. A moins que ce ne soit un pb de
type de données, par ex que $j et $i ne soient pas 'bien' comparés ? Il
faudrait peut être regarder la faq de php.net sur le sujet.

--


Avatar
Antoun
J'ai repris ton script et testé chez moi sur une requête de 4 champs. i
prend les valeurs de 0 à 3, sans poser de problème.

Restent deux trous dans mon test, par où l'anomalie peut se glisser :

- ma base n'est pas la tienne ; tu jures que ce n'est pas le cas, mais
si effectivement tu avais un champ j ça foutrait la merde

- je n'ai pas le code de ta fonction sql2html4, et j'ai donc testé sans.
Aurais-tu un global j dedans ?

Sinon, au passage, dans $donnees["$field_name"] les guillemets sont
parfaitement superflus. $donnees[$field_name] est suffisant et évite de
compliquer ton code.

Antoun

--
Avatar
Olivier Miakinen
Le 25/10/2004 00:25, Antoun répondait à Yann :

Restent deux trous dans mon test, par où l'anomalie peut se glisser :

- ma base n'est pas la tienne ; tu jures que ce n'est pas le cas, mais
si effectivement tu avais un champ j ça foutrait la merde

- je n'ai pas le code de ta fonction sql2html4, et j'ai donc testé sans.
Aurais-tu un global j dedans ?


Dans un cas comme dans l'autre, cela ne devrait pas empêcher la boucle
de s'arrêter car $i ou $j n'a pas de raison d'être modifié entre
l'incrémentation et le test. Ne s'agirait-il pas d'un bug du "for" ?

Voici la boucle :
for ($i=0; $i < $j; $i++) {
echo "i = $i, j = $j<br>";
$field_name = mysql_field_name($resultat, $i);
// Utiliser sql2text ou sql2html selon le cas :
$$field_name = sql2html4($donnees["$field_name"]);
}

Essaye de la remplacer par le "while équivalent" :
$i = 0;
while ($i < $j) {
echo "i = $i, j = $j<br>";
$field_name = mysql_field_name($resultat, $i);
// Utiliser sql2text ou sql2html selon le cas :
$$field_name = sql2html4($donnees["$field_name"]);
$i++;
}

Et même, pour suivre ce qui se passe :
$i = 0;
while ($i < $j) {
echo ">-------------<br>";
echo "i = $i, j = $j<br>";
$field_name = mysql_field_name($resultat, $i);
echo "i = $i, j = $j<br>";
// Utiliser sql2text ou sql2html selon le cas :
$$field_name = sql2html4($donnees["$field_name"]);
echo "i = $i, j = $j<br>";
$i++;
echo "i = $i, j = $j<br>";
echo "<-------------<br>";
}

--

Avatar
marc.quinton-PAS-DE-
Yann wrote:
Salut,

Voici le problème : dans une boucle for($i=0; $i < $j; $i++),
j'ai $i qui devient plus grand que $j !

Voici la boucle :
$donnees = mysql_fetch_array($resultat);
$j = mysql_num_fields($resultat);
for ($i=0; $i < $j; $i++) {
echo "i = $i, j = $j<br>";
$field_name = mysql_field_name($resultat, $i);
// Utiliser sql2text ou sql2html selon le cas :
$$field_name = sql2html4($donnees["$field_name"]);
}

Et voici ce qu'elle affiche :

i = 13, j = 14
i = 14, j = 14



il faudrait faire un print_r($donnees) et nous donner le passage
la ou ca coince, cad vers $i, 14, 15

cette boucle n'a rien de spécialement illogique. Pour la lisibilité
remplacer $j par $count ;-)

--

Avatar
P'tit Marcel
Yann wrote:

Voici la boucle :
$donnees = mysql_fetch_array($resultat);
$j = mysql_num_fields($resultat);
for ($i=0; $i < $j; $i++) {
echo "i = $i, j = $j<br>";
$field_name = mysql_field_name($resultat, $i);
// Utiliser sql2text ou sql2html selon le cas :
$$field_name = sql2html4($donnees["$field_name"]);
}



ma solution : éliminer la boucle et faire plus rapidement :

$donnees = mysql_fetch_assoc($resultat); // assoc est ++cool
array_walk($donnees , sql2html4);
extract($donnees);

3 lignes au lieu de 8, et pas une boucle !


la fonction sql2html4 sera définie comme ça :
function sql2html4(&$valeur, $bidon) {
$valeur = ...
}

(non testé)


En attendant, j'ai mis une boucle while() et ça marche, mais j'aimerais
bien comprendre où est mon erreur ;-)


bonne nuit blanche alors ;-)

--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/

--

Avatar
Alexandre BLAIS
Yann écrivait news:pan.2004.10.24.08.23.44.521745
@mailcity.com:

mysql_field_name($resultat, 0)
renvoie t il le nom du 1er champ ?


ne faut il pas commencer à mysql_field_name($resultat, 1) ?

j'ai eu a creer une fonction qui affichait le resulat d'une requete
quelquonque et prenait en parametre le resultat:

function display_result($result)
{
$fmax=odbc_num_fields($result);
$f=0;

PRINT("<TABLE BORDER=0>");
PRINT("<TR>");
while($f<$fmax)
{
$f+=1;
$nom_champ[$f]=odbc_field_name($result,$f);
$str_champ=finalise($nom_champ[$f]);
};
PRINT("</TR>");

while($rows=odbc_fetch_row($result))
{
PRINT("<TR>");
$f=0;
while($f<$fmax)
{
$f+=1;
PRINT("<TD BGCOLOR=#C0C0FF>");
PRINT(odbc_result($result,$f));
PRINT("</TD>");
}
PRINT("</TR>");
}

PRINT("</TABLE>");


} //fin de fct