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

标签 php mysql csv notin

我目前面临一个困难,即将逗号分隔值放入 M​​ySQL 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/

相关文章:

php - 从 php 重启 Sphinx

php - 如何为 PHP 类提供表单操作

mysql - 使用 ARC 从 Objective-C 项目访问 MySQL 服务器

Oracle 8i 显示 PLS-00382 : expression is of wrong type, 但我没有看到

php - 相似词如何匹配?

php - Sum table1 $date1 和 $date2 之间 AND 用户名等于 $user

mysql - 连接列并排序

python - scrapy如何防止重复数据插入数据库

c++ - 为什么我不能使用 std::vector<char> 在 C++ 中读取文件中的所有字符

mysql - 自动将csv文件插入mysql表