PHP PDO MySQL IN (?,?,?

标签 php mysql pdo prepared-statement

我想写一个像这样的 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/

相关文章:

php - PDO::lastInsertId() 可能不准确吗?

php - 有条件地运行 php 代码

php - 添加 mysql_real_escape_string() 导致将空白值存储到数据库

php - Symfony 3.4 在我的包中使用 View

mysql - CakePHP - 在关系 HABTM 中具有复合名称的表

mysql使用内部连接选择最高的唯一值

php - 从 mysql 迁移到 PDO,不连接到 mysql 服务器

php - 如何阻止 MySQL 复制返回数组中每一列的条目?

php - 在 Google AppEngine for PHP 上处理图像

PHP 检查指定输入的电子邮件和 ID 是否与数据库中的匹配