С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
8 / 8 / 0
Регистрация: 01.05.2009
Сообщений: 86

Как сделать поиск в МуСКЛе через ПХП по неск полям?

01.05.2009, 16:57. Показов 2877. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте все!

у меня тут такая проблема... Нужно организовать поиск по БД МуСКЛ через ПХП-скрипт по нескольким полям... Есть 5 полей... Пользователь может вводить данные в любые из них (может в одно, а может и в несколько), и в соответствие с этим ему должен будет выдаваться результат.

я пытался сделать это самостоятельно... 2-мя способами... Здесь приведу второй.

---ФОРМА---

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<html>
<body>
<form action = "Sear.php" method = "post">
 
<table>
<tr>
<td><input type = "text" name = "id"></td>
<td>ИД</td>
</tr>
 
<tr>
<td><input type = "text" name = "name"></td>
<td>Имя</td>
</tr>
 
 
<tr>
<td><input type = "text" name = "specy"></td>
<td>Деятельность</td>
</tr>
 
<tr>
<td><input type = "text" name = "country"></td>
<td>Страна</td>
</tr>
 
<tr>
<td><input type = "text" name = "city"></td>
<td>Город</td>
</tr>
</table>
 
<input type = "submit" value = "Показать">
 
</form>
 
</body>
</html>


---СКРИПТ---

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
 
$dblocation = "localhost";
$dbname = "dek";
$dbuser = "user";
$dbpasswd = "user";
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) 
{
  echo( "<P>В настоящий момент сервер базы данных не доступен, поэтому 
            корректное отображение страницы невозможно.</P>" );
  exit();
}
 
 
 
if (!@mysql_select_db($dbname, $dbcnx)) 
{
  echo( "<P>В настоящий момент база данных не доступна, поэтому
            корректное отображение страницы невозможно.</P>" );
  exit();
}
 
//$q = "select id, name from darja Where name LIKE '$name' AND specy LIKE '$specy' AND country LIKE '$country' AND city LIKE '$city'";
 
//if (!empty($id)) { $q = $q." AND id = '$id'"; }
 
//if (empty($name))    { $name = "%"; }
//if (empty($specy))   { $specy = "%"; }
//if (empty($country)) { $country = "%"; }
//if (empty($city))    { $city = "%"; }
 
 
$result = mysql_query($q);
 
if($result)
{
  // Определяем таблицу и заголовок
  echo "<table border=1>";
  echo "<tr><td>id</td><td>name</td></tr>";
  // Так как запрос возвращает несколько строк, применяем цикл
  while($darja = mysql_fetch_array($result))
  {
    echo "<tr><td>".$darja['id']."&nbsp;</td><td>".$darja['name']."&nbsp;</td></tr>";
  }
  echo "</table>";
}
 
 
 
?>



HTML5
1
2
3
4
5
6
7
8
<html>
<body>
<form action = "formOrg.php"
   method = "post">
<input type = "submit" value = "Вернуться на главную страницу">
</form>
</body>
</html>

Должно работать по тому принципу что если пользователь не вводит в любые из полей (кроме 1-го id о нем отдельно) то значения переменным, соотв этим полям в скрипте принимают значение "процент" (%) что вкупе с LIKE означает любой.
Если же пользователь не вводит значение в первую ячейку, то запрос остается без изменений... Если вводит - то к запросу с помощью конкатенации (соед строк) добавляется строчка " AND id = '$id'".
Скрипт принципиально работает не так как надо - он во всех случаях выдает только таблицу из 2-х ячеек - id и name

Помогите пожалуйста!!! Может кто ошибку найдет?
Заранее благодарен

Добавлено через 4 часа 18 минут 43 секунды
Всем большое спасибо за помощь! Я разобралсо!!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.05.2009, 16:57
Ответы с готовыми решениями:

Как сделать поиск по всем полям DbGrid через ADOtable?
Как сделать поиск по всем столбцам таблицы DbGrid через ADOtable. Смогла сделать поиск только по фамилии: procedure...

Как сделать поиск по полям в БД?
У меня есть база данных, созданная в MS Access 2010. Я её подключаю в Visual Studio 2010 через DataGridView, также есть BindingNavigator...

Как сделать поиск по нескольким полям?
Я уже искал различные темы, и в интернете искал. Но я не понимаю того что там пишут. Вернее поисковик не совсем правильно работает как...

10
Телепат
 Аватар для Милый Враг
724 / 118 / 8
Регистрация: 28.04.2009
Сообщений: 442
01.05.2009, 17:30
не AND а OR использовать надо...
В твоем случае результат будет только в том случае, если будет найдено по всем полям в таблице..
Проверь что именно пользователь ищет (какое поле заполнил) и в соответствии с этим полем ищи по нужной ячейке.
Только не понял зачем закоментировал все там?
Да и в целях безопасности я считаю не стоит писать о том что сервер недоступен или еще чтото.. лично я пишу сообщение об ошибке (код свой ставлю) а по отчету вижу сам в чем проблема, пользователю лишь можно сказать что функция временно недоступна...
0
8 / 8 / 0
Регистрация: 01.05.2009
Сообщений: 86
01.05.2009, 20:25  [ТС]
Да закомментировал я эт потому что думал проверить без этого... Терь у меня все получилось терь у меня проблема Как организовать в форме ввода данных раскрывающийся списог в том случае, если поле является внешним ключом... чет пока ничего не получается(((

Добавлено через 4 минуты 27 секунд
Милый Враг, Так у меня ж цель создать универсальный поиск... Если OR будет то юзер как я понимаю будет вводить в поле и ему будет выдаваться инфа по принципу ИЛИ... То есть допустим он ввел имя ткое-то и дату рождения такую-то... Ему будут выведены люди с таким-то именем ИЛИ с такой-то датой рождения... А тутименно чтоб с таким именем И с такой датой рождения...
0
Телепат
 Аватар для Милый Враг
724 / 118 / 8
Регистрация: 28.04.2009
Сообщений: 442
03.05.2009, 20:17
в любом случае с AND не пойдет.. в твоем примере надо делать так...
например пользователь ищет как ты говорил имя с определенной датой..
к примеру "Вася 1983"
надо я думаю вначале найти вася, и затем произвести выборку из базы, и отобразить только поля в которых присутствует "1983"

опять я повторю, твой код не правильно будет работать.. например у тебя таблица
id| name | date | sity |age|
-----------------------------
0 | Вася | 1982 |Москва| 26 |
1 | Петя | 1980 | Баку | 28 |
2 | Таня | 1983 | Питер | 25 |
3 | Маша| 1990 | Крым | 18 |
-----------------------------
В твоем примере если пользователь хочет найти имя "Вася" 1982 года рождения,
то он должен вписать Вася, 1982, Москва, 26.
а сто если пользователь не знает в каком городе этот Вася живет? Тогда твой код не вернет результата, результат будет если будут введены все поля - name AND date AND sity AND age.....
это был просто пример

Добавлено через 4 минуты 11 секунд
Но если это для какой то организации, то есть если количество записей будет не слишком большим - 50-100 записей, то можно сделать выпадающий список. Допустим ты из списка выбираешь ися Вася (если он присутствует в БД), рядом выбираешь год дождения, и др. данные..
либо.
Пользователь входит на ваш сайт, при загрузке формируется страница в элементами выпадающего списка.
Пользователь из списка выбирает дату рождения или возраст и страну или регион, вписывает нужное имя и ищет.
Кстати твой вариант будет работать только в том случае, если пользователю дать возможность не заполнять какое то поле (оставить пустым например поле "город") и при этом исключить поиск по полю Sity в таблице, если надо..
1
8 / 8 / 0
Регистрация: 01.05.2009
Сообщений: 86
03.05.2009, 21:26  [ТС]
Да нет...все работает как надо... Допустим ввожу имя и год рождения...Мне по этим данным выдаются все васи с 1982 г. рождения, живущие в разных городах и т.п.
0
365 / 68 / 2
Регистрация: 25.09.2008
Сообщений: 401
05.05.2009, 18:46
Милый Враг, на самом деле там можно взять сделать доп. проверку переменных, типа если поле оставили пустым, то в переменную записывать "%".
тогда LIKE будет выбирать все возможные записи +)
хотя я могу ошибаться, т.к. работаю с ораклом а с мусклом только балуюсь) поэтому регулярно пытаюсь что-то из оракла в мускл подставить +))
вобщем в оракле такой фокус с "%" работает точно))

во! счас нашёл, у него же вот каменты:
Code
1
2
3
4
//if (empty($name))    { $name = "%"; }
//if (empty($specy))   { $specy = "%"; }
//if (empty($country)) { $country = "%"; }
//if (empty($city))    { $city = "%"; }
собственно вот она эта проверка+) а в LIKE % означает что там произвольная строка +))
так что работает +)

Orc, по поводу раскрывающегося списка, я к сожалению счас на память непомню синтаксиса... там в хтмл-е идёт тег открытия списка, потом идут теги со значениями списка, и соответственно закрывающий тег +)
просто генерируй в пхп в цикле весь список с тегами в какую-нить переменную и через эхо прям в лоб выводи+) оно схавает и отобразит правильно +)
1
67 / 60 / 25
Регистрация: 05.05.2009
Сообщений: 131
05.05.2009, 21:18
Зачем лишний раз напрягать Мускул лайком? если пользователь не ввёл какое-то поле, то его вообще не надо учитывать в запросе. можно сделать так:

PHP
1
2
3
4
5
6
7
8
9
10
11
$q = "SELECT `id`, `name` FROM `darja` WHERE ";
 
if ((int)$_POST['id']) $q .= " `id`=".(int)$_POST['id']." AND";
if (trim($_POST['name'])) $q .= " `name` LIKE '%".$_POST['name']."%' AND";
if (trim($_POST['specy'])) $q .= " `specy` LIKE '%".$_POST['specy']."%' AND";
if (trim($_POST['country'])) $q .= " `country` LIKE '%".$_POST['country']."%' AND";
if (trim($_POST['city'])) $q .= " `city` LIKE '%".$_POST['city']."%' AND";
 
$q = preg_replace ("/AND$/", "", $q);
 
$result = mysql_query($q);
1
8 / 8 / 0
Регистрация: 01.05.2009
Сообщений: 86
07.05.2009, 16:18  [ТС]
Ну если таблица одна то можно легко поиск по неск полям осуществить... А во если таблица не одна то тут уже сложнее(
0
Телепат
 Аватар для Милый Враг
724 / 118 / 8
Регистрация: 28.04.2009
Сообщений: 442
30.05.2009, 00:53
Ничего сложного нету.. надо просто юзать сложные запросы... Мускул, точнее язык SQL поддерживает обьединение таблиц.. то есть если у тебя есть несколько таблиц, то их можно обьединить в одном запросе и работать с ними как с одной)))
0
0 / 0 / 0
Регистрация: 17.07.2015
Сообщений: 7
18.07.2015, 16:06
Darevill,
Здравствуйте! Использовала вашу подсказку в своем коде поиска по базе данным. У меня тоже несколько полей поиска и если некоторые не заполнены их нужно просто опускать. Код отлично работает с одной ошибкой, если ни одно поле не заполнено выдает ошибку, посмотрите, пожалуйста, в чем может быть загвозка?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$q = "SELECT id_spe******ts, sp_surname, sp_name, sp_last_name
FROM spe******t
WHERE ";
 
if ((int)$_POST['id_spe******ts']) $q .= " `id_spe******ts`=".(int)$_POST['id_spe******ts']." AND";
if (trim($_POST['sp_surname'])) $q .= " `sp_surname` LIKE '%".$_POST['sp_surname']."%' AND";
if (trim($_POST['sp_name'])) $q .= " `sp_name` LIKE '%".$_POST['sp_name']."%' AND";
if (trim($_POST['sp_last_name'])) $q .= " `sp_last_name` LIKE '%".$_POST['sp_last_name']."%' AND";
 
$q = preg_replace ("/AND$/", "", $q);
 
$result = mysql_query($q);
 
 
 
 
    // выводим на страницу сайта заголовки HTML-таблицы
    echo '<table rules="all" width="1000px">';
  echo '<thead>';
  echo '<tr>';
  echo '<th>N_id</th>';
  echo '<th>Фамилия</th>';
  echo '<th>Имя</th>';
  echo '<th>Отчество</th>';
  echo '</tr>';
  echo '</thead>';
  
   // выводим в HTML-таблицу все данные клиентов из таблицы MySQL 
  while($data = mysql_fetch_array($result)){ 
    echo '<tr>';
    echo '<td>' . $data['id_spe******ts'] . '</td>';
    echo '<td>' . $data['sp_surname'] . '</td>';
    echo '<td>' . $data['sp_name'] . '</td>';
    echo '<td>' . $data['sp_last_name'] . '</td>';
    echo '</tr>';
  }
  
    echo '</tbody>';
  echo '</table>'; 
 
 
    
?>
Добавлено через 56 секунд
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\rosrest.org\www\bd_spet******ti_ otchetnost_result.php on line 75

Добавлено через 18 минут
Darevill,

Передала свой запрос на поиск данных из нескольких таблиц, вообще перестало работать (((((

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
$q = "SELECT spe******t.id_spe******ts, spe******t.sp_surname, spe******t.sp_name, spe******t.sp_last_name, spe******t.sp_hire_date, professions.pr_formulation, range.rng_fomulation, organizations.org_name, spe******t.sp_dogovor, spe******t.e_mail, spe******t.telephone
FROM `spe******t`, `range`, `professions`, `organizations`
WHERE spe******t.id_range = range.id_range AND spe******t.id_profession = professions.id_profession AND spe******t.id_organization = organizations.id_organization ";
 
if ((int)$_POST['id_spe******ts']) $q .= " `spe******t.id_spe******ts`=".(int)$_POST['id_spe******ts']." AND";
if (trim($_POST['sp_surname'])) $q .= " `spe******t.sp_surname` LIKE '%".$_POST['sp_surname']."%' AND";
if (trim($_POST['sp_name'])) $q .= " `spe******t.sp_name` LIKE '%".$_POST['sp_name']."%' AND";
if (trim($_POST['sp_last_name'])) $q .= " `spe******t.sp_last_name` LIKE '%".$_POST['sp_last_name']."%' AND";
if (trim($_POST['sp_hire_date'])) $q .= " `spe******t.sp_hire_date` LIKE '%".$_POST['sp_hire_date']."%' AND";
if (trim($_POST['pr_formulation'])) $q .= " `professions.pr_formulation` LIKE '%".$_POST['pr_formulation']."%' AND";
if (trim($_POST['rng_fomulation'])) $q .= " `range.rng_fomulation` LIKE '%".$_POST['rng_fomulation']."%' AND";
if (trim($_POST['org_name'])) $q .= " `organizations.org_name` LIKE '%".$_POST['org_name']."%' AND";
if (trim($_POST['sp_dogovor'])) $q .= " `spe******t.sp_dogovor` LIKE '%".$_POST['email']."%' AND";
if (trim($_POST['email'])) $q .= " `spe******t.e_mail` LIKE '%".$_POST['country']."%' AND";
if (trim($_POST['telephone'])) $q .= " `spe******t.telephone` LIKE '%".$_POST['telephone']."%' AND";
 
$q = preg_replace ("/AND$/", "", $q);
 
$result = mysql_query($q);
 
 
 
 
    // выводим на страницу сайта заголовки HTML-таблицы
    echo '<table rules="all" width="1000px">';
  echo '<thead>';
  echo '<tr>';
  echo '<th>N_id</th>';
  echo '<th>Фамилия</th>';
  echo '<th>Имя</th>';
  echo '<th>Отчество</th>';
  echo '<th>Дата найма</th>';
  echo '<th>Профессия</th>';
  echo '<th>Ранг</th>';
  echo '<th>Организация</th>';
  echo '<th>Договор</th>';
  echo '<th>e-mail</th>';
  echo '<th>Телефон</th>';
  echo '</tr>';
  echo '</thead>';
  
   // выводим в HTML-таблицу все данные клиентов из таблицы MySQL 
  while($data = mysql_fetch_array($result)){ 
    echo '<tr>';
    echo '<td>' . $data['id_spe******ts'] . '</td>';
    echo '<td>' . $data['sp_surname'] . '</td>';
    echo '<td>' . $data['sp_name'] . '</td>';
    echo '<td>' . $data['sp_last_name'] . '</td>';
    echo '<td>' . $data['sp_hire_date'] . '</td>';
    echo '<td>' . $data['pr_formulation'] . '</td>';
    echo '<td>' . $data['rng_fomulation'] . '</td>';
    echo '<td>' . $data['org_name'] . '</td>';
    echo '<td>' . $data['sp_dogovor'] . '</td>';
    echo '<td>' . $data['e_mail'] . '</td>';
    echo '<td>' . $data['telephone'] . '</td>';
    echo '</tr>';
  }
  
    echo '</tbody>';
  echo '</table>';
0
67 / 60 / 25
Регистрация: 05.05.2009
Сообщений: 131
22.07.2015, 21:09
6 лет прошло однако

Если есть вариант, что ни один параметр не будет передан, тогда нужно проверять такую ситуацию и не выполнять запрос вообще.
Например так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$q = "SELECT id_spe******ts, sp_surname, sp_name, sp_last_name
FROM spe******t
WHERE ";
 
$where = array();
if ((int)$_POST['id_spe******ts']) $where[] = "`id_spe******ts`=".(int)$_POST['id_spe******ts'];
if (trim($_POST['sp_surname'])) $where[] = "`sp_surname` LIKE '%".$_POST['sp_surname']."%'";
if (trim($_POST['sp_name'])) $where[] = "`sp_name` LIKE '%".$_POST['sp_name']."%'";
if (trim($_POST['sp_last_name'])) $where .= "`sp_last_name` LIKE '%".$_POST['sp_last_name']."%'";
 
if (count($where))
{
    $q .= implode(' AND ', $where);
    $result = mysql_query($q);
    ....
}
А во втором случае нужно в конец основного запроса добавить AND
PHP
1
2
3
$q = "SELECT spe******t.id_spe******ts, spe******t.sp_surname, spe******t.sp_name, spe******t.sp_last_name, spe******t.sp_hire_date, professions.pr_formulation, range.rng_fomulation, organizations.org_name, spe******t.sp_dogovor, spe******t.e_mail, spe******t.telephone
FROM `spe******t`, `range`, `professions`, `organizations`
WHERE spe******t.id_range = range.id_range AND spe******t.id_profession = professions.id_profession AND spe******t.id_organization = organizations.id_organization AND";
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.07.2015, 21:09
Помогаю со студенческими работами здесь

List<>.Find, как сделать поиск по 2 полям?
public User FindUser(User user) { users.Find(delegate(User u) { return ((u.Login ==...

Нужно сделать неск мелких тестов и финальный из них. Как?
Здравствуйте, ув. форумчане. Нужно несколько страниц с тестами, допустим 5. На каждой по 10 вопросов. Вопросы разного типа:...

Сделать поиск по произвольным полям
Доброе время суток! имеется поиск по категориям, а я хочу организовать и по произвольным полям... &lt;div...

Поиск по сайту: не могу разобраться, как делать поиск по нескольким полям
поиск по одному полу осуществляется вот так: SELECT * from tablepart WHERE `marka` LIKE '%&quot; . $search . &quot;%' or `model` LIKE '%&quot;...

что лучше для виполненя: пхп как модул или пхп как CGI ?
привет, как ви думаете, все сами себя уважаюши хостер как сделал: устанавливал пхп как модул апач, или как CGI ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru