2011-08-09 8 views
2

PDOクラスを拡張して、プリペアドステートメントのクエリーストリングを操作する関数を追加します。たとえば、クエリを検索可能にするか、ページネーションを追加します。例えばPDOでプリペアドステートメントのクエリーストリングを変更する

$documents_query = $DB->prepare("SELECT id, title, file_name, datetime_added 
            FROM documents 
            ORDER BY datetime_added DESC"); 

$documents_query->paginate($page_number, RESULTS_PER_PAGE); 

は、質問は(読み取り専用である)クエリ文字列を変更して保存する方法ですので、後で実行することができますか?ステートメントが準備されたら

class CustomStatement extends PDOStatement 
{ 
    public function paginate($current_page, $max_results) 
    { 
     // Add SQL_CALC_FOUND_ROWS so we can count the total amount of results 
     $select_index = stripos($this->queryString, 'SELECT'); 

     $statement = substr_replace($this->queryString, 'SELECT SQL_CALC_FOUND_ROWS', $select_index, 6); 

     // Add LIMIT to the end of the query 
     $start_limit = ($current_page - 1) * $max_results; 

     $statement = $statement . ' LIMIT ' . $start_limit . ', ' . $max_results; 

     // What to do here? 
     return $this->prepare($statement); 
    } 
} 
+0

'paginate'はあなたの新しい' prepare'ですか? – hakre

+0

それは意図されていません。別のクエリを実行する場合は、新しいプリペアドステートメントハンドルを作成する必要があります。 – mario

+1

私はおそらく、あなたは準備文を理解していないと思います。準備されたステートメントはサーバーに送信され、サーバーはデータを保持し、データの挿入と実行を待ちます。準備が整ったら、mySQLサーバーにはそれがあります。もう何もできません。 – Erik

答えて

3

あなたは知っていますが、私は一般的にPDOStatementの拡張があなたの最善の選択肢ではないことを認識しています。最低でもPDOStatementをサブクラス化することは、PDOをサブクラス化する必要があることを意味します。それは乱雑になる。また、実際にそれほど多くの利点はありません - 元のクエリを変更することはできません、PDOStatementは本当に変更することはできません。

私の経験上、PDOの周りにラッパーを書いて、内容を操作することができます。これにより、の文字列をの前に操作できるようになります。ページングする場所に移動します。これは、ほとんどのフレームワークがPDOを使用する方法でもあります。

2

、あなたはそれを変更することはできません。

これは私の拡張をPDOStatementクラスがどのように見えるかの例です。準備の前に変更する場合は、クエリ文字列を取り、必要なものを編集してから、文を準備します。