当前位置: 首页> 最新文章列表> mysqli_stmt::attr_get 函数返回 false 的常见原因有哪些?

mysqli_stmt::attr_get 函数返回 false 的常见原因有哪些?

M66 2025-06-15

在使用 PHP 的 mysqli 扩展进行数据库操作时,mysqli_stmt::attr_get 函数用于获取预处理语句(mysqli_stmt)的属性值。这个函数在某些情况下可能会返回 false,这通常表示获取属性失败。本文将详细分析导致 mysqli_stmt::attr_get 返回 false 的常见原因,并给出相应的解决建议。

1. 使用不支持的属性常量

mysqli_stmt::attr_get 需要传入一个合法的属性常量作为参数,比如 MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH。如果传入的属性常量无效或未定义,函数就会返回 false

示例:

$mysqli = new mysqli('m66.net', 'user', 'pass', 'database');
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);

$attr = $stmt->attr_get(9999); // 非法属性常量
if ($attr === false) {
    echo "获取属性失败,属性常量非法或不支持。";
}

建议:请查阅官方文档,确保传入的属性常量是正确且支持的。

2. 预处理语句对象未正确初始化或已关闭

如果 $stmt 对象未成功创建或者已经调用过 $stmt->close(),再调用 attr_get 也会失败。

示例:

$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
if (!$stmt) {
    die("准备语句失败:" . $mysqli->error);
}
$stmt->close();

$attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
if ($attr === false) {
    echo "获取属性失败,预处理语句对象不可用。";
}

建议:在调用 attr_get 前确认预处理语句对象有效且未关闭。

3. 数据库驱动或 PHP 版本兼容性问题

某些 PHP 版本或 MySQL 驱动版本可能存在兼容性问题,导致 attr_get 无法正常工作,返回 false

建议

  • 确保 PHP 和 MySQL 版本为官方推荐的稳定版本。

  • 尝试升级到最新版本的 PHP 和 MySQL。

  • 在不同环境下测试,排除环境问题。

4. 未正确传递属性参数类型

attr_get 要求传入参数为整数型属性常量,如果传入字符串或者其他类型,函数可能返回 false

示例:

$attr = $stmt->attr_get("MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH"); // 错误用法
if ($attr === false) {
    echo "获取属性失败,参数类型错误。";
}

建议:确保参数是预定义的整型常量。

5. 数据库连接异常或资源错误

在极少数情况下,数据库连接异常或资源状态异常也可能导致函数返回 false

建议

  • 确认数据库连接稳定。

  • 捕获并处理可能的异常或错误。

  • 使用 $mysqli->error$stmt->error 获取详细错误信息。


代码示例总结

下面是一个正确使用 mysqli_stmt::attr_get 的示例:

$mysqli = new mysqli('m66.net', 'user', 'pass', 'database');
if ($mysqli->connect_error) {
    die("连接失败:" . $mysqli->connect_error);
}

$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
if (!$stmt) {
    die("准备语句失败:" . $mysqli->error);
}

$id = 1;
$stmt->bind_param("i", $id);

$attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
if ($attr === false) {
    echo "获取属性失败,错误信息:" . $stmt->error;
} else {
    echo "属性值为:" . $attr;
}

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