我想随机向用户推荐一些朋友,无论建议和当前会话用户之间是否有共同的朋友。
以下是我尝试过的:
$sess = htmlspecialchars(mysqli_real_escape_string($con, $_SESSION['user_id']));
$qet = mysqli_query($con, "SELECT user.id AS id, user.name AS name, user.u_name AS u_name, user.profile_pic AS profile_pic
FROM user INNER JOIN user_friend ON (user.id = user_friend.add_by_id) OR (user.id = user_friend.add_to_id)
WHERE (user_friend.add_to_id != '$sess' or user_friend.add_by_id != '$sess') AND (user.id != '$sess')
ORDER BY RAND() LIMIT 1");
我的表格结构:
user_friend
- id
- 添加_by_id
- add_to_id
- added_on
- 已接受
用户
- id
- 名称
- u名称
- profile_pic
- 电子邮件
- 密码
- 性别
我没有得到正确的结果,这表明我的那些朋友也已经是我的朋友了(当前会话用户)。
我们不能确定到底出了什么问题,因为您没有向我们展示表user
和表user_friend
的结构,但是,根据所提供的信息推断,您的ON ...
和WHERE ...
语句是不正确的。我建议您在sql中使用NOT IN
子句。还有一些类似的东西(但可能有所不同,因为我们没有您表格的确切格式!):
SELECT * FROM user WHERE id NOT IN (SELECT friends_id FROM user_friends WHERE id = :sess)
同样,如果您想要精确的SQL语句,我们需要知道表的结构。如果你更新你的问题,我会很高兴地更新我的答案:)。
重要信息:
您以前的代码不安全,也不实用。您使用htmlspecialchars()
不正确,为了防止sql注入,正确的方法是使用准备好的语句和参数绑定。以下是MySQL(PDO)(首选方法)的示例:
$sess = $_SESSION['user_id'];
$sql =
"SELECT
user.id AS id,
user.name AS name,
user.u_name AS u_name,
user.profile_pic AS profile_pic
FROM
user
INNER JOIN
user_friend
ON (user.id = user_friend.add_by_id) OR (user.id = user_friend.add_to_id)
WHERE
(user_friend.add_to_id != :sess or user_friend.add_by_id != :sess)
AND (user.id != :sess)
ORDER BY RAND() LIMIT 1"
$stmt = $conn->prepare($sql); //preparing the statement
$stmt->bindParam(':sess', $sess); //binding the parameter
$stmt->execute();
稍后,当您决定输出所选数据时,您应该使用htmlspecialchars()
,如下所示:
echo "Friends: ".htmlspecialchars($data)."<br>";