エラー: データベース結果にアクセスするときに「非オブジェクトのプロパティを取得しようとしています」
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 />"; }
エラーが発生する可能性があります。 mysql_fetch_object() はオブジェクトの配列ではなく単一のオブジェクトを返すため、foreach ループ内で実行されます。その結果、配列のように反復処理することはできません。
解決策
この問題を解決するには、結果を正しくフェッチするようにコードを変更します。 1 つのオプションは、行の値の配列を返す mysql_fetch_object() の代わりに mysql_fetch_array() を使用することです。
あるいは、ループを使用してすべての行をフェッチし、配列に格納することもできます。
$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 />"; }
その他の考慮事項
廃止された MySQL 関数の代わりに PDO などのデータベース抽象化レイヤーを使用することを検討してください。 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 中国語 Web サイトの他の関連記事を参照してください。