Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не работает PDO запрос с LIMIT и IN

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Не работает PDO запрос с LIMIT и IN
3d_killer
Отправлено: 07 Февраля, 2014 - 15:49:44
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. $placeHolders = rtrim(str_repeat('?,', count($category)) , ',');
  3. $test=$DBH -> prepare("SELECT id FROM table_product WHERE category_id IN (".$placeHolders.") LIMIT :limit");
  4. $test->bindParam(':limit',$limit,PDO::PARAM_INT);
  5. $test -> execute($category);
  6. var_dump($test->fetchAll())
  7.  

ошибка:
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters

Если убираю лимит все работает и если убираю IN оставляю лимит тоже работает, а в совокупности никак.
Где ошибка? помогите!
 
My status
 Top
Мелкий Супермодератор
Отправлено: 07 Февраля, 2014 - 16:03:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Вот же, сказано:
3d_killer пишет:
mixed named and positional parameters

Не знает, что куда ему ставить надо.


-----
PostgreSQL DBA
 
 Top
IllusionMH
Отправлено: 07 Февраля, 2014 - 16:06:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




3d_killer, текст как бы намекает что нельзя смешивать именованные и неименованные параметры. Приведите все к одному виду.
Тот же IN можно без проблем склеить из массива и вставить как 1 именованный параметр.
 
 Top
Мелкий Супермодератор
Отправлено: 07 Февраля, 2014 - 16:08:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




IllusionMH пишет:
Тот же IN можно без проблем склеить из массива и вставить как 1 именованный параметр.

Научите, пожалуйста.


-----
PostgreSQL DBA
 
 Top
teddy
Отправлено: 07 Февраля, 2014 - 16:11:52
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




IllusionMH пишет:
Тот же IN можно без проблем склеить из массива и вставить как 1 именованный параметр

Если я верно понял то имелось ввиду что то типа :params - закинуть в него массив и передать в IN? Если да то в PDO это проблема. Так не работает, обязательно делать через плейсхолдеры либо использовать специальную sql функцию(первый вариант приоритетнее т.к в случае с функциями мы лишаемся использования индексов)

3d_killer
Попробуйте не биндить лимит а просто приклеить его к запросу, типа
PHP:
скопировать код в буфер обмена
  1. $test=$DBH -> prepare("SELECT id FROM table_product WHERE category_id IN (".$placeHolders.") LIMIT ".$limit);

должно прокатить
 
 Top
IllusionMH
Отправлено: 07 Февраля, 2014 - 16:13:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Мелкий, для тех же категорий которые до этого были выдернуты из базы, можно сделать
в запрос IN(:in_param)
в массиве меток ':in_param' => implode(', ', $category)

Если IN "левые" данные, тогда в цикле пройтись и почистить.

Или забить на именованные параметры и везде ставить вопросики, и в конечный массив дописывать остальные параметры в нужном порядке.
(Добавление)
teddy, дык может сразу prepare выкинуть?

(Отредактировано автором: 07 Февраля, 2014 - 16:13:50)

 
 Top
teddy
Отправлено: 07 Февраля, 2014 - 16:17:50
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




IllusionMH
не нужно выкидывать)) можно же вопросики генерировать на основе количества параметров как это сделано у ТС... тогда все работает, единственная проблема в этом случае это то что именованные параметры в случае с IN не работают а так все норм
 
 Top
IllusionMH
Отправлено: 07 Февраля, 2014 - 16:19:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




teddy, неужели?
IllusionMH пишет:
Приведите все к одному виду.

IllusionMH пишет:
Или забить на именованные параметры и везде ставить вопросики, и в конечный массив дописывать остальные параметры в нужном порядке.
 
 Top
3d_killer
Отправлено: 07 Февраля, 2014 - 16:32:57
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




почему тогда если я оставляю IN делаю WHERE и какое нибудь условие с переменной через Bind Именованной! и работает?

(Отредактировано автором: 07 Февраля, 2014 - 16:40:06)

 
My status
 Top
Мелкий Супермодератор
Отправлено: 07 Февраля, 2014 - 18:10:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




IllusionMH пишет:
в массиве меток ':in_param' => implode(', ', $category)

Хм, надо будет ещё поиграться.
У меня давно на тестах так и уходило where id in ('1,2,3') (что эквивалентно where id='1,2,3'), вместо желаемого where id in (1,2,3)


-----
PostgreSQL DBA
 
 Top
IllusionMH
Отправлено: 07 Февраля, 2014 - 18:19:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




Мелкий, точно. Нужно проверить. как же я тогда заставил подобное работать.
 
 Top
3d_killer
Отправлено: 07 Февраля, 2014 - 18:22:44
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




что то как ни кручу никак не выходит только появляется еще одна ошибка:
Invalid parameter number: number of bound variables does not match number of tokens in
 
My status
 Top
IllusionMH
Отправлено: 07 Февраля, 2014 - 18:27:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




3d_killer, пробовали лимит задать через ? а потом добавить его в конец массива $category?
 
 Top
3d_killer
Отправлено: 07 Февраля, 2014 - 18:44:49
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


Помог: 21 раз(а)




щас так попробую, но так конечно будет не очень удобно так как запрос будет больше намного (фильтр вобщем)
(Добавление)
а и кстати так вроде бы не получится его же кинет в условие IN
 
My status
 Top
IllusionMH
Отправлено: 07 Февраля, 2014 - 19:02:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




3d_killer, с какого перепугу?
Вы должны создавать правильное кол-во вопросов для категорий.
когда добавите еще 1 элемент к массиву, то он будет использован для следующего ? в запросе
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB