Ralat: "Mencuba mendapatkan harta bukan objek" Apabila Mengakses Hasil Pangkalan Data
Apabila cuba mengakses hasil pangkalan data dalam PHP, anda mungkin menghadapi ralat "Mencuba untuk mendapatkan harta bukan objek." Ralat ini berlaku apabila anda cuba mengakses sifat objek hasil pangkalan data yang tidak tersedia.
Untuk menyelesaikan isu ini, sahkan bahawa pertanyaan pangkalan data anda mengembalikan hasil yang dijangkakan dan jenis data pembolehubah yang dikembalikan adalah betul.
Asal usul Ralat
Pertimbangkan kod contoh ini di mana ralat yang dipersoalkan mungkin nyata:
// 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 />"; }
Ralat boleh berlaku dalam gelung foreach kerana mysql_fetch_object() mengembalikan satu objek, bukan tatasusunan objek. Akibatnya, anda tidak boleh mengulanginya seperti tatasusunan.
Penyelesaian
Untuk menyelesaikan isu ini, anda boleh mengubah suai kod untuk mengambil keputusan dengan betul. Satu pilihan ialah menggunakan mysql_fetch_array() dan bukannya mysql_fetch_object(), yang mengembalikan tatasusunan nilai baris.
Sebagai alternatif, anda boleh menggunakan gelung untuk mengambil semua baris dan menyimpannya dalam tatasusunan:
$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 />"; }
Pertimbangan Tambahan
Pertimbangkan untuk menggunakan lapisan abstraksi pangkalan data seperti PDO dan bukannya fungsi MySQL yang usang. PDO menyediakan cara yang lebih moden dan selamat untuk berinteraksi dengan pangkalan data.
Sebagai contoh, untuk menggunakan PDO untuk mengambil satu baris sebagai objek:
$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; }
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat 'Mencuba untuk mendapatkan harta bukan objek' Semasa Mengakses Hasil Pangkalan Data dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!