Une while qui ne boucle pas

Fermé
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 - 24 juin 2009 à 10:01
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 - 24 juin 2009 à 13:09
Bonjour bonjour !

J'ai à nouveau un problème avec mon php.

J'aimerais comparer deux tables et insérer les champs identiques aux deux tables dans une troisième.

En gros, j'ai une table table_A, une table_B et une table_C.
Lorsque le code trouve un enregistrement identique (en comparant les deux champs) entre table_A et table_B, il ecrit cet enregistrement dans table_C.
Voici le code actuel que j'ai:
<?php
$link=mysql_connect("localhost","root","");
mysql_select_db("base");
$query1="SELECT * FROM table_A WHERE 1"; 
$result1=mysql_query($query1,$link) or die (" Impossible de créer la requête 1 ");
$query2="SELECT * FROM table_B WHERE 1"; 
$result2=mysql_query($query2,$link) or die (" Impossible de créer la requête 2 ");

while($tableau1=mysql_fetch_array($result1))
{
	while($tableau2=mysql_fetch_array($result2))
			{
		 if($tableau2[champ1] == $tableau1[champ1])
		 {
		
		$query="INSERT INTO table_C (champ1, champ2) VALUES (	   
'".$tableau1[champ1]."',
'".$tableau1[champ2]."');

		mysql_query($query,$link) or die (" Impossible de créer la requête 2 ");
		}
		      }
}
?>


Il se trouve que le code copie bien le premier enregistrement de table_A dans table_C mais rien d'autre.
Les autres enregistrements identiques passent à la trappe ! (j'ai même essayé de mettre deux fois le même enregistrement au cas où, pour tester, et il n'est pas pris non plus, ce code ne prend vraiment que la première ligne)
J'ai l'impression que la première "while" ne boucle pas.

Merci à la ou aux personnes qui pourront me dépanner !

Momo

5 réponses

Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
24 juin 2009 à 10:14
$query1="SELECT * FROM table_A WHERE 1";

WHERE 1 n'est pas une condition il faut WHERE un_champ=1 par exemple
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
24 juin 2009 à 10:21
Bonjour,

Merci pour la réponse, néanmoins, je ne veux pas de condition, je veux sélectionner toute la table et rien de plus pour effectuer mon traitement.
J'ai toujours effectué un "WHERE 1" pour mes requètes lorsque je désire prendre une table complète.
0
Si tu ne veux pas mettre de condition :

SELECT * from NOM_DE_TA_TABLE;
0
Bonjour,

Je pense avoir une piste pour toi :
Le second while qui boucle sur $tableau2 ne peut parcourir $result2 qu'une seule fois. En fait, $result2 contient les enregistrements extraits de la base de données et un curseurs qui permet de les balayer.
Lorsque tu appelles mysql_fetch_array, tu récupères l'enregistrement et tu incrémentes le curseur vers l'enregistrement suivant, et ce jusqu'a ce qu'il n'y ai plus d'enregistrement.

De ce fait, lorsque tu fais ton second passage avec ton while qui boucle sur $tableau1, tu ne rentre plus dans le while qui boucle sur $tableau2 car ce dernier et déjà en fin de course.

Pour remédier au problème, il faut :
1. Soit tu refais une requête pour récupérer resultat2
2. Soit (beaucoup mieux), tu utilises http://fr3.php.net/manual/fr/function.mysql-data-seek.php mysql_data_seek pour remettre ton curseur en première position de tous les enregistrements de résultats 2.
0
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
24 juin 2009 à 10:54
Bonjour,

Merci pour cette réponse extrèmement claire !

Malheureusement je n'arrive pas à mettre en oeuvre de mysql_date_seek()

J'ai entré ce code:

<?php
$link=mysql_connect("localhost","root","");
mysql_select_db("base");
$query1="SELECT * FROM table_A WHERE 1"; 
$result1=mysql_query($query1,$link) or die (" Impossible de créer la requête 1 ");
$query2="SELECT * FROM table_B WHERE 1"; 
$result2=mysql_query($query2,$link) or die (" Impossible de créer la requête 2 ");

while($tableau1=mysql_fetch_array($result1))
{
	while($tableau2=mysql_fetch_array($result2))
			{
		 if($tableau2[champ1] == $tableau1[champ1])
		 {
		
		$query="INSERT INTO table_C (champ1, champ2) VALUES (	   
'".$tableau1[champ1]."',
'".$tableau1[champ2]."');

		mysql_query($query,$link) or die (" Impossible de créer la requête 2 ");
mysql_data_seek($result2,0);
		}
		      }
}
?>


En ajoutant le mysql_data_seek().

Avec ceci, la page php me copie la première ligne de mon table_A dans ma table_C plus de 36.000 fois et est coupée par le délai d'exécution de 30sec qui est dépassé (elle aurait pu monter bien plus haut donc).

Ai-je mal interprété cette fonction ?
0
Met ta ligne mysql_data_seek juste avant le while($tableau2=mysql_fetch_array($result2))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MoYoX Messages postés 127 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 mars 2014 3
24 juin 2009 à 13:09
Merci beaucoup ça fonctionne parfaitement comme je le voulais !
Même si ce que j'ai compris du mysql_data_seek reste très vague, ça marche, et c'est très bien !

Merci beaucoup encore !
0