Запрос WHERE ... IN используя prepare PDO

php MySQL pdo

Напоролся на засаду... Не могу понять, как правильно построить запрос (WHERE IN) в PDO.
При обычном построении запроса я бы написал примерно так:

$params = array(1, 3, 7);
$res = mysql_query("SELECT * FROM users WHERE uid IN (".implode(',',$params).")");
// и т.д.
// В итоге - получаем три записи

Наивно надеялся, что в PDO не надо будет ломать голову. Пробовал написать так:

$params = array(1, 3, 7);
$e = $db-> prepare("SELECT * FROM users WHERE uid IN (?)");
$e -> execute((array(implode(',',$params))));
$e -> setFetchMode(PDO::FETCH_ASSOC);
// Итог - только одна запись

Если кто сталкивался с такой проблемой, то прошу подсказать в какую сторону рыть надо.

P.S. Без prepare и плейсхолдеров, естественно, что работает нормально, но это не вариант.

Примечание:
@azlab.org, не хочется пускаться в полемики, вы ведь уточнили, что с PDO не работаете. Можете поверить
на слово, что всё, о чем вы упоминали не является проблемой, относящейся к вопросу.

В инете толкового решения я не нашел, но проблему все-таки уже решил. Если кому будет интересно
и сможет помочь, то делать бороться с таким запросом можно заранее подготовив нужное кол-во плейсхолдеров.

$params = array(1, 3, 7); // Размер массива не известен
// Функция для "набора" плейсхолдеров
function placeholderQuery( $query, $params ) {
return str_replace('*ph*',substr(str_repeat('?,', count($params)),0,-1),$query);
}

$query = placeholderQuery("SELECT * FROM pages WHERE id IN (*ph*)", $params);
$e = $db-> prepare($query);
$e -> execute($params);
$e->setFetchMode(PDO::FETCH_ASSOC);

while($row = $e->fetch()) {
echo '<p>'.$row['some_field'].'</p>';
}
Ответы:
Не работаю с PDO, поэтому спрошу  у вас: вы уверены что вызов $e -> setFetchMode(PDO::FETCH_ASSOC); приведет к выборке ВСЕХ записей? Где вообще у вас вызов $e->fetchAll() ? PDO::FETCH_ASSOC - это скорее указывает на формат возвращаемых значений ОДНОЙ строки из набора
Да, дружище, похоже это единственное адекватное решение проблемы - сам столкнулся. Понял, что при твоем первом варианте он считает строку (1,3,7) как одно значение, потому и не работает выборка. Спасибо за дополнение!!!


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.