【问题标题】:PHP PDO MySQL IN (?,?,?PHP PDO MySQL IN (?,?,?
【发布时间】:2011-02-18 08:36:24
【问题描述】:

我想写一个 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));

这可能吗?

【问题讨论】:

    标签: php mysql pdo prepared-statement


    【解决方案1】:

    这是不可能的,你尝试的方式。对于要传入的每个参数,您必须有一个单独的占位符,否则一切都会违背参数的目的(将代码与数据分开)。

    $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 注入的漏洞——毕竟,没有什么能保证所有数组值都是无辜的整数。

    【讨论】:

    • @nute:好吧,如果它有效的话......也许 PDO 有一个特殊的功能(我不知道)。我建议您仔细阅读这方面的文档,因为如果定义的参数少于您输入的数据位,它确实是 SQL 注入的潜在入口点。
    猜你喜欢
    • 2015-09-07
    • 2013-07-18
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多