Изменение строки запроса подготовленного оператора с помощью PDO - PullRequest
2 голосов
/ 09 августа 2011

Я расширяю класс 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 );
    }
}

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Вы знаете, я обычно нахожу, что расширение PDOStatement - не ваш лучший вариант. Как минимум, подкласс PDOStatement означает, что вам нужно создать подкласс PDO. Это становится грязным. В этом нет особой выгоды - вы не можете изменить исходный запрос, PDOStatement не может быть действительно изменен.

По моему опыту, лучше написать оболочку для PDO, которая позволит вам манипулировать содержимым. Это позволит вам манипулировать строками до того, как они достигнут точки, в которой вы хотите разбивать на страницы. Так же бывает, что большинство фреймворков будут использовать PDO.

2 голосов
/ 09 августа 2011

Как только заявление подготовлено, вы не можете его изменить.Если вы хотите изменить его до его подготовки, возьмите строку запроса, отредактируйте то, что вы хотите, и затем подготовьте свое утверждение.

...