Покинул форум
Сообщений всего: 134
Дата рег-ции: Февр. 2012 Откуда: Тольятти
Помог: 2 раз(а)
[+]
Добрый день.
щас приведу пример что бы был понятен этот бред, у меня в базе 11 записей, одна запись уже "добавлена" , вообщем остаётся 10 записей которые должны мне вывестись при загрузке страницы и ничего не должно подгружаться когда я прокручиваю страницу вниз (аякс подзагрузка при прокрутке страницы стоит)
но почему то у меня подгружается эта 11 запись, когда LIMIT 10,20
проверяю sql запрос в phpmyadmin'е всё нормально выводит
если обрамлять в phpmyadmin'е NOT IN ('77,101,....') то ведёт себя так же как и запрос в php скрипте, в чём же проблема ? О_о
Это не имеет смысла, PDO умеет один параметр корректно подставлять в запросе несколько раз.
Т.е. можно спокойно писать where user_id_from=:id_us or user_id_to=:id_us и биндить только id_us
По теме - да, IN препарированным запросом делать неудобно.
Если делать field in (:var) и биндить значения через запятую, то и получится field in ('значения через запятую'), что эквивалентно field = 'значения через запятую'
Т.е. смысла не имеет.
Надо делать field in (:var1, :var2, ...) и биндить отдельно значения.
----- PostgreSQL DBA
imper
Отправлено: 01 Октября, 2014 - 13:08:55
Частый гость
Покинул форум
Сообщений всего: 134
Дата рег-ции: Февр. 2012 Откуда: Тольятти
Помог: 2 раз(а)
[+]
Ну теперь понятно, просто интересно почему он не может в NOT IN обычную строку впихнуть?
я просто вместо параметра :tems вставил в запрос переменную напрямую
WHERE chat_tema.id NOTIN($tems)AND(friends_iv.id_user_ot = :id_us1 OR friends_iv.id_user_pol = :id_us2)AND friends_iv.readed = 1
AND((friends_iv.id_user_ot = :id_us3 AND friends_iv.id_user_pol = chat_tema.id_user)OR(friends_iv.id_user_ot = chat_tema.id_user AND friends_iv.id_user_pol = :id_us4 ))
AND profile_user.id = chat_tema.id_user
ORDERBY chat_tema.id DESCLIMIT :cursor,20
----- Самое лучшее решение проблемы самое простое
esterio
Отправлено: 01 Октября, 2014 - 13:36:04
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
для ответа нужно знать как оно работает, а эт ен 5 минут. думаю вам стоит поискать в гугле
Мелкий
Отправлено: 01 Октября, 2014 - 13:46:41
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
imper пишет:
просто интересно почему он не может в NOT IN обычную строку впихнуть?
Именно что строку и вставляет. А вам-то не нужна строка, вам нужны пачка параметров с разделителем-запятой. А получается один элемент - строка.
----- PostgreSQL DBA
teddy
Отправлено: 01 Октября, 2014 - 18:22:24
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
А все таки вопрос можно решить и без отдельного биндинга.
Идея в том, что бы подставлять в запрос не именованные параметры, а вопросики, которые PDO скушает и не подавится.
Для начала нужно понимать, что для того что бы использовать такух схему, вам нужен отдельный массив данных с теми значениями, которые должны быть подставлены в IN, и отдельный массив данных, значения из которого будут использоваться в WHERE, AND и т.п
Почему? Должно быть ясно по коду.
$allParams=array_merge($data,$params);//соединяем данные для условий и IN
$stmt=$dbh->prepare('SELECT `some`,`columns` FROM `table` WHERE `col` > ? AND `id` IN('.$inParams.')');
$stmt->execute($allParams);
Порядок передаваемых значений в array_merge должен быть именно таким.
esterio
Отправлено: 01 Октября, 2014 - 18:26:23
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
ну тогда теряеться возможность именных плейсхолдеров
teddy
Отправлено: 01 Октября, 2014 - 18:32:47
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
esterio
Ну и пусть Не вижу проблем... В конечном счете это никак не влияет на выполнение запроса
Мелкий
Отправлено: 01 Октября, 2014 - 18:36:05
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
esterio пишет:
ну тогда теряеться возможность именных плейсхолдеров
Не теряется.
Ничто не мешает с совершенно тем же результатом сформировать in (:mydata1, :mydata2, ..) и скормить execute ассоциативный массив с mydata1=>$data1, mydata2=>$data2
Это одно и то же.
Проблема в том, что это именно биндинг отдельных элементов и есть. Вопросиками или именованными параметрами - без разницы.
----- PostgreSQL DBA
teddy
Отправлено: 01 Октября, 2014 - 18:53:45
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Мелкий
В принципе да, отдельный биндинг все равно так или иначе должен быть.
Этот способ лишь попытка уйти от явного и неоднократного вызова метода bindParam.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.