語境我有一個供稿系統,用戶可以在其中關注我網站上的其他用戶并查看他們發布的內容,例如他們創建的線程。為了實現這一點,我使用 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);
- 2 回答
- 0 關注
- 167 瀏覽
添加回答
舉報
0/150
提交
取消