逗号分隔值在 PHP MYSQL 中不起作用 [重复]
Posted
技术标签:
【中文标题】逗号分隔值在 PHP MYSQL 中不起作用 [重复]【英文标题】:Comma-separated values doesn't work in PHP MYSQL [duplicate] 【发布时间】:2017-08-26 05:45:06 【问题描述】:我目前面临一个困难,将逗号分隔的值放入 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
仍然在结果中。不确定这是一种不好的做法,或者只是需要对代码进行细微调整。无论如何,我真的很期待了解为什么它不适合我。
【问题讨论】:
将 $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 数据库中不起作用