Как использовать подготовленный оператор для установки значений выборки и смещения с помощью PDO sqlsrv? - PullRequest
4 голосов
/ 25 мая 2019

Я пытаюсь использовать подготовленные операторы, передавая значения, используя параметры для установки смещения и предела (следующие строки):

$statement = $pdo->prepare('SELECT * FROM livro ORDER BY id OFFSET :offset ROWS FETCH NEXT :limit ROWS ONLY');
$statement->execute(['offset' => 0, 'limit' => 5]);
$livro = $statement->fetch();

Ошибка возвращается:

Количество предоставленных строкдля предложений TOP или FETCH параметр количества строк должен быть целым числом.

Но если я попробую жесткое кодирование:

$statement = $pdo->prepare('SELECT * FROM livro ORDER BY id OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY');
$statement->execute();
$livro = $statement->fetch();

Хорошо работает, я знаю, что при использовании mysql необходимо использовать PDO::ATTR_EMULATE_PREPARES => false работает на пределе.Но я попытался использовать sqlsrv и получил ошибку:

Данный атрибут поддерживается только для объекта PDOStatement

Есть ли способ использовать подготовленный оператор для установкиизвлекать и смещать значения с помощью PDO sqlsrv?

Моя среда: Windows 10, PHP 7.3, MSSQL 2014

Ответы [ 2 ]

3 голосов
/ 25 мая 2019

Попробуйте это:

$statement = $pdo->prepare('SELECT * FROM livro ORDER BY id OFFSET CAST(:offset AS INT) ROWS FETCH NEXT CAST(:limit AS INT) ROWS ONLY');
$statement->execute(['offset' => 0, 'limit' => 5]);
$livro = $statement->fetch();
0 голосов
/ 25 мая 2019

Вы смешиваете несколько способов сделать готовые заявления.Попробуйте это:

// You could have your values in variables (or hardcoded)
$offset = 0;
$limit = 5;

$statement = $pdo->prepare('SELECT * FROM livro ORDER BY id OFFSET :offset ROWS FETCH NEXT :limit ROWS ONLY');

// Next you need to bind the values
$statement->bindValue(':offset', (int) $offset, PDO::PARAM_INT); 
$statement->bindValue(':limit', (int) $limit, PDO::PARAM_INT); 

// Now execute your statement
$statement->execute();

Когда вы используете ? вместо чего-то вроде :limit, вы можете затем передать массив значений для выполнения, и он будет обрабатывать привязку автоматически - но этот способ позволяет вампринудительно введите тип данных.

Подробнее: https://www.php.net/manual/en/pdo.prepared-statements.php


Что касается вашего комментария, вы можете попробовать следующее, но если я правильно помню, когда в последний раз я пробовал егос LIMIT и OFFSET это не сработает.Я полагаю, что-то нехорошее в реализации.В любом случае, попробуйте:

$offset = 0;
$limit = 5;
$q = "SELECT * FROM livro ORDER BY id OFFSET ? ROWS FETCH NEXT ? ROWS ONLY";
$stmt = $pdo->prepare($query);
$stmt->execute([$offset, $limit]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...