2
votes

PHP MySQLi renvoie juste une ligne en JSON

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);


1 commentaires

vous venez de manquer d'indiquer que $ items est un tableau avec []. Voter pour fermer comme une faute de frappe


5 Réponses :


1
votes

$ items [] = $ row; résoudra le problème.


0 commentaires

4
votes

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;
}


0 commentaires

1
votes

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.


0 commentaires

0
votes

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.


4 commentaires

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



0
votes

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>


0 commentaires