【问题标题】:PhP $stmt->fetch() while loop keeps replacing existing dataPhP $stmt->fetch() while 循环不断替换现有数据
【发布时间】: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-&gt;data as $employee) { ... } 恢复迭代数组的结果。当您发送 json 时,只需使用 json_encode($output-&gt;data); 就可以了。
  • @FelippeDuarte 我也试过了。似乎一些 gremlin 正在替换 $output-&gt;data 数组中的先前内容,即使我使用 $output-&gt;data[] = $employee; 将所有内容移出循环,我已在问题中附上了 print_r($output) 的屏幕截图。
  • 好的,我知道了,检查我的答案
  • 仅供参考,您可以使用 PDO 更轻松地做到这一点。如果您只是从 PHP 开始,请忘记 mysqli 并学习 PDO。这对你来说会容易得多。

标签: php oop object


【解决方案1】:

需要在循环内创建实例,否则会指向同一个内存地址:

while ($stmt->fetch()) {
    $employee = new stdClass;
    $employee->ID = $ID;
   ...

您可以在文档 (https://www.php.net/manual/en/language.oop5.basic.php) 中查看此内容:

将已创建的类实例分配给新变量时,新变量将访问与分配的对象相同的实例。将实例传递给函数时,此行为是相同的。可以通过克隆来复制已创建的对象。

【讨论】:

  • 我已经在整个互联网上搜索过了。这肯定会在未来帮助很多人。谢谢@Felippe
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多