web-dev-qa-db-ja.com

このエラーを回避する方法:警告:mysql_fetch_assoc()は、パラメーター1がリソースであると想定しています。ブール値は...行11に指定されています

可能性のある複製:
PHPエラー:mysql_fetch_array()はパラメータ1がリソースであり、ブール値が指定されていることを期待しています

私はこのエラーと非常に混同しています。存在しないDBから結果を返そうとすると表示されます... mysql_num_rows()を試してみましたが、同じエラーが返されますが、mysql_fetch_assocは期待しません。 ..それはmysql_num_rows()が期待することを言う...

このエラーが表示されないようにerror_reporting(0)を設定しましたが、この解決策に満足していません...

8
Naughty.Coder

物事を行う適切な方法は次のとおりです。

<?PHP
$sql = 'some query...';
$result = mysql_query($q);

if (! $result){
   throw new My_Db_Exception('Database error: ' . mysql_error());
}

while($row = mysql_fetch_assoc($result)){
  //handle rows.
}

(!$ result)のチェックに注意してください-$ resultがブール値の場合、それは確かに偽であり、データベースエラーが発生したことを意味します。

13
timdev

Mysql_queryによって返された結果がfalseかどうかを確認する必要があります。

_$r = mysql_qyery("...");
if ($r) {
  mysql_fetch_assoc($r);
}
_

@mysql_fetch_assoc($r)を使用すると、エラー表示を回避できます。

1
Pavel Strakhov

正しい構文は(例では)です:

$query = mysql_query('SELECT * FROM beer ORDER BY quality');
while($row = mysql_fetch_assoc($query)) $results[] = $row;
0
cypher

これは、mysql_fetch_assoc()を使用する方法です。

$result = mysql_query($query);

while ($row = mysql_fetch_assoc($result)) {
    // Do stuff with $row
}

$ resultはリソースである必要があります。クエリが行を返さない場合でも、$ resultはリソースです。 $ resultがブール値であるのは、データベースのクエリ時にエラーが発生した場合のみです。その場合、 mysql_error() を使用してそのエラーが何であるかを見つけ、それができないことを確認する必要があります 。その後、エラーから非表示にする必要はありません。

エラーが発生する可能性があるベースを常にカバーする必要があります。

if (!$result) {
    die(mysql_error());
}

少なくとも、ユーザーに目立った醜いエラーを残さずに、実際にエラーを修正する可能性が高くなります。

0

このエラーメッセージを防ぐ必要はありません。
エラーメッセージはあなたの友達です!
エラーメッセージがなければ、何が起こっているのかはわかりません。
大丈夫!エラーメッセージをスローするはずの機能するコード。

ただし、エラーメッセージは適切に処理する必要があります。通常、このようなエラーメッセージを回避するために特別なアクションを実行する必要はありません。コードをそのままにしてください。ただし、このエラーメッセージをユーザーに表示したくない場合は、オフにしてください。エラーメッセージ自体ではなく、それをユーザーにデイズレイイングします。

ini_set('display_errors',0);
ini_set('log_errors',1);

または.htaccess/php.iniレベルでさらに良い
また、ユーザーにはエラーメッセージが表示されることはありません。あなたはまだそれをエラーログで見ることができますが。
error_reportingはどちらの場合も最大である必要があることに注意してください。

このメッセージを回避するには、mysql_queryの結果を確認し、成功した場合にのみfetch_assocを実行します。
しかし、ネストされたifの数が多すぎるため、通常誰もそれを使用しません。
しかし、解決策もあります- 例外!

しかし、それはまだ必要ではありません。コードは実行してもエラーなしで機能するはずなので、コードはそのままにしておくことができます。

ネストされたエラーメッセージを回避するもう1つの方法は、returnを使用することです。これは私のデータベース処理関数からの抜粋です:

  $res = mysql_query($query);
  if (!$res) {
    trigger_error("dbget: ".mysql_error()." in ".$query);
    return false;
  }
  if (!mysql_num_rows($res)) return NULL;

  //fetching goes here
  //if there was no errors only
0