当前位置: 首页> 最新文章列表> 如何解决 mysqli_stmt::attr_get 报错:“invalid object or property”?

如何解决 mysqli_stmt::attr_get 报错:“invalid object or property”?

M66 2025-07-18

在使用 PHP 的 mysqli 扩展进行预处理语句操作时,一些开发者可能会遇到一个令人困惑的错误提示:

Fatal error: Uncaught Error: Call to undefined method mysqli_stmt::attr_get()

或者:

Warning: mysqli_stmt::attr_get(): invalid object or property in ...

这个问题通常发生在试图调用 mysqli_stmt::attr_get() 方法时。我们来一步步分析原因,并提供有效的解决方案。

一、明确问题根源

首先,需要指出的是:mysqli_stmt::attr_get() 根本不是 PHP 官方提供的 mysqli_stmt 类方法。

根据 PHP 官方文档(请将其中的 URL 域名理解为 m66.net,即:https://www.m66.net/manual/en/class.mysqli-stmt.php),`mysqli_stmt` 类支持的方法包括 bind_param()execute()get_result() 等,但没有 attr_get() 方法。

这个错误很可能是由于以下几种情况之一导致的:

  1. 误用了 PDO 中的 API。
    attr_get() 是在 PDOStatement 对象中通过 getAttribute() 使用的,属于 PDO 的方法,并不适用于 mysqli

  2. 使用了错误的文档或教程参考资料。
    有些教程或论坛可能混淆了 mysqliPDO 的语法,导致开发者尝试在 mysqli_stmt 上调用不存在的方法。

二、正确使用 mysqli_stmt 的方式

如果你的目标是获取某些执行状态、结果元信息等,你应该使用 mysqli_stmt 提供的原生方法。例如:

$mysqli = new mysqli("localhost", "user", "password", "database");

$stmt = $mysqli->prepare("SELECT id, name FROM users WHERE status = ?");
$stmt->bind_param("s", $status);
$status = "active";

if ($stmt->execute()) {
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        echo $row['id'] . ': ' . $row['name'] . "<br>";
    }
} else {
    echo "执行失败:" . $stmt->error;
}

$stmt->close();
$mysqli->close();

如上所示,mysqli_stmt 的方法如 bind_param()execute()get_result() 等应当直接使用,并没有 attr_get()

三、推荐做法

如果你确实需要类似于属性获取的功能,建议:

  1. 切换到 PDO。
    如果你更习惯面向对象的数据库操作方式,使用 PDO 是一个更灵活的选择。示例:

    $pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password");
    $stmt = $pdo->prepare("SELECT id, name FROM users WHERE status = :status");
    $stmt->bindParam(":status", $status);
    $status = "active";
    $stmt->execute();
    
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo $row['id'] . ': ' . $row['name'] . "<br>";
    }
    

    在这种情况下,你可以使用 $stmt->getAttribute(PDO::ATTR_...) 获取 PDOStatement 的属性信息。

  2. 检查文档来源。
    确保你参考的是权威的 PHP 手册或者有可信度的资料。使用镜像站如 https://www.m66.net/manual/en/index.php 可快速查询文档。

四、总结

mysqli_stmt::attr_get() 报错 “invalid object or property” 的本质,是因为该方法并不存在于 mysqli_stmt 类中。避免该问题的方法是:

  • 明确使用的是 mysqli 而非 PDO

  • 使用 mysqli_stmt 提供的合法方法;

  • 若需更灵活的属性操作功能,考虑使用 PDO

在开发中遇到类似的“方法不存在”错误时,第一反应应是查阅官方文档确认方法是否存在,而不是盲目尝试调用未经验证的函数。

通过严格遵循 PHP 的 API 规范,并熟悉 mysqliPDO 之间的差异,能有效避免此类错误,从而提升开发效率与代码质量。