将带有%的普通Search SQL语句转换为准备好的语句

时间:2018-10-15 04:17:43

标签: php mysqli prepared-statement

我尝试将以下代码转换为准备好的语句:

$query = mysqli_query($con,"SELECT * FROM users WHERE friend_array LIKE '$username,%' OR friend_array LIKE '%,$username,%' OR friend_array LIKE '%,$username' LIMIT 0,8");

我不确定如何进行操作,但这是到目前为止。

$query = mysqli_prepare($con, "SELECT * FROM users WHERE friend_array LIKE ? OR friend_array LIKE ? OR friend_array LIKE ? LIMIT 0,8");
$query->bind_param('sss',$username . ',%', '%,' . $username . ',%', '%,$username');
$query->execute();
etc.etc.  

friend_array中的用户名用,分隔。有人可以告诉我是否在正确的轨道上或需要进行更正吗?

1 个答案:

答案 0 :(得分:2)

您可以在此处使用FIND_IN_SET

SELECT *
FROM users
WHERE FIND_IN_SET('$username', friend_array) > 0
LIMIT 0,8;

您应该尝试使用以下语句:

sql = "SELECT * FROM users WHERE FIND_IN_SET(?, friend_array) > 0 LIMIT 0,8";
$query = mysqli_prepare($con, $sql);
$query->bind_param('s', $username);
$query->execute();

但更好的是不要在表中存储CSV数据。不用存储用户名/用户ID的列表,而是将每个用户名存储在单独的记录中。这样可以标准化您的数据,并使其更易于使用。

额外:

如果您确实需要直接将一些$username与用户名的CSV列表进行比较,则只需使用以下结构:

WHERE CONCAT(',', friend_array, ',') LIKE CONCAT('%,', '$username', ',%')

这将一次性覆盖所有可能的位置。但是,再次使用FIND_IN_SET和语句,或者更好的是规范化数据,根本不要使用FIND_IN_SET