我想写一个MySQL语句,例如:
SELECT * FROM someTable WHERE someId IN (value1, value2, value3, ...)
这里的技巧是我事先不知道 IN() 中有多少个值。
显然我知道我可以通过字符串操作生成查询,但是由于这将在循环中运行,我想知道是否可以使用 PDOPreparedStatement 来完成它。
就像是:
$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);
如果允许您在绑定期间将值数组传递给单个参数,则实际上将允许您更改 SQL 语句。这将是 SQL 注入的一个漏洞 - 毕竟没有什么可以保证所有数组值都是无辜的整数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)