SQL LIMIT заданными параметрами в PHP с PDO
несколько дней, я перестал использовать функции mysql_*
(поскольку они устарели), и я изменил PDO
. У меня есть функция, которая делает query базу данных, но у меня возникли некоторые проблемы в использовании LIMIT
prepared statements.
Вот ошибка, которую я получаю:
Fatal error: Uncaught exception 'PDOException' with message SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near "0', '4" at line 1' in /home/yuran/public_html/avec/DatabaseContent.php:30 Stack trace: #0 /home/yuran/public_html/avec/DatabaseContent.php(30): PDOStatement->execute(Array) #1 /home/yuran/public_html/avec/inc/header.php(43): DatabaseContent->fetchSomeRows(Object(PDO), 'topics', 'topic_id', 'DSC', 0, 4) #2 /home/yuran/public_html/avec/index.php(7): require_once('/home/yuran/pub...') #3 {main} throw in /home/yuran/public_html/avec/DatabaseContent.php on line 30
это код моей функции.
<?php
private $sql = "SELECT * FROM ";
public function fetchSomeRows($conn, $table, $rowOrder, $direction, $initialLimit, $finalLimit)
{
$this->sql .= "{$table} ORDER BY :roworder :direction LIMIT :initiallimit, :finallimit";
$q = $conn->prepare($this->sql);
$q->execute(array(':roworder' => $rowOrder,':direction'=>$direction,':initiallimit'=>$initialLimit,':finallimit'=>$finalLimit));
$q->setFetchMode(PDO::FETCH_ASSOC);
return $q;
}
?>
1 answers
Проблема В том, что переменные LIMIT и OFFSET, передаваемые PARAM_STR
и это делает PDO добавить апострофы в цифрах, генерируется ошибка синтаксиса.
Решить просто использовать bindParam
для указания типа переменных, которые передаются.
$q->bindParam(':finallimit', (int)$finalLimit, PDO::PARAM_INT);
$q->bindParam(':initiallimit', (int)$initialLimit, PDO::PARAM_INT);
$q->execute();
Примечание: (int)
там, чтобы гарантировать, что переменные должны быть переданы функции, как int
.