Преобразование нормального оператора SQL поиска с% в подготовленный оператор - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующий код, который я пытаюсь преобразовать в подготовленный оператор:

$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 голосов
/ 15 октября 2018

Вы можете просто использовать 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 в ваших таблицах.Вместо того, чтобы хранить список имен пользователей / идентификаторов пользователей, сохраняйте каждое имя пользователя в отдельной записи.Это нормализует ваших данных и облегчит их использование.

Дополнительно:

Если вам действительно нужно напрямую сравнить $username со списком имен пользователей CSV,затем просто используйте эту конструкцию:

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

Это охватит все возможные места за один раз.Но опять же, используйте FIND_IN_SET с утверждением или, что еще лучше, нормализуйте свои данные и не используйте FIND_IN_SET вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...