【问题标题】:PDO Query with in clause that contain an Array won't work [duplicate]带有包含数组的 in 子句的 PDO 查询将不起作用 [重复]
【发布时间】:2018-06-11 00:43:58
【问题描述】:

我有这个代码:

$Array=array();
array_push($Array,"Email1","Email2");
$Array=implode("','",$Array);
$Array="'$Array'";
echo "$Array" //Will output 'Email1','Email2'
$Check=$connection->prepare("SELECT ID FROM USERS WHERE EMAIL IN(:Array)");
$Check->execute(array(
    ':Array' => $Array,
));

这个查询不起作用,但如果我写:

$Check=$connection->prepare("SELECT ID FROM USERS WHERE EMAIL IN('Email1','Email2')");
$Check->execute(array(
    ':Array' => $Array,
));

这可行,但我不会绑定数组以避免 SQL 注入。 我该如何解决?

【问题讨论】:

  • 逗号分隔值不是好的设计。考虑规范化你的数据库

标签: php arrays pdo


【解决方案1】:

您不想将内爆列表绑定为一个元素,而是使用 ? 单独绑定每个值,因此语句的结尾将是 WHERE EMAIL IN (?,?)

$values  = ["Email1","Email2"];
# This should give you ?,?
$bindstr = implode(",",array_fill(0,count($values),'?'));
$query = $connection->prepare("SELECT ID FROM USERS WHERE EMAIL IN({$bindstr})");
# Use the raw values individually in the execute
$query->execute($values);

希望这会得到您正在寻找的结果。

【讨论】:

  • 非常感谢您的帮助,能否请您解释一下为什么在第一行中您使用了 [...],以及为什么在 IN CLAUSE 中添加 {..}。无论如何谢谢你的帮助,希望你有一个美好的一天:)
  • 哦,抱歉,较新版本的 php 中的 [] 与使用 array() 相同,因此 [ = array(] = )
  • 感谢您的澄清:)
  • 字符串中的{} 强制您在这些大括号内使用变量。我本来可以不用牙套,但最好还是用它们。用于复杂字符串:php.net/manual/en/…
  • 我不明白你是如何绑定这些值的?这个查询是否 100% 安全地防止 sql 注入?感谢阅读,抱歉再次打扰。
猜你喜欢
  • 2011-01-23
  • 2013-08-03
  • 2017-04-08
相关资源
最近更新 更多