PHP PDO MySQL IN(?,?,?

Nat*_*n H 4 php mysql pdo prepared-statement

我想写一个MySQL语句,如:

SELECT * FROM someTable WHERE someId IN (value1, value2, value3, ...)
Run Code Online (Sandbox Code Playgroud)

这里的诀窍是我提前不知道IN()中会有多少个值.

显然我知道我可以随时使用字符串操作生成查询,但是由于这将在循环中运行,我想知道我是否可以使用PDO PreparedStatement来完成.

就像是:

$query = $PDO->prepare('SELECT * FROM someTable WHERE someId IN (:idList)');
$query->bindValue(':idList', implode(',', $idArray));
Run Code Online (Sandbox Code Playgroud)

那可能吗?

Tom*_*lak 6

这是你尝试的方式不可能的.您必须为要传入的每个参数都有一个单独的占位符,其他一切都会违反参数的目的(这是将代码与数据分开).

$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);
Run Code Online (Sandbox Code Playgroud)

如果允许在绑定期间将值数组传递给单个参数,则可以有效地允许更改SQL语句.这将是SQL注入的漏洞 - 毕竟没有什么能保证所有数组值都是无辜的整数.