JaxAdam
@JaxAdam
Junior Full-Stack Developer

Как преобразовать обычную строку в текст MySQL?

Добрейший денечек!) Крч, решил сделать систему подписок в своем блоге. Подписку успешно реализовал) Теперь вот захотел, шоб у каждого пользователя в профиле отображались его подписки. Для этого вытянул из БД id курсов, на которые подписан текущий юзер и сохранил их в переменной $ids в виде строки разделив запятыми, вроде "3,5,15,33,47". Запрос на получение массива курсов в Пыхе:
return $this->db->row("SELECT * FROM cources WHERE id IN (:ids)", 
                                    ['ids' => $ids]);

ОБЬЯСНЯЮ: ":ids" равен значению $ids. Присутствует защита от иньекции, поэтому передается второй параметр.

Так вот в MySQL запрос получается таким:
SELECT * FROM cources WHERE id IN ("3,5,15,33,47")
Результат: строка "3,5,15,33,47" преобразуется в число со значением 3. И MySQL понимает это как:
SELECT * FROM cources WHERE id IN (3)
Как сделать так, чтобы запрос выглядел следующим образом?
SELECT * FROM cources WHERE id IN (3,5,15,33,47)
Искал различные MYSQL функции. Но безуспешно. Надеюсь на вашу помощь, уважаемые гуру ПиАшПи!
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Только не строка а массив, и не "текст MySQL", а последовательность плейсхолдеров
Сначала explode() а потом https://phpdelusions.net/pdo#in

я так понимаю что тебе трудно будет адаптировтаь под свой вариант, поэтому вот тебе готовый код
$ids = explode(",", $ids);
$in  = str_repeat('?,', count($ids) - 1) . '?';
return $this->db->row("SELECT * FROM cources WHERE id IN ($in)", $ids);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Вариант без placeholder'ов, если $ids массив из INT'ов то можно прогнать каждый элемент через intval() чтобы исключить любого рода инъекции и напрямую подставить в запрос

$ids = array_map('intval', $ids);
return $this->db->row("SELECT * FROM cources WHERE id IN (".join(',', $ids).")");
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы