计数行时出现Mysql错误

时间:2011-10-14 14:33:09

标签: php mysql-num-rows

我在尝试计算表格中的行时遇到问题。

变量$ username_me等于会话用户名。它们都不在if或else语句中。

我得到的错误是:

警告:mysql_num_rows()期望参数1为资源,布尔值在/home/*/public_html/**/sidebar.php第21行中给出

第21行是我粘贴的代码位中的最后一行。

//Count unread oneliners
$oneliners_sql = "SELECT * FROM oneliners WHERE to_user='$username_me' AND read=0";
$oneliners_query = mysql_query($oneliners_sql);
$oneliners_num = mysql_num_rows($oneliners_query);

3 个答案:

答案 0 :(得分:3)

如果没有启用magic_quotes_gpc(并且它们不应该,魔术引用是PHP的许多设计错误之一,现在它们已被弃用),黑客(或者很可能是机器人!)可以自由地改变您的查询,导致所有给你的网站带来麻烦。

解决这个严重问题的正确方法是使用Prepared Statements, for instance with PDO。或者,您可以使用mysql_real_escape_string:

$sql = "SELECT COUNT(*) FROM oneliners WHERE to_user='" . 
    mysql_real_escape_string($username_me) . "' AND `read`=0";

mysql_real_escape_string的问题在于你必须记住要经常使用它,而在准备好的陈述中,这些问题会得到照顾。此外,如果您不使用预准备语句,则可以使用intval清除整数输入。

让我再次强调一下:清理您的输入非常重要。你不应该相信来自用户的任何东西。

  • 您的问题是由mysql_query在查询失败时返回FALSE引起的。如果查询失败,mysql_query将返回FALSE而不是资源。您可以在资源上调用mysql_num_rows,而不是FALSE。 (来自手册:mysql_query()在成功时返回资源,如果出错则返回FALSE)。

  • 错误是由read字段名称引起的,因为它是reserved word。尝试用反引号(`)引用它,甚至更好,重命名它。

  • 要了解是否存在行,您可以使用COUNT(*)SELECT 1

对于COUNT,查询将始终返回值0或1(我假设您在to_user上有唯一索引),当然查询失败时除外。

$sql = "SELECT COUNT(*) FROM oneliners WHERE to_user='" . 
    mysql_real_escape_string($username_me) . "' AND `read`=0";

对于SELECT 1,如果行存在,查询将返回1,否则它将不返回任何行。

$sql = "SELECT 1 FROM oneliners WHERE to_user='" . 
    mysql_real_escape_string($username_me) . "' AND `read`=0 LIMIT 1";

使用哪一个取决于您是否需要计算行数,或者您只需知道行是否存在。如果有一个唯一的索引,那么它们在计算上应该非常相似。

答案 1 :(得分:1)

0.1。 read是mysql保留字,必须在反引号中引用:

$sql = "SELECT * FROM oneliners WHERE to_user='$username_me' AND `read`=0";

0.2。从不使用SELECT *来计算行数。改为使用SELECT count(*)。

0.3。始终以这种方式运行所有查询以查看是否发生了任何错误。

//Count unread oneliners
$sql = "SELECT count(*) FROM oneliners WHERE to_user='$username_me' AND `read`=0";
$result = mysql_query($sql) or trigger_error(mysql_error()." ".$sql);
$row = mysql_fetch_row($result);
$oneliners_num = $row[0];

尽管存在所有这些愚蠢的建议,但从不使用die()

0.4。为这样一个常规任务创建一个函数。

function getOne($sql) {
  $result = mysql_query($sql) or trigger_error(mysql_error()." ".$sql);
  if ($row = mysql_fetch_row($result)) {
    return $row[0];
  }
}

所以,你将能够用一行获得你的数字

$oneliners_num = getOne("SELECT count(*) FROM oneliners WHERE to_user='$username_me' AND `read`=0");

答案 2 :(得分:-1)

mysql_query返回 false 而不是mysql结果。因此,您的查询或连接存在一些错误。您可能会使用mysql_error

读取错误