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)
然后 不带引号,json_encode()
为您添加:
$sql_query = "SELECT ... IN (" . implode(",", $prime_ids) . ")";
这将转义可能存在的引号,这很好。
我已经用了将近两个小时了,我很确定我只是遗漏了一些简单的东西。我尝试了多次迭代但没有成功。 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)
然后 不带引号,json_encode()
为您添加:
$sql_query = "SELECT ... IN (" . implode(",", $prime_ids) . ")";
这将转义可能存在的引号,这很好。