Напоролся на засаду... Не могу понять, как правильно построить запрос (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>';
}
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.