PHP MySQLi仅以JSON返回一行

时间:2019-02-07 16:37:38

标签: php mysqli

我正在处理以下代码。为什么我的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 个答案:

答案 0 :(得分:4)

之所以会发生这种情况,是因为您要遍历各行并将它们分别分配给$items

while ($row = $result->fetch_assoc()) {
    $items = $row;
}

因此,在循环结束后,您最终得到一个变量,该变量是在该循环的最后一次迭代期间分配的$ row。

您需要将值推入数组,如下所示:

$items[] = $row;

答案 1 :(得分:1)

$items[] = $row;将解决问题。

答案 2 :(得分:1)

尝试使用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);

根据Paolo Bergantino-在PHP $array[] = $valuearray_push($array, $value)中使用哪个更好?  他说:

  

如果使用array_push()将一个元素添加到数组中,则最好   请使用$ array [] =,因为这样就不会产生调用   功能。

答案 3 :(得分:0)

要解决您的问题,必须更改部分代码:

while ($row = $result->fetch_assoc()) {
    $items = $row;
}

收件人:

while ($row = $result->fetch_assoc()) {
    $items[] = $row;
}

但是如果您使用PDO,我认为最好更改这部分代码:

$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();
}

收件人:

if ($stmt = $this->conn->prepare("SELECT * FROM $tbl")) {
    $stmt->execute();
    $items = $stmt->fetchAll(PDO::FETCH_ASSOC);
}

并删除while循环。

答案 4 :(得分:0)

之所以只在JSON中获得一行,是因为在forms.py循环中,您每次都覆盖相同的变量,而不是将其压入数组。一个简单的解决方法是:

while

这也可以使用while ($row = $result->fetch_assoc()) { $items[] = $row; } 循环来编写。

foreach

您根本不需要这个foreach($result as $row) { $items[] = $row; } 循环。如果使用while,则可以简化代码。您只需将问题中的所有代码替换为:

fetch_all()

$stmt = $this->conn->prepare("SELECT * FROM $tbl"); $stmt->execute(); $result = $stmt->get_result(); $items = $result->fetch_all(MYSQLI_ASSOC); echo json_encode($items); 将为您提供关联数组中的所有行。