逗号分隔值在 PHP MYSQL 中不起作用 [重复]

Posted

技术标签:

【中文标题】逗号分隔值在 PHP MYSQL 中不起作用 [重复]【英文标题】:Comma-separated values doesn't work in PHP MYSQL [duplicate] 【发布时间】:2017-08-26 05:45:06 【问题描述】:

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

【问题讨论】:

将 $selected_uids 放入数组中 你试过$selected_uids = ['1','2'];吗? @NanaPartykar 是的,很遗憾这也不起作用。 如果对您有帮助,请查看此帖子 - bind param with array if(in_array($uid, $selected_uids)) $stmt = $this->conn->prepare("SELECT * FROM friendlist WHERE uid = ? AND buddy_uid NOT在 (?) 分组 buddy_uid;"); $stmt->bind_param("是", $uid, $selected_uids); ... 【参考方案1】:

通过在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。有许多替代方法可以绕过这个限制,但是由于您正在处理一个整数列表,我可能会做一个原始字符串 concat。

// 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 格式字符串更简洁、更容易。

【讨论】:

这有点扼杀了准备和绑定语句的意义,对吧? @Strawberry ...是的,也不是。不幸的是,没有其他方法可以创建IN 查询。我认为为bind_param 动态创建格式参数同样丑陋,而且更难阅读/调试。这导致围绕单个连接的代码块更具可读性。对我来说,可读性与良好、安全的做法相结合,比不可读但稍微好一点的做法要好。【参考方案2】:

您应该单独绑定 IN(...) 中的每个参数,但方法 bind_param 不支持多次调用。有一个很好的类可以做到这一点,你可以在 PHP 文档页面上找到它: Custom class for multiple bind_param

【讨论】:

以上是关于逗号分隔值在 PHP MYSQL 中不起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

默认值在 phpmyadmin/mysql 数据库中不起作用

为啥页面重定向在 php 中不起作用

为啥方法重命名在 PHP 特征中不起作用?

@Transactional 注释 rollbackFor 值在 Spring Boot 中不起作用

默认列值在休眠中不起作用

PHP Header Location 在 localhost xampp 中不起作用?