如何防止此错误:警告:mysql_fetch_assoc() 期望参数 1 为资源,第 11 行 ... 中给出的布尔值[重复]

问题描述 投票:0回答:6

我对这个错误感到非常困惑,它显示当我尝试从不存在的数据库返回结果时......我尝试了

mysql_num_rows()
但它返回相同的错误,但不是
mysql_fetch_assoc
期望.. .它说
mysql_num_rows()
期望 ...

我设置了

error_reporting(0)
以避免显示此错误,但我对这个解决方案不满意......

php mysql warnings
6个回答
13
投票

以下是正确的做事方法:

<?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 是一个布尔值,那么它肯定是假的,这意味着存在数据库错误,这意味着你的查询可能是错误的。


1
投票

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

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

您可以使用

@mysql_fetch_assoc($r)
来避免显示错误。


1
投票

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

$result = mysql_query($query);

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

$result should 是一个资源。即使查询没有返回任何行,$result 仍然是一个资源。 $result 唯一一次是布尔值,是在查询数据库时是否出现错误。在这种情况下,您应该使用 mysql_error() 找出错误是什么,并确保它不会发生。那么您就不必隐藏任何错误。

您应该始终通过执行以下操作来掩盖可能发生的错误:

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

至少这样你就更有可能真正修复错误,而不是让用户脸上留下明显的丑陋错误。


0
投票

正确的语法是(示例):

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

0
投票

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

虽然错误消息需要适当的处理。 通常您不必采取任何特殊操作来避免此类错误消息。只需保持您的代码完好无损即可。 但如果您不希望向用户显示此错误消息,只需将其关闭即可。不是错误消息本身,而是向用户展示它。

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

-2
投票

如果你只是想抑制某个函数的警告,你可以在前面添加一个

@
符号:

<?php @function_that_i_dont_want_to_see_errors_from(parameters); ?>
© www.soinside.com 2019 - 2024. All rights reserved.