存取資料庫結果時出現錯誤:「嘗試取得非物件的屬性」
當嘗試在PHP 中存取資料庫結果時,您可能會遇到錯誤「嘗試取得非物件的屬性」。當您嘗試存取不可用的資料庫結果物件的屬性時,會發生此錯誤。
要解決此問題,請驗證您的資料庫查詢是否傳回預期結果以及傳回變數的資料類型是正確的。
錯誤的起源
考慮此範例程式碼,其中可能會出現相關錯誤:
// Retrieve a single row from the database $results = mysql_query("SELECT * FROM sidemenu WHERE `menu_id` = '{$menu}' ORDER BY `id` ASC LIMIT 1", $con); // Attempt to access the result as an object $sidemenus = mysql_fetch_object($results); // Iterate over the result and display properties foreach ($sidemenus as $sidemenu) { echo $sidemenu->mname . "<br />"; }
可能會發生錯誤在foreach 循環中,因為mysql_fetch_object() 傳回單一對象,而不是物件陣列。因此,您無法像數組一樣對其進行迭代。
解決方案
要解決此問題,您可以修改程式碼以正確取得結果。一種選擇是使用 mysql_fetch_array() 而不是 mysql_fetch_object(),後者傳回行值的陣列。
或者,您可以使用循環來獲取所有行並將它們存儲在數組中:
$sidemenus = array(); while ($sidemenu = mysql_fetch_object($results)) { $sidemenus[] = $sidemenu; } // Iterate over the sidemenus array and display properties foreach ($sidemenus as $sidemenu) { echo $sidemenu->mname . "<br />"; }
其他注意事項
考慮使用資料庫抽象層(例如PDO)而不是過時的MySQL 函數。 PDO 提供了一種更現代、更安全的與資料庫互動的方式。
例如,使用 PDO 取得單行作為物件:
$sth = $pdo->prepare("SELECT * FROM sidemenu WHERE `menu_id` = :menu_id ORDER BY `id` ASC LIMIT 1"); $sth->execute([':menu_id' => $menu]); $sidemenu = $sth->fetchObject(); if ($sidemenu) { echo $sidemenu->mname; }
以上是為什麼在 PHP 中存取資料庫結果時出現「嘗試取得非物件的屬性」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!