2011-10-14 51 views
0

尝试对表中的行进行计数时出现问题。计数行时发生Mysql错误

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

更改第二行'$ oneliners_query =请求mysql_query($ oneliners_sql)或死亡(mysql_error()),以获得您的NUM;' – JJJ

+0

你的SQL语法有错误;检查对应于您的MySQL服务器版本的手册,以便在第1行'read = 0'处使用正确的语法。 但是我也尝试过读='0',并且不起作用 – Kaizokupuffball

+0

接下来做'echo $ oneliners_sql;'。问题可能是'$ username_me'。 – JJJ

回答

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]; 
    } 
} 

那么,你就可以用一条线

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

谢谢你这么好的答案! – Kaizokupuffball

+0

Hi @ Col.Shrapnel,刚刚编辑了一些小的错别字,希望你不介意:-) – stivlo

-1

mysql_query返回 instread MySQL的结果。所以,你的查询或连接有一些错误。您可以读取错误与mysql_error

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"; 

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

+0

请问下载者请解释原因? – stivlo

+0

是的刚刚读了这个问题,然后看到我的答案!问题出在' –

+0

@waqaralamgir,我提到它:“错误是由读字段名称引起的,因为它是一个保留字。尝试用反引号(')引用它,甚至更好,重命名它。”无论如何,避免反驳的话是个好主意。 – stivlo