Привет, я пытаюсь выбрать несколько случайных строк из таблицы, используя MySQL PDO, используя PHP
$query = $conn->prepare("SELECT * FROM `products` WHERE `cat` = :cat ORDER BY RAND() LIMIT :limit_to");
$query->bindParam(':limit_to', $limit, PDO::PARAM_INT);
$query->bindParam(':cat', $cat, PDO::PARAM_INT);
$stmt = $query->execute();
Однако это вызывает ошибку синтаксиса MySQL, как это,
"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 ''2'' at line 1"
В чем причина этой ошибки и почему? Я не вижу ничего плохого в
Проблема в том, что когда вы делаете $limit = $_REQUEST['limit'];
переменная $ limit имеет тип string
,
Например (оба содержат число, но тип переменной отличается):
$varInt = 2;
$varString = "2";
var_dump ($varInt);
var_dump ($varString);
prints:
int 2
string '2' (length=1)
Таким образом, ваше подготовленное заявление становится связанным с:
$limit = $_REQUEST['limit']; // $_REQUEST['limit'] = 2
$cat = 3;
SELECT * FROM `products` WHERE `cat` = :cat ORDER BY RAND() LIMIT :limit_to
Связано с: limit_to = ‘2’,: cat = ‘3’
Проблема в синтаксисе LIMIT. Символы » нарушают синтаксис. Вы должны быть уверены, что связываете целочисленную переменную с $ limit.
// do it in first place you have access to $_REQUEST['limit'] or other global arrays , for example $_GET, $_POST
$limit = intval($_REQUEST['limit']); // $_REQUEST['limit'] = 2
$cat = intval($blablabla); // or from any other source
$query = $conn->prepare("SELECT * FROM products WHERE
cat = :cat ORDER BY RAND()
LIMIT :limit_to");
$query->bindValue(':limit_to', $limit, PDO::PARAM_INT);
$query->bindValue(':cat', $cat, PDO::PARAM_INT);
$stmt = $query->execute();
p.s
Используйте bindValue (), это лучше в 99% случаев.
Других решений пока нет …