我目前面临一个困难,即将逗号分隔的值放到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);
...}
我已经测试过在$selected_uids
中放置'2'并且它确实有效。但是一旦有逗号,代码就会运行,但$selected_uids
仍然在结果中。不确定这是一个不好的做法,还是只需要对代码进行微调。无论如何,我真的很期待理解为什么它不适合我。
答案 0 :(得分:1)
在h.map { |k, v| [k, v.sort_by(&:first)] }.to_h
中使用s
,您告诉PHP将bind_param
的全部内容视为字符串。因此,“$selected_uids
”被视为1,2
而不是('1,2')
。 Your problem is that bind_param
doesn't support arrays, so support of IN
queries is limited。有许多替代方法可以解决这个问题,但是由于你正在处理一个整数列表,我可能会做一个原始的字符串连接。
(1,2)
还应该注意:如果我尝试使用字符串进行// 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) . '\'';
格式字符串更清晰,更容易。
答案 1 :(得分:1)
您应该分别绑定IN(...)中的每个参数,但方法bind_param不支持多个调用。有一个很好的类可以做到这一点,你可以在PHP文档页面上找到它: Custom class for multiple bind_param