如何防止此错误:警告: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); ?>