【问题标题】:How to use placeholders at IN() clause when there is other placeholders?当有其他占位符时,如何在 IN() 子句中使用占位符?
【发布时间】:2017-05-09 03:58:43
【问题描述】:

这是我的代码:

$selected_tags_arr = ["PHP", "CSS", "JAVA"];
$part_of_tag = "MyS";
$in  = str_repeat('?,', count($selected_tags_arr) - 1) . '?';
$stmt = $dbh_conn->prepare("SELECT name, usage_guidance, total_used_num
                            FROM tags
                            WHERE
                            ( name LIKE CONCAT('%', ?, '%') OR
                            usage_guidance LIKE CONCAT(?, '%') ) AND
                            name NOT IN ($in)");
$stmt->execute(array($part_of_tag, $part_of_tag, $selected_tags_arr));
$result = $stmt->fetchAll();

由于语法错误,它不起作用。我该如何解决?

如您所见,我还有一些其他参数 $selected_tags_arr 数组除外) 需要传递它们。这就是问题发生的时候。

注意:有时$selected_tags_arr 数组可能是一个空数组。

【问题讨论】:

  • 您需要发布语法错误。代码还有其他问题,例如execute 需要一个平面数组,而不是矩阵。
  • 您在一个数组中发送一个数组。尝试先将$selected_tags_arr 与其他变量合并到一个数组中。
  • IN (list) 臭名昭著很难在除、gasp、ColdFusion 之外的所有语言中参数化。

标签: php mysql pdo parameter-passing


【解决方案1】:

好的,因为没有人愿意提供一个例子。就像 aynber 说的,你需要合并数组。所以下面的代码应该没问题:

$stmt->execute(array_merge([$part_of_tag,$part_of_tag], $selected_tags_arr));

不过,如果像您说的那样,$selected_tags_arr 可能为空,则可能会出现问题。这将导致语法错误。

补救措施取决于您想要的结果。如果你希望你的查询在数组为空的情况下什么也找不到,那么像这样更改你的代码:

$in  = $selected_tags_arr ? str_repeat('?,', count($selected_tags_arr) - 1) . '?' : 'NULL';

【讨论】:

  • Thx +1,它在大多数情况下都能完美运行,除非$selected_tags_arr 数组等于空,如[],在这种情况下它不起作用,你知道我该如何解决是吗?
  • 其实我明白了.. 但是当我设置NULL 时,正如你所说,查询没有找到任何东西.. 而我想禁用 only 这个当该数组为空时,查询AND name NOT IN ($in) 的一部分.. 那么你知道我应该设置什么而不是NULL 吗?
  • @stack 在这种情况下,您将不得不用 IN 取出整个部分。或者,更确切地说,有条件地添加它
猜你喜欢
  • 2011-11-17
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
相关资源
最近更新 更多