Je travaille sur le code ci-dessous. Pourquoi n'ai-je qu'une seule ligne dans ma sortie JSON?
$items = []; if ($stmt = $this->conn->prepare("SELECT * FROM $tbl")) { $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $items = $row; } $stmt->free_result(); $stmt->close(); } $this->conn->close(); } echo json_encode($items);
5 Réponses :
$ items [] = $ row;
résoudra le problème.
Cela se produit parce que vous parcourez les lignes et que vous attribuez chacune d'elles à $items
:
$items[] = $row;
Donc, une fois la boucle terminée, vous vous retrouvez avec un variable qui est une ligne $ qui a été assignée lors de la dernière itération de cette boucle.
Vous auriez besoin de pousser les valeurs dans un tableau comme ceci:
while ($row = $result->fetch_assoc()) { $items = $row; }
Essayez avec la fonction array_push:
$items = array(); if ($stmt = $this->conn->prepare("SELECT * FROM $tbl")) { $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { array_push($items, $row); } $stmt->free_result(); $stmt->close(); } $this->conn->close(); } echo json_encode($items);
Selon Paolo Bergantino - Quoi de mieux à utiliser en PHP $ array [] = $ value
ou array_push ($ array, $ value)
?
Il dit:
Si vous utilisez array_push () pour ajouter un élément au tableau, il vaut mieux utilisez $ array [] = car de cette façon, il n'y a pas de surcharge pour appeler un fonction.
pour résoudre votre problème, vous devez changer cette partie du code:
if ($stmt = $this->conn->prepare("SELECT * FROM $tbl")) { $stmt->execute(); $items = $stmt->fetchAll(PDO::FETCH_ASSOC); }
TO:
$items = []; if ($stmt = $this->conn->prepare("SELECT * FROM $tbl")) { $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $items = $row; } $stmt->free_result(); $stmt->close(); } $this->conn->close(); }
Mais si vous utilisez PDO, je pense qu'il vaut mieux faire cela changez cette partie du code:
while ($row = $result->fetch_assoc()) { $items[] = $row; }
TO:
while ($row = $result->fetch_assoc()) { $items = $row; }
Et supprimez la boucle while.
Veuillez expliquer pourquoi ce changement est nécessaire, afin que le PO puisse savoir ce qui n'allait pas
Que veux-tu dire par là? Pourquoi ne voulez-vous pas ajouter une explication?
Cela peut être expliqué en détail, mais je pense qu'il vaut mieux aller sur les blogs pour plus de détails, j'ai dit un petit commentaire, un code propre Si vous ne croyez pas au code propre, nous devrions voir ce que les autres pensent.
Vers quels "blogs" dois-je aller et quelle est la relation avec le code propre? Veuillez garder à l'esprit que les personnes qui demandent de l'aide sur SO cherchent à apprendre quelque chose de nouveau. Si vous ne leur expliquez pas pourquoi votre code résout le problème, ils ne peuvent pas apprendre de votre réponse et ne peuvent pas écrire un meilleur code à l'avenir
La raison pour laquelle vous n'obtenez qu'une seule ligne en JSON est que dans votre boucle while
vous écrasez la même variable à chaque fois au lieu de pousser dans un tableau. Une solution simple serait de faire:
$stmt = $this->conn->prepare("SELECT * FROM $tbl"); $stmt->execute(); $result = $stmt->get_result(); $items = $result->fetch_all(MYSQLI_ASSOC); echo json_encode($items);
Cela peut également être écrit en utilisant la boucle foreach
.
foreach($result as $row) { $items[] = $row; }
Vous n'avez pas du tout besoin de cette boucle while
. Vous pouvez rendre votre code beaucoup plus simple si vous utilisez fetch_all ()
. Vous pouvez simplement remplacer tout votre code de la question par:
while ($row = $result->fetch_assoc()) { $items[] = $row; }
fetch_all (MYSQLI_ASSOC)
vous donnera toutes les lignes dans des tableaux associatifs. p>
vous venez de manquer d'indiquer que $ items est un tableau avec []. Voter pour fermer comme une faute de frappe