【问题标题】:Difficulty using IN() operator with an imploded array - mySQL [duplicate]难以将 IN() 运算符与内爆数组一起使用 - mySQL [重复]
【发布时间】:2014-11-19 12:08:25
【问题描述】:

对可能重复的问题的回应 - 请注意,虽然对于一些(也许更有经验的)程序员来说,这可能看起来像是一个重复的问题,但对于像我这样的菜鸟来说却不是 :-(被指示为重复的问题并没有解决我的问题,而接受的答案完美地解决了问题。


根据许多 SO 帖子(包括 this one),为了使用 IN() 运算符和数组,您首先需要将其内爆(从而将数组转换为字符串)。

下面的查询与 IN() 语句中的变量一起正常工作,但我似乎无法让它与内爆数组一起工作。

这有效并返回 8 行产品

$colors_VAR = "'Black','Royal_Blue','Dodger_Blue','Red'";
$stmt = $conn->prepare("SELECT * FROM products WHERE products.Color IN ($colors_VAR)"); 

这不会返回任何结果

$colors_Array = array('Black','Royal_Blue','Dodger_Blue','Red');
$stmt = $conn->prepare("SELECT * FROM products WHERE products.Color IN (' . implode(',', $colors_Array) . ')"); 

【问题讨论】:

  • echo 执行之前的查询。每次您不确定时,请检查您的变量和其他内容。 PS:如果数组不是静态的,您必须使用转义函数对其进行清理或使用准备好的语句。
  • 像这样进行字符串连接违背了使用PDO::prepare的目的。上面的答案显示了如何正确使用它与数组。 (基本上,您根据数组的长度生成?, ?, ?, ...,然后将数组传递给execute,这让PDO 为您完成转义和引用值的工作,这就是您首先使用PDO 的原因地方。)
  • @Jordan - 您如何将它与动态生成的数组一起使用?当我无法让代码正常工作时,我创建了最简单的代码来解决这个问题,但数组实际上是由从 db 获取的值动态生成的
  • @ChayaCooper 我不明白这个问题。数组是一个数组,不管它是如何生成的。 (嗯,PHP 有两种数组,关联数组和非关联数组,但不管它们是如何生成的,它们仍然只是数组。)
  • @Jordan - 我想我应该指定动态生成的数组的长度不是恒定的

标签: php mysql arrays implode


【解决方案1】:

您需要用引号将颜色括起来,例如

$colors_Array = array('Black','Royal_Blue','Dodger_Blue','Red');
$stmt = $conn->prepare("SELECT * FROM products WHERE products.Color IN ('" . implode("','", $colors_Array) . "')");

额外的一组引号在数组中的每个单独项目周围放置一组引号 - 'Black'、'Royal_Blue'、'Dodger_Blue'、'Red'

【讨论】:

  • 额外的一组引号在数组中的每个单独项目周围放置一组引号 - "Black","Royal_Blue","Dodger_Blue","Red"
  • @Chaya Cooper,此答案使用',' 分隔符将元素排序为'elem1','elm2','..。你的版本只是用一个逗号'elem1,elem2,..
  • 感谢@JayBlanchard,我在回答中添加了您的评论。
  • @ThiagoFranca - 你的回答很完美:-D 非常感谢:-D
  • @Chaya Cooper:在 SQL 中,您使用 ' 作为字符串分隔符。
猜你喜欢
  • 1970-01-01
  • 2013-09-10
  • 2011-07-29
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多