0
votes

fetch_assoc () ne fonctionne qu'une seule fois dans une boucle

Je suis en boucle à travers 2 tables dans MySQL DB (à l'aide de fetch_assoc ()). Je souhaite obtenir l'identifiant actuel de la 1ère table et tous les identifiants de la deuxième table sur chaque itération, mais je reçois les identifiants de la deuxième table uniquement sur la première itération. De la deuxième itération vers le haut, seul l'ID actuel de la 1ère table est renvoyé. J'aimerais savoir ce que je fais mal.

J'ai déjà essayé pour des boucles et j'ai regardé des questions similaires ici, mais aucune n'a été vraiment de l'aide. P>

<?php
$my_sqli = new mysqli('localhost', 'root', '', 'taskpro') or die(mysqli_error($my_sqli));
$data1 = $my_sqli->query("SELECT * FROM task_table") or die($my_sqli->error);
$data2 = $my_sqli->query("SELECT * FROM taskinfo") or die($my_sqli->error);

while ($row = $data1->fetch_assoc()) {
    echo "<br>";
    echo $row['id'];
    echo "<br>";

    while ($row2 = $data2->fetch_assoc()) {
        echo $row2['id'];
    } // end child loop

} // end parent loop

?>


2 commentaires

Parce que vous avez consommé tous les résultatsset de la deuxième requête, la première fois la boucle extérieure. Essentiellement arrivé à endoffiler donc il n'y a rien de plus à chercher


Oui c'est comme ça que cela fonctionne, vous devez REQUERY . Si vous souhaitez récupérer les données à nouveau. Ou gentiment stockez d'abord les deux données dans le tableau, puis effectuez vos opérations.


3 Réponses :


1
votes

La chose la plus simple à faire est de lire toutes les valeurs de Query2 dans un tableau, puis de produire le contenu de la matrice dans la boucle: xxx

si pour une raison quelconque que vous avez besoin de Itérez sur le résultat défini dans la boucle extérieure, vous pouvez utiliser < Code> mysqli_data_seek pour réinitialiser le pointeur: xxx


2 commentaires

Merci pour l'aide, j'ai effectivement essayé de lire les résultats dans un tableau (ne pas utiliser fetch_all ()) mais avec peu de chance. Merci d'avoir perdu plus de lumière sur ceci :)


@Nick Oui, j'ai. Il fonctionne comme un charme. Merci encore



0
votes

Fondamentalement, vous avez épuisé les résultatsset de la deuxième requête après avoir terminé la première itération de la requête extérieure.

Il y a quelques façons de le faire, voici quelques suggestions p>

Tout d'abord vous Pourraient charger tous les résultats de la deuxième requête dans une matrice, puis de ré-traiter le tableau à chaque fois autour de la boucle extérieure. Cependant, la fonction fetch_all () code> est uniquement disponible si vous avez installé le pilote natif MySQL. (Mysqlind) p> xxx pré>

ou vous pouvez utiliser le mysqli_result :: data_seek () code> fonction pour réinitialiser le pointeur de la première ligne du résultat de la requête comme CETTE P>

<?php
$my_sqli = new mysqli('localhost', 'root', '', 'taskpro');
if (!$my_sqli) {
    die('Connect Error: ' . mysqli_connect_errno());
}

$data1 = $my_sqli->query("SELECT * FROM task_table") or die($my_sqli->error);
$data2 = $my_sqli->query("SELECT * FROM taskinfo") or die($my_sqli->error);

while ($row = $data1->fetch_assoc()) {
    echo "<br>";
    echo $row['id'];
    echo "<br>";

    $data2->data_seek(0);   // make sure the pointer is at the beginning before looping
    while ($row2 = $data2->fetch_assoc()) {
        echo $row2['id'];
    } 
}
?>


0 commentaires

0
votes

Tout d'abord, vous n'avez pas besoin du pendant code> du tout. Il vient de vous confondre. Vous pouvez simplement utiliser foreach ($ data1 comme $ ligne) code>. Cela dit, cela ne résoudrait pas votre problème.

Pour résoudre votre problème Call fetch_all (mysqli_assoc ) code> sur le résultat de Query code> ou simplement les chaîner ensemble. Soyez prudent, cela ne fonctionne qu'avec des requêtes statiques. Si vous devez utiliser des variables dans votre SQL, vous devez utiliser Préparation des déclarations . P>

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'root', '', 'taskpro');
$mysqli->set_charset('utf8mb4');

$data1 = $mysqli->query("SELECT * FROM task_table")->fetch_all(MYSQLI_ASSOC);
$data2 = $mysqli->query("SELECT * FROM taskinfo")->fetch_all(MYSQLI_ASSOC);

foreach ($data1 as $row) {
    echo "<br>";
    echo $row['id'];
    echo "<br>";
    foreach ($data2 as $row2) {
        echo $row2['id'];
    } // end child loop
} // end parent loop


0 commentaires