2012-05-03 17 views
2

我正在使用此方法來獲取SELECT語句的行計數,但它對LIMIT語句無法正常工作,所以我添加了代碼以從LIMIT語句中刪除LIMIT SQL字符串,但現在它根本不工作!無法理解在php/mysql中返回的0行

當我在最後開始使用帶有LIMIT X, X的查詢時,必須在頂部添加部分以從查詢中去除該部分,因爲此方法只返回一列 - 但是LIMIT偏移量會導致它沒有任何回報。

function dbRowsCount($sql, $data) { 

    # removes "LIMIT X,X" from query 
    $no_limit_sql = $sql; 
    $pos = stripos($sql, " LIMIT"); 
    if ($pos!==false) { 
     $no_limit_sql = substr($sql, 0, $pos).";"; 
     # logErrors("original sql=".$sql); 
     # logErrors("pos=".$pos."<br>new sql=".$no_limit_sql); 
    } 

    # query SELECT COUNT(*) instead of SELECT... 
    # returns row-count 
    $regex = '/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/is';  
    if (preg_match($regex, $no_limit_sql, $output) > 0) { 
     dbQuery("SELECT COUNT(*) AS count FROM {$output[1]}", $data); 
     $result = dbFetch(); 
     $last_rowcount = (int)$result["count"]; 
     if ($pos!==false) { 
      # logErrors("after regex="."SELECT COUNT(*) AS count FROM {$output[1]}"); 
      # logErrors("row count=".$last_rowcount); 
     } 
     return $last_rowcount; 
    } else { 
     # logErrors("Oops! There was an error:<br>Regex did not match SQL."); 
     return -1; 
    } 
} 

這直接放入MySQL允許計數= 8:

SELECT COUNT(*) AS count FROM tbl_product WHERE 1 ORDER BY last_update DESC; 

dbRowsCount($sql, $data)方法的輸出顯示此查詢應該結束了相同的:

原來的SQL = SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC LIMIT?,?;
pos = 59
new sql = SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC;
regex = SELECT COUNT(*)AS count FROM tbl_product WHERE 1 ORDER BY last_update DESC;
行數= 0

這是工作之前,它返回rows=8沒有我添加了從查詢刪除「LIMIT X,X」的部分,但只有當限爲0,X。當我嘗試使用LIMIT 5,5時,它不會因爲偏移量而獲取列,現在它爲任何值返回0行。

我也直接用PDO試過這個,它對int和string參數都能正確工作!但是使用PDOStatement-> rowCount()。 (不建議用於SELECT查詢,所以我使用了上面的dbRowsCount方法)。

function dbDebugTest() { 
    global $db; 
    # logErrors("Beginning dbDebugTest()"); 
    $stmt = $db->prepare("SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC LIMIT ?,?"); 
    $offset = "5"; 
    $display = "5"; 
    $stmt->execute(array($offset,$display)); 
    # logErrors("dbDebugTest() returned rows: ".$stmt->rowCount()); 
} 

什麼導致第一種方法返回0行?

回答

0

我能看到的全部是當LIMIT存在時,在查詢後面添加一個分號。也許這是你的問題的原因。

如果這不是問題,假設dbQuerydbFetch工作正常且沒有更改,您的表是空的? :)

OP回答我還在轉發$data陣列查詢時沒有PARAMS了(因爲我刪除LIMIT X,X)

+0

輸出顯示了它出來,雖然正確? 'new sql = SELECT * FROM tbl_product WHERE 1 ORDER BY last_update DESC;' – Ozzy

+0

正確的,在MySQL提示符下工作。但是它可能在'mysql_query()' –

+0

中不一樣,爲什麼不呢?這是一個沒有參數的查詢。這是PDO而不是mysql_query。 – Ozzy