代码之家  ›  专栏  ›  技术社区  ›  Nathan H

PHP PDO MySQL在(?,?,?

  •  4
  • Nathan H  · 技术社区  · 14 年前

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

    1 回复  |  直到 14 年前
        1
  •  6
  •   Tomalak    14 年前

    你这样做是不可能的。对于要传递的每个参数,都必须有一个单独的占位符,其他一切都会违背参数的目的(即将代码与数据分离)。

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