【发布时间】:2020-07-29 19:46:05
【问题描述】:
在while() 循环中运行$stmt->fetch() 会将object 中之前收集的所有数据替换为最后一条记录,即使您将其推送到循环中的数组也是如此。
我有一个名为
dbemployee的简单数据库
我编写了一个小脚本来让所有员工达到特定年龄。
这是我的代码:
<?php
$conn = mysqli_connect("localhost", "root", "", "test");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$output = new stdClass();
$employee = new stdClass();
// $ageCheck = $_POST['ageCheck'];
$ageCheck = 18;
$sql = "SELECT ID, vemail, vname, vage FROM dbemployee WHERE vage > ?";
$stmt = $conn->stmt_init();
if ($stmt->prepare($sql)) {
$stmt->bind_param("s",$ageCheck);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($ID, $vemail, $vname, $vage);
if ($stmt->num_rows > 0) {
while ($stmt->fetch()) {
$employee->ID = $ID;
$employee->vemail = $vemail;
$employee->vname = $vname;
$employee->vage = $vage;
$output->data[] = $employee;
}
} else {
$output->data = "";
}
$output->response = "SUCCESS";
}
header('Content-Type: application/json');
print_r($output);
?>
令人惊讶的是,我得到的只是最后一个结果的 5 个条目,好像最后一个结果正在替换以前的结果。
【问题讨论】:
-
您的代码在每个循环中都会覆盖
$employee。但是您已经通过将数据放入数组中采取了正确的方法。您可以使用foreach($output->data as $employee) { ... }恢复迭代数组的结果。当您发送 json 时,只需使用json_encode($output->data);就可以了。 -
@FelippeDuarte 我也试过了。似乎一些 gremlin 正在替换
$output->data数组中的先前内容,即使我使用$output->data[] = $employee;将所有内容移出循环,我已在问题中附上了print_r($output)的屏幕截图。 -
好的,我知道了,检查我的答案
-
仅供参考,您可以使用 PDO 更轻松地做到这一点。如果您只是从 PHP 开始,请忘记 mysqli 并学习 PDO。这对你来说会容易得多。