【问题标题】:PHP - Issue with PDO when using concatPHP - 使用 concat 时出现 PDO 问题
【发布时间】:2014-01-10 10:14:43
【问题描述】:

我有以下代码不起作用,我不明白为什么。

谁能帮助我了解 PDO 的微妙之处?

<?php

$stmt = $con->prepare("SELECT DISTINCT title FROM articles WHERE concat(id,'-',value) IN (?)");
$stmt->bindParam(1, $concat);

//Works
$concat = "1-4";
$stmt->execute();
$results = $stmt->fetchAll();
var_dump($results);

//Does not work
$concat = "'1-4','1-5'";
$stmt->execute();
$results = $stmt->fetchAll();
var_dump($results);

谢谢你:)

【问题讨论】:

  • 嗯,没有与 PDO 的链接?我尝试对变量进行硬编码,它可以工作。
  • 那是因为查询是正确的,但它不是您所期望的。您实际上是在与具有值'1-4', '1-5' 的一个元素的列表进行比较。请检查我发布的答案

标签: php pdo


【解决方案1】:

您绑定的值用作单个字符串参数。所以第二次你不提供列表时,你提供的是一个内部有逗号的字符串。

如果您要“翻译”在数据库级别执行的查询,您将拥有:

SELECT DISTINCT title FROM articles WHERE concat(id, '-', value) IN ("1-4")

这是一个有效的 SQL 查询。但是第二次你会得到类似的东西:

SELECT DISTINCT title FROM articles WHERE concat(id, '-', value) IN ("'1-4', '1-5'")

由于没有串联等于列表中的唯一元素('1-4', '1-5'),因此您不会得到任何结果

【讨论】:

  • 哦,我明白了。你知道有什么办法可以克服吗?
  • 如果你绝对确定字符串是“干净的”并且它只有 - 格式的元素,你可以将它连接到查询中。或者也许最好/最安全的解决方案是添加可变数量的占位符(?符号)并迭代一个元素数组并绑定每个元素
  • 事实上,这些 1-4、1-5 等来自 CSV 文件。在将其发送到查询之前,我将其连接起来。我认为您可变数量的占位符可能是最好的解决方案,除非我不知道如何使用它。 :p 但我会搜索它,谢谢您的快速回复!
  • 我在 google 上搜索了“pdo bind list of elements”,发现了这个 SO 线程:stackoverflow.com/q/920353/521598 看来你可能会在那里找到一些帮助.. DonamiteIsTnt 添加的答案非常相似按照我的建议
  • 哦。问题是,我一劳永逸地准备了查询。我的意思是,我的 CSV 文件中有几行,我在每一行上应用我的脚本,每一行都有一个“concat”值的变量。
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多