2010-02-08 2 views
0

J'ai un problème, je suis en boucle jette un ensemble de valeurs et ensuite créer une requête PDO mySql avec chaque boucle, maintenant le problème est la première requête est l'exécution et le renvoi des résultats, mais le second ne renvoie pas les résultats. Si j'exécute manuellement les requêtes sur le serveur, elles renvoient des résultats. C'est bizarre, peut-être que je fais quelque chose de mal ici. Mon code ci-dessousRequête PDO mySql ne s'exécutant pas dans la boucle pour la deuxième fois pendant l'appel

if($num_results > 0){ 
for($i=0;$i<$num_results;$i++){ 
    $sql_sub = "SELECT * FROM menu_config WHERE client_id =".$client_id ." AND id =".$data[$i]['root_menu_id']; 

        $results_s = $pdo->query($sql_sub); 

        $data_s = $results_s->fetchAll(PDO::FETCH_ASSOC); 

        $sub_menu_title = "<strong>".$data[$i]['title']."</strong>"; 

        if(empty($data_s[0]['title'])){ 
         $main_menu_title = '<span style="color:#FF0000;font-weight:bold;">No Main Menu Assigned to Sub Menu</span>'; 
        }else{ 
         $main_menu_title = $data_s[0]['title']; 
        } 
        $men_title = $data[$i]['title'] 
} 
} 
+0

Avez-vous des exceptions de php/pdo? N'es-tu pas en train de réécrire '$ main_menu_title' et' $ men_title' avec la dernière itération de votre instruction for? –

+0

Aucune exception, j'ai essayé print_r ($ data_s); après chaque boucle et renvoie uniquement les valeurs avec les requêtes – Roland

+1

qu'en est-il essayer d'extraire explicitement une seule ligne? '$ row = $ pdo-> requête ($ sql_sub) -> fetch();' et ensuite 'print_r ($ row)' –

Répondre

5

(cela peut être un peu plus que vous avez demandé)

Vous semblez manquer sur quelques bonnes choses qui ont préparé des déclarations font.

Tout d'abord, vous ne voulez généralement pas transmettre les valeurs directement dans la requête. (parfois c'est nécessaire, mais pas ici). En faisant cela, vous sortez toutes les bonnes choses qui protègent de l'injection de sql. Au lieu de cela, vous voulez les envoyer en tant que paramètres après avoir préparé la requête. Deuxièmement, lorsque vous êtes en boucle, vous pouvez économiser du temps et des ressources si vous exécutez la même requête encore et encore en préparant l'instruction, puis en modifiant uniquement les valeurs que vous envoyez à cette instruction en utilisant le PDOStatement::bindParam() fonction.

Troisièmement, fetchAll() ne prend pas un 'fetch_style' de PDO :: FETCH_ASSOC. fetch() fait. Mais je pense que vous pouvez vous débrouiller avec la valeur par défaut ou aucune en utilisant fetchAll. Vous devrez vérifier cela et voir ce dont vous avez besoin. Voici the fetchAll docs

$sql_sub = "SELECT * FROM menu_config WHERE client_id = :client_id AND id = :id "; 
$query = $pdo->prepare($sql_sub); 
for($i=0;$i<$num_results;$i++){ 
    $query->bindParam(':client_id', $client_id); 
    $query->bindParam(':id', $data[$i]['root_menu_id']); 
    $query->execute(); 

    $data_s = $query->fetchAll(); 
    $sub_menu_title = "<strong>".$data[$i]['title']."</strong>"; 

    if(empty($data_s[0]['title'])){ 
     $main_menu_title = '<span style="color:#FF0000;font-weight:bold;"> 
      No Main Menu Assigned to Sub Menu</span>'; 
    }else{ 
     $main_menu_title = $data_s[0]['title']; 
    } 

    $men_title = $data[$i]['title']; 
} 
+1

très agréable réécriture, c'est toujours mieux et plus sûr d'utiliser des instructions préparées –

Questions connexes