2011-08-09 3 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 클래스처럼 보이는 방법의 예입니다. 준비하기 전에 수정하려면 쿼리 문자열을 가져 와서 원하는 내용을 편집 한 다음 문을 준비하십시오.

관련 문제