ホームページ >データベース >mysql チュートリアル >PHP でデータベースの結果にアクセスすると「非オブジェクトのプロパティを取得しようとしています」というエラーが発生するのはなぜですか?
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() はオブジェクトの配列ではなくオブジェクトを返すため、この仮定は正しくありません。この問題を解決するには、次の 2 つのオプションがあります:
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;
このアプローチでは、次の配列が作成されます。サイドメニュー オブジェクトを作成し、必要に応じて反復処理できるようにします。
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 中国語 Web サイトの他の関連記事を参照してください。