0

尝试计算表中的行数时出现问题。

变量 $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);
4

3 回答 3

3

如果没有启用magic_quotes_gpc(它们不应该启用,魔术引号是PHP的众多设计错误之一,现在已被弃用),黑客(或者很可能是机器人!)可以随意更改您的查询,从而导致各种麻烦到您的网站。

解决这个严重问题的正确方法是使用准备好的语句,例如使用 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 而不是 resource。您可以在资源上调用 mysql_num_rows,而不是在 FALSE 上。(来自手册:mysql_query() 成功时返回资源,错误时返回 FALSE)。

  • 该错误是由read字段名称引起的,因为它是一个保留字。尝试用反引号 (`) 引用它,或者更好的是,重命名它。

  • 要找出一行是否存在,您可以使用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";

使用哪一个取决于您是需要行数还是只需要知道行是否存在。如果存在唯一索引,则无论如何它们在计算上应该非常相似。

于 2011-10-14T14:36:05.413 回答
1

.1。read是mysql的保留字,必须用反引号引起来:

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

.2. 永远不要使用 SELECT * 来计算行数。请改用 SELECT count(*)。

.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()尽管有所有这些愚蠢的建议,但永远不要用于此目的。

.4. 为此类常见任务创建一个函数。

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

所以,你可以用一行得到你的 num

$oneliners_num = getOne("SELECT count(*) FROM oneliners WHERE to_user='$username_me' AND `read`=0");
于 2011-10-14T14:44:32.460 回答
-1

mysql_query返回mysql 结果的错误插入。因此,您的查询或连接存在一些错误。您可能会阅读错误mysql_error

于 2011-10-14T14:35:41.690 回答