在使用 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() 方法。
这个错误很可能是由于以下几种情况之一导致的:
误用了 PDO 中的 API。
attr_get() 是在 PDOStatement 对象中通过 getAttribute() 使用的,属于 PDO 的方法,并不适用于 mysqli。
使用了错误的文档或教程参考资料。
有些教程或论坛可能混淆了 mysqli 和 PDO 的语法,导致开发者尝试在 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()。
如果你确实需要类似于属性获取的功能,建议:
切换到 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 的属性信息。
检查文档来源。
确保你参考的是权威的 PHP 手册或者有可信度的资料。使用镜像站如 https://www.m66.net/manual/en/index.php 可快速查询文档。
mysqli_stmt::attr_get() 报错 “invalid object or property” 的本质,是因为该方法并不存在于 mysqli_stmt 类中。避免该问题的方法是:
使用 mysqli_stmt 提供的合法方法;
若需更灵活的属性操作功能,考虑使用 PDO。
在开发中遇到类似的“方法不存在”错误时,第一反应应是查阅官方文档确认方法是否存在,而不是盲目尝试调用未经验证的函数。
通过严格遵循 PHP 的 API 规范,并熟悉 mysqli 与 PDO 之间的差异,能有效避免此类错误,从而提升开发效率与代码质量。