PHP MySQL Bindparam 中的 PDO 语法错误
PHP MySQL PDO syntax error in Bindparam
嗨,我正在尝试 select 使用 MySQL PDO PHP
table 中的一些随机行
$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 语法中。 Symbols '' 破坏语法。您必须确保将整数变量绑定到 $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% 的情况下效果更好。
嗨,我正在尝试 select 使用 MySQL PDO PHP
table 中的一些随机行$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 语法中。 Symbols '' 破坏语法。您必须确保将整数变量绑定到 $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% 的情况下效果更好。