「嘗試取得非物件的屬性」 - 了解問題
錯誤「嘗試取得非物件的屬性」通常在您嘗試存取不存在的物件的屬性時發生。對於您的情況,此問題出現在以下程式碼中:
<?php include 'pages/db.php'; $results = mysql_query("SELECT * FROM sidemenu WHERE `menu_id`='".$menu."' ORDER BY `id` ASC LIMIT 1", $con); $sidemenus = mysql_fetch_object($results); ?>
當您執行此程式碼時,問題在於 mysql_fetch_object() 的使用。此函數傳回側邊選單表中單行的物件表示形式,但您嘗試將其作為視圖頁面中的物件陣列進行迭代:
<?php foreach ($sidemenus as $sidemenu): ?> <?php echo $sidemenu->mname."<br />"; ?> <?php endforeach; ?>
解決問題
要修復此錯誤,您需要從表中檢索所需的所有行並將它們儲存在陣列中。您可以透過使用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; }
透過在視圖頁面中使用此物件數組,您可以迭代它並存取每個物件的屬性:
<?php foreach ($sidemenus as $sidemenu): ?> <?php echo $sidemenu->mname."<br />"; ?> <?php endforeach; ?>
替代方法PDO
處理這種情況的另一個選擇是使用PHP的 PDO 擴展,它提供了更現代、物件導向的資料庫互動。使用PDO,您可以從sidemenu 表中取得所有行並將它們儲存在陣列中,如下所示:
$pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password'); $stmt = $pdo->prepare("SELECT * FROM sidemenu WHERE `menu_id`=:menu_id ORDER BY `id` ASC LIMIT 1"); $stmt->execute([':menu_id' => $menu]); $sidemenus = $stmt->fetchAll(PDO::FETCH_OBJ);
在此程式碼中:
然後您可以使用視圖頁面中的這個物件數組,類似於前面描述的方法。
以上是為什麼我在 PHP 中收到「嘗試取得非物件的屬性」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!