如何防止此错误:警告:mysql_fetch_assoc()期望参数1是资源,布尔在…在第11行给出

可能重复:
PHP错误:mysql_fetch_array()期望参数1是资源,布尔给定

我很困惑这个错误,它显示当我尝试从不存在的数据库返回结果…我试过mysql_num_rows()但它返回相同的错误,而不是mysql_fetch_assoc期望…它说mysql_num_rows()期望…

我设置error_reporting(0)以避免显示此错误,但我不满意这个解决scheme…

这是做事的正确方法:

 <?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是一个布尔值,肯定是false,这意味着有一个数据库错误,这意味着你的查询可能是不好的。

您必须检查mysql_query返回的结果是否为false。

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

您可以使用@mysql_fetch_assoc($r)来避免显示错误。

正确的语法是(在示例中):

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

这就是你应该如何使用mysql_fetch_assoc():

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

$结果应该是一个资源。 即使查询没有返回行,$ result仍然是一个资源。 唯一的时间$ result是一个布尔值,如果在查询数据库时发生错误。 在这种情况下,您应该通过使用mysql_error()来确定错误是什么,并确保它不会发生。 那么你不必躲避任何错误。

你应该总是掩盖错误可能发生的基础:

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

至less你会更有可能修复错误,而不是让用户面对一个明显的丑陋的错误。

你不需要防止这个错误消息!
错误消息是你的朋友!
没有错误信息,你永远不会知道发生了什么。
没关系! 任何工作代码应该抛出错误信息。

虽然错误消息需要适当的处理。 通常你不必采取任何特殊的行动来避免这样的错误信息。 只要保持你的代码完好无损。 但是,如果您不希望向用户显示此错误消息,请将其closures。 不是错误消息本身,但daislaying给用户。

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

甚至更好的.htaccess / php.ini级别
用户将永远不会看到任何错误消息。 虽然你仍然可以在错误日志中看到它。
请注意,在这两种情况下,error_reporting应该是最大值。

为了防止这个消息,你可以检查mysql_query的结果,只有在成功时才运行fetch_assoc。
但通常没有人使用它,因为它可能需要太多的嵌套if。
但是也可以有解决办法 – 例外!

但它仍然没有必要。 你可以保留你的代码,因为它应该没有错误的工作完成。

使用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 

如果你只是想压制一个函数的警告,你可以在前面添加一个@符号:

 <?php @function_that_i_dont_want_to_see_errors_from(parameters); ?>