2016-07-28 5 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(); 

は今、この「仕事」は、あなたがそれを表に出すことを考えるだろうが、私はすぐのWHERE句のすべてを与えられない限り、NUM_ROWSが正しい値を返さないことに気づきましたそれに送られたクエリ私はそれを非効率的な方法で解析しなければならないでしょう。私は、これを行うより簡単な方法があると感じています。

+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(); 

を}

関連する問題