2011-10-14 54 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