2011-08-09 50 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); 

的問題是如何修改查詢字符串(這是隻讀),並保存它,所以它可以得到以後執行?

這是我的擴展PDOStatement對象類看起來像一個例子:

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'你的新'準備'? – hakre

+0

這不是打算。如果要執行不同的查詢,則需要創建一個新的準備好的語句句柄。 – mario

+1

我想也許你不懂準備好的陳述。準備好的語句被髮送到保存它的服務器,等待數據插入並執行。一旦它準備好了,mySQL服務器就擁有了它 - 你不能再對它做任何事情。 – Erik

回答

3

你知道,我通常發現延長PDOStatement不是你最好的選擇。至少,子類PDOStatement意味着您需要子類PDO。它變得混亂。這樣做也沒有太大的好處 - 你不能修改原始查詢,PDOStatement不能真正被修改。

根據我的經驗,最好在PDO上編寫一個封裝程序,它將允許您操作內容。這會讓你操縱之前的字符串他們到達你想分頁的地步。這也恰好是大多數框架將使用PDO的方式。

2

一旦語句已經預備好,你不能修改它。如果您想在準備它之前修改它,請使用查詢字符串,通過它編輯您想要的內容,然後準備好您的語句。