为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 PHP 中的准备语句使用 implode() 将多个整数插入到 IN 语句中?

如何使用 PHP 中的准备语句使用 implode() 将多个整数插入到 IN 语句中?

PHP
呼如林 2023-07-21 18:07:44
语境我有一个供稿系统,用户可以在其中关注我网站上的其他用户并查看他们发布的内容,例如他们创建的线程。为了实现这一点,我使用 AJAX 发送一个数组,其中包含用户关注的人员的所有用户 ID,以便在 SQL 语句中进行查询(我的 DBMS 是 MySQL)。然后,在 PHP 中,我尝试使用语句获取该数组并将其放入 SQL 查询中IN。在这种特定情况下,用户关注了 ID 为 11 和 12 的另外两个人。因此,通过 AJAX 将此数据发送到 PHP 代码后,我可以使用并得到以下结果print_r($_POST['following']):Array ( [0] => 11 [1] => 12 )为了在我的 SQL 查询中使用它,我使用以下代码:if ($_SERVER['REQUEST_METHOD'] == 'POST') {$q = "SELECT forums.forum_id, forums.forum_title, forums.message, forums.idUsers, forums.box_id, forums.date, forums.seen, users.uidUsers, profileimages.image FROM forums JOIN users JOIN profileimages ON forums.idUsers = users.idUsers AND profileimages.idUsers = users.idUsers WHERE forums.idUsers IN (?) //code in questionORDER BY forums.forum_id DESC LIMIT 5 OFFSET ?";$stmt = mysqli_prepare($conn, $q);mysqli_stmt_bind_param($stmt, 'ii', $followingArray, $offset);$following = $_POST['following'];$followingArray = implode(", ", $following); //code in question$offset = $_POST['offset'];mysqli_stmt_execute($stmt);执行查询后,我获取信息并将其发送回服务器。当我这样做时,会返回五行:[{idUsers: 11, forumId: 11, seen: "false", forumTitle: "sixth random thread",…},…]0: {idUsers: 11, forumId: 11, seen: "false", forumTitle: "sixth random thread",…}1: {idUsers: 11, forumId: 10, seen: "false", forumTitle: "fifth random thread",…}2: {idUsers: 11, forumId: 9, seen: "false", forumTitle: "fourth random thread",…}3: {idUsers: 11, forumId: 8, seen: "false", forumTitle: "third random thread",…}4: {idUsers: 11, forumId: 7, seen: "false", forumTitle: "second random thread",…}这很好,除了这样的事实:它只考虑涉及用户 ID 11 的帖子,而不是同时考虑 11 和 12。如果语句IN包含 ID 为 12 的用户的帖子,那么结果会有所不同。直接进入数据库并手动输入值后再次查询,如下所示:这让我相信我implode()对准备好的语句的实现是不正确的。问题我是否应该对该implode()函数进行一些更改,例如在数组中的每个值周围加上引号,以使其与INMySQL 中的语句一起使用?我尝试过的事情我相信我的implode()函数格式不正确,因此尝试将$followingArray变量从$followingArray = implode("', '", $following);to更改为$followingArray = "'" . implode("', '", $following) . "'";,它只返回 0 行。implode()当尝试将多个值插入 SQL 语句时,如何格式化我的函数以使其正常工作?
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

你永远不应该自己弄乱引号,因为这会导致 sql 注入的风险。


'此外,在这个特定的示例中,您正在插入数字,但如果您想插入像“O'Connor”这样的字符串,甚至不讨论是否要存储包含和的任意文本,则在一般情况下它将不起作用:准备好的语句会处理所有事情,安全性和引用意大利面条"。


我的建议是首先count输入您要查询的 id 编号,然后?在IN子句中添加这些编号,如下所示


$idCount = //count ids

$questmarks = array_fill(0, $idCount, "?");

$sql .= "IN(".implode(",", $questmarks).")";

如果你有 5 个 id 要查询,准备好的 SQL 字符串将如下所示:


SELECT ...

WHERE 

AND id IN (?,?,?,?,?)

LIMIT ?


然后按顺序绑定所有参数。


$params = [$id1,$id2,$id3,$id4,$id5,$offset];


mysqli_stmt_bind_param($stmt, "ii", ...$params);


查看完整回答
反对 回复 2023-07-21
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

$followingArray = "'" . implode("','", $following) . "'";



查看完整回答
反对 回复 2023-07-21
  • 2 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信