PHP SELECT returns 使用 IN 清空并内爆

PHP SELECT returns empty using IN and implode

我已经用了将近两个小时了,我很确定我只是遗漏了一些简单的东西。我尝试了多次迭代但没有成功。 SO 搜索给出了见解,但没有完全像这样可以看出我哪里出错了。您的意见将不胜感激。

我有一个由用户 ID(个人电子邮件地址)组成的 [$prime_ids] 数组。这是完成的数组的外观:

["james.pruit@abcnet.com", "dan.smith@abcnet.com", "nathan.jones@abcnet.com", ...

现在我需要根据数据库 table 中的匹配项在此列表中查找匹配项。注意:可以有多个与 table 中包含的信息匹配(意味着单个用户 ID 可能会在列表中出现多次)。这是出于特定原因而完成的。

我的理解是我需要使用 implode 来完成这项工作。这是我的查询:

$sql_query = "SELECT * FROM worksheet4 WHERE worksheet4.user_id IN (" . implode(",", $prime_ids) . ");";
$result = $dbc->query($sql_query);

然后我 运行 一个循环来构建第二个数组 ($kp_positions)。这是我的代码:

while($row = mysqli_fetch_assoc($result)) {
    $kp_positions[] = $row;
}

这个returns一个空数组。在调试时,我尝试使用 WHERE 而不是 IN 和内爆的相同 SELECT 查询:

WHERE user_id = 'dan.smith@abcnet.com'";

... 并且效果很好(但仅适用于此单用户)。认为这可能与 implode 语句中的单引号 (') 有关,我尝试了所有可能的组合,但都没有用。因为这与单个用户 ID 完美配合,所以我的 implode 语句哪里出错了?或者,我会以错误的方式解决这个问题吗?谢谢。

如果您打印您的查询,您将得到如下内容:

 SELECT * FROM worksheet4 WHERE worksheet4.user_id IN (james.pruit@abcnet.com,dan.smith@abcnet.com,nathan.jones@abcnet.com);

请注意,“in”中的每个成员都应该用引号引起来 所以尝试 运行 这一行:

$sql_query = "SELECT * FROM worksheet4 WHERE worksheet4.user_id IN ('" . implode("','", $prime_ids) . "');";

并获得

SELECT * FROM worksheet4 WHERE worksheet4.user_id IN ('james.pruit@abcnet.com','dan.smith@abcnet.com','nathan.jones@abcnet.com');

另一种选择,在我看来更好,是使用 json_encode() 来引用它。

$prime_ids = array_map('json_encode', $prime_ids)

https://3v4l.org/HPL2o

然后 不带引号json_encode() 为您添加:

$sql_query = "SELECT ... IN (" . implode(",", $prime_ids) . ")";

这将转义可能存在的引号,这很好。