當前位置: 首頁> 最新文章列表> 如何解決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之間的差異,能有效避免此類錯誤,從而提升開發效率與代碼質量。