PHP hanté ?

alain78
Invité n'ayant pas de compte PHPfrance

14 nov. 2008, 17:47

Bonjour,

PHP est il hanté ?

Voici un mystère que je ne m'explique pas.
Dans ma requête SQL je récupère les entités que l'utilisateur est autorisé à voir.
Dans ma requête SQL1 je récupère le nom de ces entités (stockés dans une autre table)
A titre de debbugage j'affiche le nom des entités récupérées : il y en a 5
Puis je transfère dans la table temporaire 'structure_temp' les entités récupérés.
En théorie il y en a 5 puisque PHP me les a affichées.

OR lorsque je fait un sélect (quelques lignes de codes après) sur la base temporaire, il ne me restitue que 4 entités.

Avez vous déjà eu ce genre de soucis ? Avez vous une explication ?
Comme d'habitude cela doit être un truc tellement simple que je ne le vois pas.
Merci par avance.


--------------------------------code--------------------------------
	
$sql="SELECT * FROM `droit_entites` WHERE ref_utilisateur = '$user' and voir='o'";
$result=mysql_query($sql);
$nbuser = mysql_num_rows($result);

for (; ; ){
	if ($i < $nbuser) {
		mysql_data_seek($result, $i);
		$row = mysql_fetch_assoc($result);
		$ref_entite = $row['ref_entite'] ;
					
		$sql1="SELECT * FROM `entites` WHERE ref_entite = '$ref_entite'";
			$result1=mysql_query($sql1);
			$row1 = mysql_fetch_assoc($result1);
			$nom_entite = $row1['nom_long'] ;
									
								
			if (!empty($nom_entite)) {
	          echo "<br>nom entite 2= " . $nom_entite;									
									
									
$sql1 = "INSERT INTO `structure_temp` (`ref_structure_temp`, `nom_entite`, `ref_entite`, `ref_user`) VALUES (NULL, '$nom_entite', $ref_entite, $user);";								
mysql_query($sql1);	
										}		
			}else{
				break;
								}
			$i++;
			}

Mammouth du PHP | 1353 Messages

14 nov. 2008, 17:54

Bonjour,

C'est que ce passage :
for (; ; ){ 
    if ($i < $nbuser) { 
        mysql_data_seek($result, $i); 
        $row = mysql_fetch_assoc($result); 
??

Pas de valeur de $i initiale, une boucle qui s'incrémente pas (ou alors si elle le fait en fonction de $i faut pas faire le $i++ à la fin...)

Pourquoi ne pas faire simplement

Code : Tout sélectionner

while($row = mysql_fetch_assoc($result)) { $ref_entite = $row['ref_entite'] ; //... }
?
Tell me and I forget. Teach me and I remember. Involve me and I learn.

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

14 nov. 2008, 17:56

J'ai pas regardé plus loin, mais je constate que tu utilises mysql_data_seek() pour déplacer le pointeur interne sur $result, puis que tu fais appel à mysql_fetch_assoc() qui va lire la donnée et également déplacer le pointeur... résultat un pointeur probablement déplacé 2 fois, te faisant peut être sauter la première ligne ?

Ps : pour simplifier ton code, tu peux ne faire qu'une seule requête pour récupérer id et libellé de tes entités à l'aide d'une jointure. La liste des champs à la place du select * est également plus performant et plus facile à maintenir :

Code : Tout sélectionner

SELECT e.ref_entite, e.nom_long FROM droit_entites de, entite e WHERE de.ref_entite = e.ref_entite AND de.ref_utilisateur = '$user' AND de.voir='o'
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

alain 78
Invité n'ayant pas de compte PHPfrance

14 nov. 2008, 20:22

Merci à vous . Je garde précieusement vos réponses pour les analyser en détail.
Entre temps j'ai débusqué le fantôme.

En fait un de mes enregistrements s'intitulait : Société d'Etalonage.

Or Le passage PHP vers MySql n'aime pas du tout les apostrophes.

J'a rectifié et trouvé la solution.

Il fallait écrire la variable en la faisant précéder et suivre de \"
$sql1 = "INSERT INTO `structure_temp` (`ref_structure_temp`, `nom_entite`, `ref_entite`, `ref_user`) VALUES (NULL, \"$nom_entite\", $ref_entite, $user);";	
Je donne cette réponse pour ceux qui se trouveraient en bute à ce problème.

Des fois on cherche, on cherche, on cherche ....... et la solution est tellement bête.....