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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: -
file.shreder
Отправлено: 11 Июня, 2015 - 14:14:37
Post Id


Посетитель


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


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

[+]


Подскажите, кто знает, у меня не получается, как сделать форму для поиска по базе состоящую из трех параметров, в первом - регионы, во втором сфера деятельности, и третий в виде чекбокса дополнительный критерий. Может быть несколько вариантов, первый и третий, второй и третий, по одиночке, первый и второй, так вот у меня обработчик формы не правильно проверяет форму. А на основе проверки надо же запрос правильно составить...
PHP:
скопировать код в буфер обмена
  1.  
  2. if ($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['form1_in_modal'] == 'search')
  3.         {
  4.               if(isset($_POST['region']))
  5.                                 {
  6.                                  $reg=$_POST['region'];
  7.                                  $result1 = mysqli_query($link, "SELECT * FROM `table_1` WHERE `region` = '$reg' ORDER BY id DESC") or die(mysqli_error($link));
  8.                                  $a = 1;
  9.                                 }
  10.                                
  11.                         if(isset($_POST['sfera']))
  12.                                 {                              
  13.                                  $sfera = $_POST['sfera'];
  14.                                  $result1 = mysqli_query($link, "SELECT * FROM `table_1` WHERE  `sfera_diyalnosti`='$sfera' AND `member_or_not`='1'") or die(mysqli_error($link));
  15.                                  $a = 5;
  16.                                 }
  17.                                
  18.                                
  19.                         if(isset($_POST['region']) && (isset($_POST['sfera'])))
  20.                                 {
  21.                                  $reg   = $_POST['region'];
  22.                                  $sfera = $_POST['sfera'];
  23.                                  $result1 = mysqli_query($link, "SELECT * FROM `table_1` WHERE `region` = '$reg' AND `sfera_diyalnosti`='$sfera' ORDER BY id DESC") or die(mysqli_error($link));
  24.                                  $a = 2;
  25.                                 }
  26.  
  27.  
  28.          }
  29.  

в некоторых случаях, когда надо первый вариант применить, оно применяет последний, наверное потому, что
 
 Top
Panoptik
Отправлено: 11 Июня, 2015 - 14:33:30
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




код на свалку. и вперед читать учебники


-----
Just do it
 
 Top
file.shreder
Отправлено: 11 Июня, 2015 - 15:19:49
Post Id


Посетитель


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


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

[+]


Panoptik пишет:
код на свалку. и вперед читать учебники


нигде по именно моему вопросу не могу найти, я уже с утра сижу в гугле, намекни
 
 Top
Tyoma5891
Отправлено: 11 Июня, 2015 - 15:37:40
Post Id


Частый посетитель


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


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




file.shreder пишет:
Panoptik пишет:
код на свалку. и вперед читать учебники


нигде по именно моему вопросу не могу найти, я уже с утра сижу в гугле, намекни


зачем тут гуглить, просто взять и сделать, переписать нормально условия и все
 
 Top
file.shreder
Отправлено: 11 Июня, 2015 - 15:57:45
Post Id


Посетитель


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


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

[+]


Tyoma5891 пишет:
file.shreder пишет:
Panoptik пишет:
код на свалку. и вперед читать учебники


нигде по именно моему вопросу не могу найти, я уже с утра сижу в гугле, намекни


зачем тут гуглить, просто взять и сделать, переписать нормально условия и все

я вчера весь вечер делал, брал и делал вроде все просто, а в деле, почему не работает как надо
 
 Top
Panoptik
Отправлено: 11 Июня, 2015 - 16:15:28
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




ну давай попорядку посмотрим
первая строка
PHP:
скопировать код в буфер обмена
  1. if ($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['form1_in_modal'] == 'search')

то что реквест метод может быть постом ладно и если это важно то хорошо что мы это проверяем, второе условие может с легкостью вызвать нотис если не будет в посте этого индекса

читаем про isset, empty, array_key_exists

в куске кода несколько раз вызывается одна и та же функция и смертоносный die()

во-первых функции mysql_* это прошлый век (читаем про mysqli, а лучше про PDO)
во-вторых убивать скрипт die некошерно
в-третьих вызов должен быть всего один и в конце, а до того всего лишь формирование запроса

есть такой принцип называется DRY (don't repeat yourself) что значит "не повторяйся"
собственно нужно об этом почитать

далее еще бы порекомендовал почитать про булеву алгебру

ну и по сабжу как сделать фильтр - вопрос можно преобразовать в формулировку как составить sql

пишем базовый запрос


Пишем заготовку для условия, есть 2 варианта
1) добавлять каждое новое условие а-ля


но тут беда, если мы добавим к WHERE такое то получится что-то типа
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE AND field1 = 'var1' AND field2 = 'var2'

можно вылечить примерно таким
добавить подефолту и после конкатенировать выражения с AND

2) добавлять все условия в массив и после заимплодить их через AND
PHP:
скопировать код в буфер обмена
  1. $sql = 'SELECT * FROM tbl';
  2. $wheres = [];
  3. if($condition1) {
  4.   $wheres[] = 'field1 = "var1"';
  5. }
  6. if($condition2) {
  7.   $wheres[] = 'field2 = "var2"';
  8. }
  9. if($wheres) {
  10.   $sql .= ' WHERE ' . implode(' AND ', $wheres);
  11. }


что тут еще не так? - отсутствие секурности. то есть примерно как заниматься сексом без контрацептивов

понятное дело что вместо слов var1, var2 будут какие-то переменные и чаще всего эти переменные приходят к нам от пользователя. тут нас может поджидать западло, а именно некоторый абстрактный умный пользователь может ввести данные которые сломают запрос, например кавычку, но хуже если он подкинет туда не только кавычку, но и еще дополнительный запрос (например, на удаление данных)

короче, читаем еще про SQL-инъекции, а заодно и про prepared statement и PDO

вобщем пример на PDO я уже писать не буду, в интернетах примеров полно, но если это код из первого поста будет продолжать жить, то лучше у меня больше ничего не спрашивать

помоему общую идею и проблемы я осветил, осталось дело за малым

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

на сем пока закончу, следующие замечания будут только к обновленному коду с учетом текущих проблем
(Добавление)
ПС: щас заметил что в коде используется все-таки mysqli_, и замечания по этому поводу заберу, но не удалю. что касается подготовленных выражений, так это должно быть в любом случае

(Отредактировано автором: 11 Июня, 2015 - 16:16:12)



-----
Just do it
 
 Top
file.shreder
Отправлено: 11 Июня, 2015 - 16:21:07
Post Id


Посетитель


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


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

[+]


Panoptik пишет:

второе условие может с легкостью вызвать нотис если не будет в посте этого индекса


вторым условием я проверяю какая форма сработала, по скрытому полю, его и проверяю
(Добавление)
Panoptik пишет:
во-первых функции mysql_* это прошлый век (читаем про mysqli, а лучше про PDO)

ты просто копипастишь в тему? ты где видел mysql?????????????
(Добавление)
и код там по моему не так уж и страшно оторматирован, но вообще - спасибо
(Добавление)
не читай так много луркоморья
(Добавление)
этот диалект - уже как минимум противно слушать
 
 Top
Sail
Отправлено: 11 Июня, 2015 - 16:56:10
Post Id



Участник


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


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




file.shreder, нарисуйте блок-схему по приведённому в первом сообщении коду...
Наверняка сразу увидите, в чём подвох.
А так-же проделайте за PHP-интерпретатор его работу с ручкой (карандашом) и листом бумаги...
Ранжируйте условия, при которых должны выполняться разные блоки операторов... (помня о том, что пересечение множеств A и B является подмножеством и A и B)
Вспомните, что оператор ветвления обеспечивает выполнение либо одной, либо другой последовательности команд, в зависимости от истинности условия...
И то, что последовательность команд выполняется до тех пор, пока не будет достигнут конец скрипта, либо работа скрипта будет прервана соответствующей командой, или оператором...
 
 Top
Tyoma5891
Отправлено: 11 Июня, 2015 - 17:11:44
Post Id


Частый посетитель


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


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




Цитата:
А так-же проделайте за PHP-интерпретатор его работу с ручкой (карандашом) и листом бумаги...

Sail а Вы лично когда-нибудь подобным занимались? Улыбка
 
 Top
file.shreder
Отправлено: 11 Июня, 2015 - 17:23:52
Post Id


Посетитель


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


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

[+]


Sail пишет:
file.shreder, нарисуйте блок-схему по приведённому в первом сообщении коду...
Наверняка сразу увидите, в чём подвох.
А так-же проделайте за PHP-интерпретатор его работу с ручкой (карандашом) и листом бумаги...
Ранжируйте условия, при которых должны выполняться разные блоки операторов... (помня о том, что пересечение множеств A и B является подмножеством и A и B)
Вспомните, что оператор ветвления обеспечивает выполнение либо одной, либо другой последовательности команд, в зависимости от истинности условия...
И то, что последовательность команд выполняется до тех пор, пока не будет достигнут конец скрипта, либо работа скрипта будет прервана соответствующей командой, или оператором...

Оно вообще то правильно сказано!
 
 Top
likvidator
Отправлено: 11 Июня, 2015 - 19:51:59
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


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

[+]



Tyoma5891 пишет:
Sail а Вы лично когда-нибудь подобным занимались?

я занимался и не раз. Помогает... (правда это самое последнее,что я делаю,если то "что должно работать" не работает)))
 
 Top
file.shreder
Отправлено: 11 Июня, 2015 - 21:21:11
Post Id


Посетитель


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


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

[+]


ни хера не могу понять:

PHP:
скопировать код в буфер обмена
  1.  
  2. if(!empty($_POST['region']))
  3. {
  4.         $reg = $_POST['region'];
  5.         $sfera = '';
  6.         $sql = "SELECT * FROM `table_1` WHERE `region`='$reg' ".$sfera."  ORDER BY id DESC";
  7.         echo $sql."<br/>";
  8.         $result1 = mysqli_query($link, "SELECT * FROM `table_1` WHERE `region`='$reg' ".$sfera."  ORDER BY id DESC") or die(mysqli_error($link));
  9.                                
  10. }
  11. if(isset($_POST['region']) && ($_POST['sfera']))
  12. {
  13.         $reg = $_POST['region'];
  14.         $s = $_POST['sfera'];
  15.         $sfera = "AND sfera_diyalnosti=".$s;
  16.         $sql = "SELECT * FROM `table_1` WHERE `region`='$reg' ".$sfera."     ORDER BY id DESC";
  17.         echo $sql."<br/>";
  18.         $result1 = mysqli_query($link, "SELECT * FROM `table_1` WHERE `region`='$reg' ".$sfera."  ORDER BY id DESC") or die(mysqli_error($link));
  19.                                
  20. }
  21.  


в каждом условии есть чтобы понять, какое условие сработало, так вот, я делал и так и этак делаю запрос с двумя параметрами регион и сфера, понятно, что рабатывает и первое условие и второе, как состваить условие, чтобы в случае второго фильтра, первый вообще не срабатывал?
(Добавление)
еще, по второму фильтру выводит ошибку, в случае когда сфера деятельности = Водопостачання та водовідведення: Ошибка -
CODE (htmlphp):
скопировать код в буфер обмена
  1. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'та водовідведення ORDER BY id DESC' at line 1
и так со всеми, первое слово режет

(Отредактировано автором: 11 Июня, 2015 - 21:23:05)

 
 Top
likvidator
Отправлено: 11 Июня, 2015 - 21:56:36
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


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

[+]



мб
 
 Top
file.shreder
Отправлено: 11 Июня, 2015 - 22:03:19
Post Id


Посетитель


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


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

[+]


likvidator пишет:
мб

я могу сюда дописать еще с десяток вариантов, каких я перепробовал
(Добавление)
Братанчик, извини
этот не пробовал, и он РАБОТАЕТ!!! Но проблема с тем как исключать условие которое не актуально? потому что эхо срабатывает и там и там, а если добавить сюда параметров фильтра,б по городам и еще по чем то, то оно не только эхо выведет а может и запрос не правильный построить, хотя... БУДУ ДЕЛАТЬ МЕТОДОМ ТЫКА! Спасибки!!!!
 
 Top
Ts.Saltan
Отправлено: 11 Июня, 2015 - 22:22:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013  
Откуда: Belarus


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




file.shreder пишет:
$result1 = mysqli_query($link, "SELECT * FROM `table_1` WHERE `region`='$reg'

раз уж используешь mysqli, будь добр, пользуйся подготовленными выражениями
иначе ошибки типа этой
file.shreder пишет:
я могу сюда дописать еще с десяток вариантов, каких я перепробовал

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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB