当有其他占位符时,如何在IN()子句中使用占位符?

时间:2016-12-23 12:29:03

标签: php mysql pdo parameter-passing

这是我的代码:

$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数组可能是一个空数组。

1 个答案:

答案 0 :(得分:2)

好的,因为没有人愿意提供一个例子。就像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';