我想写一个像这样的 MySQL 语句:
SELECT * FROM someTable WHERE someId IN (value1, value2, value3, ...)
这里的技巧是我不知道 IN() 中会有多少个值。
显然我知道我可以通过字符串操作随时生成查询,但是由于这将在循环中运行,我想知道我是否可以使用 PDO PreparedStatement 来完成它。
类似于:
$query = $PDO->prepare('SELECT * FROM someTable WHERE someId IN (:idList)');
$query->bindValue(':idList', implode(',', $idArray));
这可能吗?
最佳答案
这不可能是你尝试的方式。对于要传入的每个参数,您必须有一个单独的占位符,其他所有内容都会违背参数的目的(将代码与数据分开)。
$ids = array(2, 4, 6, 8);
// prepare a string that contains ":id_0,..,:id_n" and include it in the SQL
$plist = ':id_'.implode(',:id_', array_keys($ids));
$sql = "SELECT * FROM someTable WHERE someId IN ($plist)";
// prepare & execute the actual statement
$parms = array_combine(explode(",", $plist), $ids);
$stmt = $PDO->prepare($sql);
$rows = $stmt->execute($parms);
如果您被允许在绑定(bind)期间将一组值传递给单个参数,那么您将有效地被允许更改 SQL 语句。这将成为 SQL 注入(inject)的漏洞 - 毕竟,没有什么可以保证所有数组值都是无辜的整数。
关于PHP PDO MySQL IN (?,?,?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2814466/