當前位置: 首頁> 最新文章列表> 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();