在使用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之間的差異,能有效避免此類錯誤,從而提升開發效率與代碼質量。