@Valera221
Делаю сайты

Как заменить строку на цифры у оператора IN?

Мне нужно взять массив пользователей, кроме id 8,10,11 и так далее
Мой запрос выглядит следующим образом:
SELECT *
    FROM `users`
    WHERE id not in(?)

И проблема в "id not in(?)"
Дело в том, что в PHP у меня есть массив [8,10,11], который я объединил с запятой, получив строку => "8,10,11" ,
ничего умного не придумав я пихаю эту строчку в IN, выполняя следующее действие ...->execute(["8,10,11" ]);
8-ой айди как следует не показывается, но очевидно 10 и 11 чувачок затесался в моей вечеринке (показался)
Я понимаю, что в IN должны быть цифры, но как мне конвертировать строчку где 3 и больше цифр в нормальный int ?
Чтобы в конечном итоге sql получил вот такое вот: id not in(8,10,11) ?
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Цифры тут как раз совершенно не обязательны, а вот знаков вопроса должно быть больше. На каждый айди.
ПХП не джинн из бутылки, чтобы отгадывать, что тут имелось в виду - целиком строка или отдельные значения.
Если нужны отдельные значения, то и передавать их надо по отдельности, n'est pas?

Это конечно не так красиво выглядит, но других вариантов все равно нет

$array = [8,10,11]; 
$in  = str_repeat('?,', count($array) - 1) . '?';
$sql = "SELECT * FROM users WHERE id NOT IN ($in)";
$stmt  = $db->prepare($sql);
$stmt->execute($array);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
Если передаваемый параметр - это CSV идентификаторов, то следует использовать
SELECT *
FROM `users`
WHERE FIND_IN_SET(id, ?);


Примечание 1. CSV не должен содержать никаких паразитных пробелов (а то любят всякие "украшатели" понатыкать пробелов после запятой).
Примечание 2. Такой запрос - гарантированный фуллскан. Зато не будет инъекции.

PS. В принципе этот CSV несложно довести до состояния JSON array (всего-то две скобки добавить) - тогда можно применить JSON_CONTAINS(), что может быть немного быстрее. А уж если переданный JSON распарсить на отдельные значения с помощью JSON_TABLE(), так ещё и от фуллскана избавимся (правда, версия сервера нужна достаточно свежая).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы