Intereting Posts
PHP – преобразование специальных символов в объекты HTML Загрузка файла повреждена Таблица Xpath в таблице Проверка формы Codeigniter не показывает ошибку и перенаправляет на пустую страницу PHP написать двоичный ответ PHP mail () возвращает false, но ошибка не регистрируется тип контента 'text / xml; charset = utf-8 'не был ожидаемым типом' application / soap + xml; кодировка = UTF-8' Все изображения src запрос к скрипту php preg_match_all соответствует нескольким строкам и получает значения, записанные в двойных кавычках Изменение состояния флажка при загрузке страницы с использованием PHP перед другими функциями PHP: Как определить, содержит ли строка какие-либо специальные символы? Плагин Woocommerce – вложенные продукты для подкатегорий PHP и MySQL: сравнение месяца и дня с динамическим годом $ .post работает только с предупреждением Laravel 5: Artisan throw PDOException не смог найти драйвер

Ошибка PHP PDO при использовании заполнителей в предложении LIMIT запроса MySQL

$sql = "SELECT sql_calc_found_rows * FROM members". " ORDER BY username LIMIT :startRow, :numRows"; try { $st = $conn->prepare($sql); $st->bindParam(":startRow", $startRow, PDO::PARAM_INT); $st->bindParam(":numRows", $numRows, PDO::PARAM_INT); $st->execute(); } catch (PDOException $e) { die("Query failed: " . $e->getMessage()); } 

Здесь я получаю ошибку:

Ошибка запроса: SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «5» в строке 1.

LIMIT :startRow, :numRows имеет проблемы в :numRows .

Я пробовал как $st->bindParam и $st->bindValue , оба не работали.

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

 select sql_calc_found_rows * from select id, code, name, slug, info from products order by code 

вы получите следующую ошибку:

Ошибка SQL (1064): у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «select id, code, name, slug, info from products order by code» в строке 1

Но если вы меняете запрос на:

 select sql_calc_found_rows * from (select id, code, name, slug, info from products) v order by code 

это сработает.

Подводя итог, TBL_MEMBERS – это представление, которое должно быть помещено в круглые скобки и задано псевдоним (i мой псевдоним примера – «v»)

Я рекомендую посмотреть текст запроса SQL, который производит PDO. Вы можете сделать это с помощью общего журнала запросов MySQL.

Скорее всего, формальные типы $startRow и / или $numRows являются строками, а не целыми числами, и, следовательно, полученный запрос является чем-то вроде LIMIT '0', '5' (синтаксическая ошибка) вместо LIMIT 0, 5 (правильно).

Дело в том, что даже с PDO::PARAM_INT , когда формальный тип параметра не является целым ( is_int возвращает false ), PDO обертывает его в кавычки. Таким образом, перед тем, как intval их (например, с помощью intval ), вам необходимо intval параметры целым:

 $st->bindParam(":startRow", intval(trim($startRow)), PDO::PARAM_INT); $st->bindParam(":numRows", intval(trim($numRows)), PDO::PARAM_INT); 

Я решил его. I Тип casted :numRows placeholder.

$numRows=(int)$numRows; $sql = 'SELECT sql_calc_found_rows * FROM ' . TBL_MEMBERS .'ORDER BY'. $order .'LIMIT :startRow,:numRows'; try { $st = $conn->prepare($sql); $st->bindValue(":startRow", $startRow, PDO::PARAM_INT); $st->bindValue(":numRows", $numRows, PDO::PARAM_INT); $st->execute();

И это сработало. Я также заметил, что ' нужно использовать вместо " .