我目前面临一个困难,即将逗号分隔值放入 MySQL NOT IN
没有给我我想要的结果。一定有一些东西我丢失了,因为我不确定要搜索什么来解决这个特定问题。仅运行 MySQL 代码有效,但从另一个 PHP 函数传递参数则无效。
这是给我带来问题的代码:
$uid = 1;
$selected_uids = '1,2';
$result = $db->retrieveFollowingWithCondition($uid, $selected_uids);
...然后在代码的某个地方...
public function retrieveFollowingWithCondition($uid, $selected_uids) {
$stmt = $this->conn->prepare("SELECT *
FROM `friendlist`
WHERE `uid` = ? AND `buddy_uid` NOT IN (?)
GROUP BY `buddy_uid`;");
$stmt->bind_param("is", $uid, $selected_uids);
...}
我已经测试过将“2”放入 $selected_uids
它确实有效。但是一旦涉及到逗号,代码就会运行,但是 $selected_uids
仍然在结果中。不确定这是一个不好的做法还是只需要对代码进行一些小的调整。不管怎样,我真的很期待了解为什么它对我不起作用。
最佳答案
通过在 bind_param
中使用 s
,您将告诉 PHP 将 $selected_uids
的全部内容视为字符串。因此,“1,2
”被视为 ('1,2')
而不是 (1,2)
。 Your problem is that bind_param
doesn't support arrays, so support of IN
queries is limited 。有许多替代方法可以解决此限制,但由于您正在处理整数列表,因此我可能会执行原始字符串连接。
// using is_numeric because is_int("1") === false
$filtered = array_filter('is_numeric', $selected_uids);
// You could also just call array_map('intval', $selected_uids);
// Depending on your needs.
if(!$filtered) {
return; // No valid values
}
$filteredStr = implode(',', $filtered);
$stmt = $this->conn->prepare("SELECT *
FROM `friendlist`
WHERE `uid` = ? AND `buddy_uid` NOT IN ($filteredStr)
GROUP BY `buddy_uid`;");
还应该注意:如果我尝试使用字符串进行 IN
查询,我可能会执行以下操作:
$filtered = array_map([$this->conn, 'escape_string'], $queried);
$inQuery = '\'' . implode('\',\'', $filtered) . '\'';
我发现这种表示法比动态生成的 bind_param
格式字符串更干净、更容易。
关于php - 逗号分隔值在 PHP MYSQL 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45892313/