2010-10-20 21 views
2

J'ai une boucle while d'un appel mysql mais j'essaie aussi d'exécuter une autre requête mysql à l'intérieur de la boucle while mais elle ne le fait qu'une seule fois. Je ne peux pas le comprendre.Exécution de mysql à l'intérieur d'une boucle while

Voici mon code:

$sql = "SELECT * FROM widget_layout WHERE module_id=".mysql_real_escape_string($id)." AND state='".mysql_real_escape_string($page)."' AND position=".mysql_real_escape_string($position); 

$query = mysql_query($sql); 
while ($row = mysql_fetch_assoc($query)) { 
    $layout .= $row['widget_id'].'<br/>'; //test if it is looping through all rows 
    $sql2 = "SELECT title FROM widgets WHERE id=".$row['widget_id']; 
    $query2 = mysql_query($sql2); 
    $result2 = mysql_fetch_array($query2); 
    $layout .= $result2[0]; // test the title output 
} 

Il est Boucler dans la première requête sans problème, mais la deuxième requête est charge seulement le titre du premier widget, return null pour le reste. Une idée de pourquoi cela fait cela?

+0

Ajoutez une instruction if dans votre boucle if (! $ Query2) {echo mysql_error(); Sortie; } pour vérifier si la deuxième requête a des erreurs qui arrêtent la boucle. –

Répondre

2

Vous ne devez pas utiliser une boucle while - cela peut être fait en une seule instruction SQL:

SELECT wl.widget_id, 
     w.title 
    FROM WIDGET_LAYOUT wl 
    JOIN WIDGETS w ON w.id = wl.widget_id 
WHERE wl.module_id = mysql_real_escape_string($id) 
    AND wl.state = mysql_real_escape_string($page) 
    AND wl.position = mysql_real_escape_string($position); 

Le problème avec les valeurs de titre NULL dépend si la colonne WIDGET.title est annulable ou il n'est pas un enregistrement dans la table WIDGETS pour la valeur d'ID. Vous devez vérifier les valeurs qui reviennent de la première requête, confirmer qu'ils ont l'appui des documents dans la première table WIDGETS, puis regardez à la valeur du titre ...

0

directement à partir des mysql_query() docs: multiple queries are not supported. Votre requête innery tue l'externe.

+0

Vous avez tort. Le code posté a des requêtes en séquence. Pas multiple! –

+0

Vous faites du tort. $ query2 est dans une boucle while() qui utilise les résultats de la requête $ externe. Tant que l'autre requête $ est utilisée, vous ne pouvez pas lancer une autre requête avec la requête mysql_query standard sans supprimer la précédente. Il peut s'agir de deux instructions de requête distinctes, mais les fonctions mysql_ * ne prennent PAS en charge plusieurs requêtes actives en même temps sur le même descripteur de connexion. –

+0

Avez-vous testé? J'ai déjà testé et tout fonctionne bien. Il te manque quelque chose. J'ai beaucoup de projets qui travaillent avec cette approche. Plusieurs requêtes ne sont pas ce que le questionneur est en train de faire. Est-ce qu'une requête par appel! Regardez ici et voyez la différence: http://dev.mysql.com/doc/refman/5.1/fr/c-api-multiple-queries.html –