将带有 % 的普通 Search SQL 语句转换为准备好的语句
Converting normal Search SQL statement with % to 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 中的用户名由 ,
分隔。有人可以告诉我我是否在正确的轨道上或需要进行更正吗?
你可以在这里使用 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 数据。不是存储 usernames/user 个 ID 的列表,而是将每个用户名存储在单独的记录中。这将标准化您的数据并使其更易于使用。
额外:
如果您确实需要直接将某些 $username
与 CSV 用户名列表进行比较,则只需使用此结构:
WHERE CONCAT(',', friend_array, ',') LIKE CONCAT('%,', '$username', ',%')
这将一次性覆盖所有可能的位置。但同样,将 FIND_IN_SET
与语句一起使用,或者更好地规范化您的数据并且根本不使用 FIND_IN_SET
。
我尝试将以下代码转换为准备好的语句:
$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 中的用户名由 ,
分隔。有人可以告诉我我是否在正确的轨道上或需要进行更正吗?
你可以在这里使用 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 数据。不是存储 usernames/user 个 ID 的列表,而是将每个用户名存储在单独的记录中。这将标准化您的数据并使其更易于使用。
额外:
如果您确实需要直接将某些 $username
与 CSV 用户名列表进行比较,则只需使用此结构:
WHERE CONCAT(',', friend_array, ',') LIKE CONCAT('%,', '$username', ',%')
这将一次性覆盖所有可能的位置。但同样,将 FIND_IN_SET
与语句一起使用,或者更好地规范化您的数据并且根本不使用 FIND_IN_SET
。