2012-02-24 47 views
0

上午決策功能,使用「WHERE」計算行,但我得到一個MySQL錯誤功能使用計數的MySQL行,其中

警告:mysql_num_rows():提供的參數是不是在C一個有效的MySQL結果資源:\在9號線 未知列 '1' 的appserv \ WWW \測試\測試\的index.php 'where子句'

這裏是我的功能

function CountRows($table, $field = NULL, $value = NULL){ 
     mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD); 
     mysql_select_db(DB_NAME); 
     if($field != NULL && $value != NULL){ 
      return mysql_num_rows(mysql_query("SELECT * FROM `".$table."` WHERE `".$field."` = `".$value."`"))or die(mysql_error()); 
     }else{ 
      return mysql_num_rows(mysql_query("SELECT * FROM `".$table."`")); 
     } 
    } 

我已經創建了此功能,以簡化計算行MySQL行禁止成員,非活動成員等,因爲所有將使用WH ERE

所有幫助將提前讚賞,感謝

+0

您可以發佈完整的查詢,請?此外,由於您已經使用雙引號,請爲自己做個忙,並將其中的變量(或使用單引號並將變量保留在原來的位置)。 – SenorAmor 2012-02-24 19:19:03

+0

您需要向我們顯示導致錯誤的實際查詢。另外,你不應該用反引號來包圍價值觀,而應該只用單引號。 – kba 2012-02-24 19:19:21

+0

你能打印出mysql_query中發送的實際查詢嗎? 「ON子句」錯誤似乎很奇怪 – Tchoupi 2012-02-24 19:20:05

回答

1
  1. 你不應該在每次你需要做一個查詢的時間連接到數據庫..只要保持一個持久連接或理想使用PDO。

  2. 值應該用簡單的單引號括起來。這可能是你得到一個錯誤的原因,因爲引號中的任何內容都被認爲是數據庫/表/字段名稱。

  3. 使用COUNT(*),它不會獲取所有數據庫行。

  4. 如果值可能由用戶提供,請確保使用mysql_real_escape_string進行轉義(如果不使用PDO)以確保安全。

不使用PDO的代碼是:

mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD); 
mysql_select_db(DB_NAME); 

function CountRows($table, $field = NULL, $value = NULL){ 

    if ($field != NULL && $value != NULL) { 
     $query = "SELECT COUNT(*) 
        FROM `".$table."` 
        WHERE `".$field."` = '". mysql_real_escape_string($value) . "'"; 
    } else { 
     $query = "SELECT COUNT(*) FROM `".$table."`"; 
    } 

    $count = mysql_fetch_array(mysql_query($query)); 
    return $count[0]; 
} 
+0

謝謝,功能是有點生病大聲笑,我解決問題我得到另一個,但我已經使用你的,它很好,謝謝 – Yusuf 2012-02-24 19:34:50

1

反引號(')是封閉表和列名。請勿將$value包裝在其中,只需使用單引號(')。

此外,沒有理由需要從數據庫中提取完整的數據集並對其中的行進行計數。剛剛查詢計數:

if($field != NULL && $value != NULL){ 
     $cnt = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) as cnt FROM `".$table."` WHERE `".$field."` = '".$value."'"))or die(mysql_error()); 
    }else{ 
     $cnt = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) as cnt FROM `".$table."`")); 
    } 
    return $cnt['cnt']; 
+0

是真的,一切都很好,因爲我從表格,列,值中刪除了' 謝謝:) – Yusuf 2012-02-24 19:29:25

1

此外:

  1. 不要在功能連接/選擇數據庫。這應該在每頁開始時執行一次,不再需要(除非需要多個連接)。

  2. 不要SELECT *只是讓你可以計算行數。改用MySQL的COUNT()函數。

    $result = mysql_query("SELECT COUNT(0) AS numRows FROM aTable"); 
    $numRows = mysql_result($result, 0, 'numRows'); 
    
  3. 不要使用與用戶輸入的功能,沒有采取適當的行動,以確保自己免受SQL注入。

+0

謝謝大家,修復以下問題後解決了以下問題 1-Removed'前後表格,字段名稱 2 - 而不是mysql_num_rows,使用COUNT(*) 感謝所有的幫助:) – Yusuf 2012-02-24 19:27:29

+0

我會嘗試改進使用您的提示功能,謝謝 – Yusuf 2012-02-24 19:31:59