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 ?>
3 Réponses :
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: 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 code> pour réinitialiser le pointeur: p>
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
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 ou vous pouvez utiliser le fetch_all () code> est uniquement disponible si vous avez installé le pilote natif MySQL. (Mysqlind) p>
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'];
}
}
?>
Tout d'abord, vous n'avez pas besoin du Pour résoudre votre problème Call 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.
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
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 CODE>. 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.