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 использование in в запросе

 PHP.SU

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


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

> Описание: PDO использование in в запросе
3d_killer
Отправлено: 21 Декабря, 2013 - 21:14:56
Post Id



Участник


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


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




Составил запрос выдает 1 значение только, как правильно в PDO использовать in?
$_POST['id'] - массив с id
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. $id=implode(',',$_POST['id']);
  3. $STH = $DBH->prepare("SELECT email FROM table_users WHERE id IN(:id)");
  4. $STH->bindParam(':id',$id);
  5. $STH->execute();
  6. $data['error']=$STH->rowcount();
  7. die(json_encode(array('data'=>$data)));
  8.  
 
My status
 Top
OrmaJever
Отправлено: 21 Декабря, 2013 - 21:27:31
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




вы уверены что $_POST['id'] это массив, и там есть несколько значений?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
3d_killer
Отправлено: 21 Декабря, 2013 - 21:31:06
Post Id



Участник


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


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




да
Прикреплено изображение (Нажмите для увеличения)
Без имени-2.jpg
 
My status
 Top
3d_killer
Отправлено: 21 Декабря, 2013 - 21:36:42
Post Id



Участник


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


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




вот еще var_dump
Прикреплено изображение
Без имени-3.jpg
 
My status
 Top
teddy
Отправлено: 21 Декабря, 2013 - 22:04:05
Post Id


Участник


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


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




PHP:
скопировать код в буфер обмена
  1. $STH = $DBH->prepare("SELECT `email` FROM `table_users` WHERE FIND_IN_SET(id,:id)");

?

(Отредактировано автором: 21 Декабря, 2013 - 23:04:03)

 
 Top
3d_killer
Отправлено: 21 Декабря, 2013 - 22:11:01
Post Id



Участник


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


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




Работает, не могли бы объяснить что такая запись как бы означает?
(Добавление)
и как оно по быстродействию?
 
My status
 Top
teddy
Отправлено: 21 Декабря, 2013 - 23:11:41
Post Id


Участник


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


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




Я подкорректировал свой пример, убрал лишнюю функцию... точнее здесь она не нужна была вовсе, результат должен быть такой же..

По поводу что это такое - обычная функция MySQL, такая же как например SUM, COUNT или CONCAT, только у неё два параметра, в качестве первого передается значение(в данном случае поле id которому ведется поиск), а во второй параметр передаются значения перечисленные через запятую в виде строки(результат, который вернулся после обработки массива с помощью функции implode() ), и в случае успеха(если такие id присутствуют), то вернутся соответствующие им записи.

По поводу быстродействия - проблем быть не должно, это обычная функция MySQL

(Отредактировано автором: 21 Декабря, 2013 - 23:15:52)

 
 Top
LIME
Отправлено: 21 Декабря, 2013 - 23:41:56
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




teddy пишет:
По поводу быстродействия - проблем быть не должно, это обычная функция MySQL
в MySQL не работают индексы по результатам ф-ций
но здесь их нельзя применить даже по логике действия
в случае IN происходит поиск по дереву индексов для каждого значения множества
в случае FIND_IN_SET видимо вычисляется ее значение(разбор строки и поиск в ней значения поля) для каждого ряда таблицы
я бы отказался для этого случая от подготовленного выражения
лучше фильтровать данные до склейки в строку и юзать обычный запрос
(Добавление)
ну или 1 из вариантов найденных в сети
PHP:
скопировать код в буфер обмена
  1. // Если мы имеем массив заранее не определённой длины:
  2. $params = array(1, 3, 7, ... );
  3. // Получаем нужное кол-во плейсхолдеров + убираем последнюю, побочную запятую:
  4. $placeHolders = rtrim(str_repeat('?,', count($params)) , ',');
  5. $stmt = $db->prepare('SELECT * FROM users WHERE uid IN (' . $placeHolders . ')');
  6. $stmt->execute($params );
  7. // Печатаем результат выборки:
  8. print_r($stmt->fetchAll());
 
 Top
teddy
Отправлено: 21 Декабря, 2013 - 23:56:13
Post Id


Участник


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


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




LIME пишет:
в MySQL не работают индексы по результатам ф-ций

Ага... Главное знал, а вот как то не вспомнил даже про индексы, когда отвечал на этот вопрос Хм
 
 Top
3d_killer
Отправлено: 22 Декабря, 2013 - 07:47:25
Post Id



Участник


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


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




Спасибо большое за расширенные ответы, очень помогли
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB