首页 > 解决方案 > 为什么我在尝试计算 mysqli 结果时会收到警告?

问题描述

下面的代码会导致此警告:

警告:count():参数必须是数组或实现 Countable 的对象

为什么这样做?如何防止警告?

if (isset($_GET['edit'])) {
    $sonum = $_GET['edit'];
    $update = true;
    $result = $mysqli->query("SELECT * FROM salesorder WHERE sonum=$sonum") or die ($mysqli->error);

    if (count($result)==1) {
        $row = $result->fetch_array();
        $salesperson = $row['salesperson'];
        $company = $row['company'];
        $status = $row['status'];
    }
}

标签: phpmysqlmysqlicount

解决方案


$result将是一个mysqli_result对象,或者false如果查询失败。(请参阅文档中的“返回值mysqli_query。)这些都不是可数的。当您尝试计算不可数的事物时,较新的 PHP 版本会警告您,即使count()仍会返回一个值(现在!)

if (count($result)==1) {不会在 PHP 版本 < 7.2 中给出警告,但它从来没有真正做任何事情,因为count($result)无论查询是否失败,它总是 1。你可能没想到会这样,但它会返回 1。这就是现在发出警告count(false)是一件好事的部分原因。count()

如果您只是在查询返回任何行时尝试设置这些变量,则可以这样做:

if ($result && $row = $result->fetch_array()) {
    $salesperson = $row['salesperson'];
    $company = $row['company'];
    $status = $row['status'];
}

顺便说一句,您应该看看如何在 PHP 中防止 SQL 注入?并修复注入漏洞 ...WHERE sonum=$sonum"。您应该使用准备好的语句并绑定$sonum而不是将其包含在 SQL 字符串中。


推荐阅读