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 :: Выпадающие списки

 PHP.SU

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


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

> Описание: Выборка данных из нескольких выпадающих списков
Gost12345
Отправлено: 23 Января, 2017 - 11:57:34
Post Id


Новичок


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


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




Добрый день. Есть 3 выпадающих списка:Имя(name),Фамилия(fam),год рождения(year). И кнопка поиск. Я организую поиск по этим записям. Данные в выпадающий список выводятся select'om, все работает. $_GET['name'], $_GET['fam'],$_GET['year'] передает данные, которые мы выбрали в выпадающих списках. Когда я выбираю поиск по всем значениям то работает, а как реализовать например поиск только по имени или по фимилии. Помогите пожалуйста, Спасибо.
 
 Top
skruglikov
Отправлено: 23 Января, 2017 - 12:17:55
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2017  
Откуда: Киев, Украина


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




какой поиск вы хотите реализовать:
— поиск по ключевому слову?
— обновления содержимого <select> в зависимости от выбранного значения (выбираем имя, а доступные фамилии и год обновились)?

в любом случае это необходимо готовить запросы к БД, ведь ваши данные хранятся...
 
 Top
Gost12345
Отправлено: 23 Января, 2017 - 12:26:15
Post Id


Новичок


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


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




Да, поиск по ключевому слову. Чтобы например выбрать только имя и по нему искать, а в других выпадающих списках ничего не выбирать, просто пустые значения.
if(isset($_GET['name']) and (isset($_GET['fam'])) and (isset($GET['year'])))
{
//здесь запрос к БД и выборка данных, все работает
}

а дальше вот не получается, если после пишу
if(isset($_GET['name']))
{
//то выводит и по первому условию и по второму все вместе
}
 
 Top
skruglikov
Отправлено: 23 Января, 2017 - 13:04:48
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2017  
Откуда: Киев, Украина


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




Gost12345 пишет:
а дальше вот не получается, если после пишу
if(isset($_GET['name']))
{
//то выводит и по первому условию и по второму все вместе
}


дело в том, что вам не надо писать отдельную проверку под каждый параметр... достаточно одной на наличие $GET массива, а там уже проверить содержимое на наличие ключей и значений, сформировать запрос и передать его к БД...

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. if ($_GET) {
  3.  
  4.         // Проверяем необходимы параметры и готовим массив с данными для поиска
  5.         $search_data = array();
  6.         $search_data['first_name'] = isset($_GET['first_name']) ? $_GET['first_name'] : '';
  7.         $search_data['last_name'] = isset($_GET['first_name']) ? $_GET['first_name'] : '';
  8.  
  9.         if ($search_data) {
  10.                 // формируем запрос к БД
  11.         }
  12. }
  13.  
 
 Top
Sail
Отправлено: 23 Января, 2017 - 14:58:47
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


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




Gost12345, в дополнение к ответу skruglikov обращу внимание на функцию filter_input_array
 
 Top
Gost12345
Отправлено: 24 Января, 2017 - 07:54:46
Post Id


Новичок


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


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




skruglikov, все равно не работает, если выбирать все значения то выводит результат, а если какое то одно, то ничего не выводит, хотя запрос выполняется и данные правильно передаются. Именно когда начинаю выводить данные циклом while, то ничего не выводит.
 
 Top
skruglikov
Отправлено: 24 Января, 2017 - 11:57:17
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2017  
Откуда: Киев, Украина


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




Gost12345 пишет:
skruglikov, все равно не работает, если выбирать все значения то выводит результат, а если какое то одно, то ничего не выводит, хотя запрос выполняется и данные правильно передаются. Именно когда начинаю выводить данные циклом while, то ничего не выводит.


Покажите код формы и код обработки данных формы!
 
 Top
Gost12345
Отправлено: 25 Января, 2017 - 11:06:13
Post Id


Новичок


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


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




PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. //подключение к БД
  4. //данные в выпадающий список вывожу из БД
  5. $query="select * from `Teacher`";
  6. $res=mysql_query($query);
  7. ?>
  8. <form action="" method="GET">
  9. <select name=name>
  10. <option value='Выберите имя:'</option>
  11. <?
  12. while($row=mysql_fetch_array($res))
  13. {
  14. echo  "<option  value='".$row['name']."'>.$row['name']."</option>";
  15. }
  16. ?>
  17. </select>
  18. //далее вывожу так же  список фамилий и год(fam,year)
  19.  
  20. //обрабатываем выбранные данные
  21. <?
  22. if(isset($GET['name']) and isset($_GET['fam']) and isset($_GET['year']))
  23. {
  24. $name=$_GET['name'];
  25. $fam=$_GET['fam'];
  26. $year=$_GET['year'];
  27.  
  28. $query1="select * from `Teacher` where name='$name' and  fam='$fam' and  year='$year' ";
  29. $res1=mysql_query($query);
  30.  
  31. while($row1=mysql_fetch_array($res1))
  32. {
  33. echo  $row1['name'];
  34. echo  $row1['fam'];
  35. echo  $row1['year'];
  36. }
  37. }
  38.  
 
 Top
teleoperator27
Отправлено: 25 Января, 2017 - 11:55:24
Post Id



Посетитель


Покинул форум
Сообщений всего: 265
Дата рег-ции: Янв. 2017  


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




PHP:
скопировать код в буфер обмена
  1. //обрабатываем выбранные данные
  2. <?PHP
  3. $name = $_GET['name'] ? "`name` = '". $_GET['name'] ."'" : '';
  4. $fam  = $_GET['fam'] ? "`fam` = '". $_GET['fam'] ."'" : '';
  5. $year = $_GET['year'] ? '`year` = ' . $_GET['year'] : '';
  6.  
  7. $where= array($name,$fam,$year);
  8.  
  9. $where =  array_diff($where,  array(''));
  10.  
  11. $where = implode(' AND ',$where);
  12.  
  13. $query1= "SELECT * FROM `Teacher` WHERE $where";
  14.  
  15. $res1  = mysql_query($query);
  16.  
  17. while($row1 = mysql_fetch_array($res1)){
  18.  
  19.         echo  $row1['name'];
  20.  
  21.         echo  $row1['fam'];
  22.  
  23.         echo  $row1['year'];
  24.  
  25. }

(Отредактировано автором: 25 Января, 2017 - 12:15:29)

 
My status
 Top
skruglikov
Отправлено: 25 Января, 2017 - 12:10:36
Post Id



Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2017  
Откуда: Киев, Украина


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




если человек в форме выберет имя И ЛЮБОЕ другое значение из соседних списков, не соответствующее имени! то вам ничего не прийдет из базы данных!!! результат будет только если у вас, вдруг, совпадут все 3 значения для одного имени!

т.е. у вас не поиск по ключевому слову, а просто полное соответствие!

чтобы работала ваша конструкция, необходимо изменить в запросе "AND" -> "OR"! в этом случае вам будут возвращаться любые соответствия

CODE (htmlphp):
скопировать код в буфер обмена
  1. $query1="select * from `Teacher` where name=$name OR  fam=$fam OR  year=$year";

(Отредактировано автором: 25 Января, 2017 - 14:57:50)

 
 Top
teleoperator27
Отправлено: 25 Января, 2017 - 13:48:50
Post Id



Посетитель


Покинул форум
Сообщений всего: 265
Дата рег-ции: Янв. 2017  


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




Я бы даже дополнил. Вставьте в форму еще поле
CODE (html):
скопировать код в буфер обмена
  1. <label>Точное соответствие
  2. <input type="checkbox" name="exact" />
  3. </label>


Ну и ниже весь код с комментариями

PHP:
скопировать код в буфер обмена
  1. <?
  2. //обрабатываем выбранные данные
  3.  
  4.  
  5. $name = $_GET['name'] ? "`name` = '". $_GET['name'] ."'" : ''; //Если передан параметр name, то присваиваем переменной $name значение `name` = 'что пришло'
  6.  
  7. $fam  = $_GET['fam'] ? "`fam` = '". $_GET['fam'] ."'" : ''; //Если передан параметр fam, то присваиваем переменной $fam значение `fam` = 'что пришло'
  8.  
  9. $year = $_GET['year'] ? '`year` = ' . $_GET['year'] : ''; //Если передан параметр year, то присваиваем переменной $year значение `year` = 'что пришло'
  10.  
  11. $exact= $_GET['exact']; //заносим в переменную значение поля exact
  12.  
  13. $where= array($name,$fam,$year);// Объединяем наши запросы в массив
  14.  
  15.  
  16. $where = array_diff($where,  array('')); //Очищаем массив от пустых значений, что бы не получилось в запросе к БД AND AND несколько раз подряд,  если какой то селект не был выбран
  17.  
  18. if($exact)
  19. {
  20.         //если чекбокс "Точное соответствие" чекнут, то ищем через AND
  21.  
  22.         $where = implode(' AND ', $where); //объединяем в строку наш массив - запрос. На выходе в $where будет `name` = 'чтото' AND `fam` = 'чтото' и т.д.
  23.  
  24. }
  25. else
  26. {
  27.         //иначе через OR
  28.  
  29.         $where = implode(' OR ', $where); //объединяем в строку наш массив - запрос. На выходе в $where будет `name` = 'чтото' OR `fam` = 'чтото' и т.д.
  30. };
  31.  
  32.  
  33. $query1 = "SELECT * FROM `Teacher` WHERE $where"; // делаем запрос, ну а дальше понятно
  34. $res1   = mysql_query($query);
  35. while($row1 = mysql_fetch_array($res1))
  36. {
  37.         echo  $row1['name'];
  38.         echo  $row1['fam'];
  39.         echo  $row1['year'];
  40.  
  41. }
  42. ?>



и тут поправьте

CODE (html):
скопировать код в буфер обмена
  1. <option value='Выберите имя:'</option>

на
CODE (html):
скопировать код в буфер обмена
  1. <option value=''>Выберите имя:</option>

или даже
CODE (html):
скопировать код в буфер обмена
  1. <option>Выберите имя:</option>

(Отредактировано автором: 25 Января, 2017 - 13:54:52)

 
My status
 Top
Sail
Отправлено: 25 Января, 2017 - 14:06:46
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


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




skruglikov, руки прочь от кавычек одинарных! Строка ведь может быть и с пробелом, например...
'Или' не подходит в силу необходимости проверки совпадения всех выбранных параметров, а не одного из...
Gost12345, условие в выражении where надо формировать с учетом необходимости проверки конкретного параметра... то есть, если параметр выбран - пишем его проверку в выражение, если не выбран - не пишем.
 
 Top
Gost12345
Отправлено: 25 Января, 2017 - 19:50:20
Post Id


Новичок


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


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




Спасибо, буду пробовать
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB