PHP,Python中的Mysql IN子句参数化

Posted

技术标签:

【中文标题】PHP,Python中的Mysql IN子句参数化【英文标题】:Mysql IN clause parameterization in PHP, Python 【发布时间】:2016-06-17 10:32:39 【问题描述】:

我习惯于对我的查询执行以下操作:

$array = array(123,456,10,57,1024,768); //random data
$sql = "select * from table where field in(".implode(',',$array).")";
mysql_query($sql);

这很好用,即使数组可能有 1,000 个或更多项要搜索(实际上是针对不存在的表的连接),它也很快。 对我来说,这非常有用,因为我将来自多个来源的数据连接在一起。

但是,我知道这有点不安全——如果我没有正确转义传入的数据,则可能会发生 SQL 注入。

我想尝试找出一个参数化的等价物;使用更“强化”的代码来完成这种“数组输入”的某种方式。

可能无法直接执行此操作,它可能需要一个辅助函数来进行替换。如果是这样,我正在寻找一个可以放入我的代码的好方法,希望它能让我只传递一个数组作为参数。

虽然我的示例是针对 php 的,但我还需要为 Python 弄清楚这一点,因为我在那里做同样的事情。

我在这里读过一些类似的问题,但没有看到任何(好的)答案。

【问题讨论】:

使用 PDO,您可以轻松扩展 PDOStatement 并添加一个方法来为 IN 子句构建 SQL 字符串。显示在 Barmar 的回答中。 【参考方案1】:

使用 PDO 准备好的语句:

$placeholders = str_repeat('?, ', count($array)-1) . '?';
$stmt = $pdo->prepare("SELECT * FROM table WHERE field IN ($placeholders)");
$stmt->execute($array);

$placeholders 将包含一系列?, ?, ? 占位符,? 的数量与数组的大小相同。然后当你执行语句时,数组值被绑定到占位符上。

【讨论】:

【参考方案2】:

我亲自做过:

$in = substr(str_repeat('?,', count($array)), 0, -1);

$sql = "SELECT * FROM table WHERE field IN ($in)";

这将为您提供每个数组元素的?, 并删除结尾的逗号。

【讨论】:

以上是关于PHP,Python中的Mysql IN子句参数化的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的空IN子句参数列表

使用 JDBC 参数化 IN 子句的最佳方法是啥? [复制]

使用带有休眠 SQL 查询的多列的参数化 IN 子句

Where子句Mysql中的逗号分隔字符串参数过滤器

为python中的参数化查询生成变量长度放置保持器字符串[重复]

HQL 或 Java 持久性查询语言中的 IN 子句