逗号分隔值在PHP MYSQL中不起作用

时间:2017-08-26 05:45:07

标签: php mysql csv notin

我目前面临一个困难,即将逗号分隔的值放到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仍然在结果中。不确定这是一个不好的做法,还是只需要对代码进行微调。无论如何,我真的很期待理解为什么它不适合我。

2 个答案:

答案 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