$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();
И это сработало. Я также заметил, что '
нужно использовать вместо "
.