2016-07-28 29 views
1

現在我已經很容易地使用PDO和SQL服務器完成了這個任務,但是我正在努力爲任何常規查詢正確工作。由於我確實希望這可以通過我們的MySQL表格在任何項目中重複使用,因此我在此尋求幫助。獲取正確的總行數和分頁行號

所以順便我用了PDO和SQL服務器

function pagedQuery($dbh,$q,$sort,$offset,$limit,$params = array()) { 
    $limit = preg_replace("/[^0-9]]/","",$limit); 
    $offset = preg_replace("/[^0-9]]/","",$offset); 
    $q = preg_replace("/^[^\w]*SELECT/i","SELECT COUNT(*) OVER() as num_rows, ROW_NUMBER() OVER(ORDER BY $sort) AS rownum,",$q); 
    $q = "SELECT * FROM (".$q.") as pagingTable WHERE rownum > $offset AND rownum <= ($offset+$limit)"; 

    ## Prepare Query 
    $stmt = $dbh->prepare($q); 

    try { 
     $stmt->execute($params); 
    } catch(PDOException $e) { 
     print $e->getMessage(); 
    } 

    ## Return Results 
    return $stmt->fetchAll(); 

現在很明顯的OVER功能不存在,MySQL和這必須修改。這是我的一個新版本的嘗試:

function mysqlPagedQuery($dbh,$q,$table,$sort,$offset,$limit,$params = array()) { 
    $limit = preg_replace("/[^0-9]]/","",$limit); 
    $offset = preg_replace("/[^0-9]]/","",$offset); 
    $q = preg_replace("/^[^\w]*SELECT/i","SELECT (SELECT COUNT(*) as num_rows FROM ".$table.") AS num_rows, @rowN := @rowN + 1 AS rownum,",$q); 
    $q = "SELECT * FROM (".$q.") as pagingTable WHERE rownum > $offset AND rownum <= ($offset+$limit)"; 

    ## Prepare Query 
    $stmt = $dbh->prepare($q); 

    try { 
     $query = $dbh->query("set @rowN = 0;"); 
     $stmt->execute($params); 
    } catch(PDOException $e) { 
     print $e->getMessage(); 
    } 

    ## Return Results 
    return $stmt->fetchAll(); 

現在這「工作」因爲你給它一個表,但我很快就意識到了NUM_ROWS將不會返回正確的值,除非給出所有的WHERE子句發送到它的查詢。我將不得不以低效的方式解析這個問題,我覺得有一種更簡單的方法可以做到這一點,而不是我所做的。

+3

** WARNING **:當使用PDO,你應該使用的方法制得的語句(HTTP:// php.net/manual/en/pdo.prepared-statements.php),並提供任何用戶數據作爲單獨的參數。在此代碼中,您可能會遇到嚴重的[SQL注入漏洞](http://bobby-tables.com /)。不要使用字符串插值或連接,而是使用[prepared statements](http://php.net/manual/en/pdo.prepared-statements.php),並且不要使用'$ _POST'或'$ _GET'數據直接在你的查詢中,請參考[PHP正確的方法](http://www.phptherightway.com/)獲取有關此問題和其他問題的指導。 – tadman

+0

不知道我是否正確閱讀此內容。你是否將Microsoft SQL Server的某些東西轉換爲MySQL的東西? – tadman

+0

也許考慮限制和抵消。 [這可能是這樣](http://www.petefreitag.com/item/451.cfm) – bobkingof12vs

回答

0

我結束了這個感謝bobkingof12vs發佈的鏈接。不能給的答案信貸給他直接,因爲它沒有張貼在這裏:(

function mysqlPagedQuery($dbh,$q,$sort,$offset,$limit,$params = array()){ 


$limit = preg_replace("/[^0-9]]/","",$limit); 
$offset = preg_replace("/[^0-9]]/","",$offset); 
//need to use the original query a few times to create paged 
$tempQuery = $q; 
//replaces query's select with a count to get numrows 
$q1 = "SELECT sql_calc_found_rows * FROM (".$tempQuery.") AS tempTable"; 
## Prepare Query 
$stmt1 = $dbh->prepare($q1); 

$q2 = preg_replace("/^[^\w]*SELECT/i","SELECT FOUND_ROWS() as num_rows,",$tempQuery); 
$q2 .= " ORDER BY ".$sort; 
$q2 .= " LIMIT ".$offset.",".$limit; 
//print $q2; 
## Prepare Query 
$stmt2 = $dbh->prepare($q2); 

try{ 
    $stmt1->execute(); 
    $stmt2->execute($params); 

} 
catch(PDOException $e){ 
    print $e->getMessage(); 
} 

## Return Results 
return $stmt2->fetchAll(); 

}