解決PHP 中的非物件屬性存取錯誤
錯誤訊息「注意:嘗試取得非物件的屬性」通常當嘗試存取尚未正確初始化或不存在的物件的屬性時會發生。在提供的程式碼中,由於 mysql_fetch_object() 函數的問題而出現此錯誤。
mysql_fetch_object() 函數從結果集中檢索單行作為物件。在您的控制頁面中,您正確地使用此函數來獲取單個側選單記錄:
$results = mysql_query("SELECT * FROM sidemenu WHERE `menu_id`='".$menu."' ORDER BY `id` ASC LIMIT 1", $con); $sidemenus = mysql_fetch_object($results);
但是,在您的視圖頁面中,您嘗試迭代$sidemenus 變量,就好像它是一個數組一樣對象數量:
foreach ($sidemenus as $sidemenu): echo $sidemenu->mname."<br />"; endforeach;
這個假設是不正確的,因為mysql_fetch_object() 傳回一個對象,而不是對象數組。要解決此問題,您有兩個選擇:
1。使用while 循環:
您可以使用while 循環來迭代結果集並將每個側菜單記錄作為對象檢索:
$results = mysql_query("SELECT * FROM sidemenu WHERE `menu_id`='".$menu."' ORDER BY `id` ASC LIMIT 1", $con); $sidemenus = array(); while ($sidemenu = mysql_fetch_object($results)) { $sidemenus[] = $sidemenu; } foreach ($sidemenus as $sidemenu): echo $sidemenu->mname."<br />"; endforeach;
此方法創建一個數組sidemenu 對象,允許您根據需要迭代它們。
2.使用 PDO(首選):
PDO 是一種更現代且推薦的資料庫抽象層,可提供更高的安全性和靈活性。使用 PDO,您可以使用 fetchAll(PDO::FETCH_OBJ) 方法將資料作為物件檢索。操作方法如下:
$stmt = $con->prepare("SELECT * FROM sidemenu WHERE `menu_id`=? ORDER BY `id` ASC LIMIT 1"); $stmt->execute(array($menu)); $sidemenus = $stmt->fetchAll(PDO::FETCH_OBJ); foreach ($sidemenus as $sidemenu): echo $sidemenu->mname."<br />"; endforeach;
以上是為什麼我在存取資料庫結果時會在 PHP 中收到「嘗試取得非物件的屬性」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!