2011-06-05 31 views
0

我得到的錯誤:Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in.... on line ..MySQL數字行在if語句中發出警告?

請你能告訴我我做錯了什麼導致這個。我不相信我是。

 if (mysql_num_rows(mysql_query("SELECT * FROM Likes WHERE `postID` = '$postID' AND `userID` = '$accountID'")) < 1) { 
      exit("Cant like a post twice"); 
     } 
+0

mysql_query返回布爾值如果查詢因任何原因導致錯誤,則返回布爾值。將結果傳遞給mysql_num_rows將導致此錯誤,因爲num_rows需要一個語句句柄,但會得到錯誤條件FALSE。 – 2011-06-05 23:40:06

回答

2

您也可以直接從數據庫中,這是更有效然後選擇所有的行選擇數以簡化您的SQL ,然後計算計

$res = mysql_query("SELECT COUNT(*) FROM Likes WHERE 
         `postID` = '$postID' AND `userID` = '$accountID'"); 

// check for mysql errors 
if (mysql_error()) { 
    die(mysql_error()); 
} 

list($count) = mysql_fetch_row($res); 
1

不要像那樣嵌套調用。前

mysql_query("SELECT * FROM Likes WHERE 
         `postID` = '$postID' AND `userID` = '$accountID'") 
or die(mysql_error()); 

運行檢查什麼是錯誤。

檢查錯誤,我更喜歡這種符號(如註釋說明)

$res= mysql_query("SELECT * FROM Likes WHERE 
          `postID` = '$postID' AND `userID` = '$accountID'"); 

    if(!is_resource($res)) 
    die(mysql_error()); 
+6

這個醜陋的''或die()'錯誤處理需要死亡。或者實際上,'mysql_ *'函數需要死掉 - 至少除非它們使用了正確的包裝。 – ThiefMaster 2011-06-05 23:00:28

+0

@thief +1。我從來沒有使用過。我只是用在這裏,因爲很短 – dynamic 2011-06-05 23:01:01

1

首先,我希望你正確地逃脫你的$和帖子ID $帳戶ID在您的查詢,就好像不是你開了一個大門口SQL注入。

然後,您應該在將查詢結果直接放入mysql_num_rows之前檢查其結果。我想你在查詢(或連接)中有錯誤,然後你最終調用mysq_num_rows(false)。 嘗試使用mysql_error檢查查詢是否返回錯誤。 這是否提供更多信息?

2

正如yes123所示,mysql_error()會給你原因。但有兩點意見:

  • 您不應該使用mysql_num_rows()來計算結果集。相反,發出SELECT COUNT(*)並檢查返回的值。這樣更有效率。

  • 對於您的特定問題,有一個更好的解決方案:只需在(postID,userID)字段中添加一個UNIQUE鍵,即可跳過此測試。相反,只需嘗試插入新記錄,然後檢查mysql_errno()值。如果它返回0,那麼插入工作;如果它返回1062(ER_DUP_ENTRY),則插入失敗,因爲相似的記錄已經存在。