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
Форумы портала PHP.SU :: Версия для печати :: Фильтр для поиска по базе
Форумы портала PHP.SU » » Вопросы новичков » Фильтр для поиска по базе

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

1. file.shreder - 11 Июня, 2015 - 14:14:37 - перейти к сообщению
Подскажите, кто знает, у меня не получается, как сделать форму для поиска по базе состоящую из трех параметров, в первом - регионы, во втором сфера деятельности, и третий в виде чекбокса дополнительный критерий. Может быть несколько вариантов, первый и третий, второй и третий, по одиночке, первый и второй, так вот у меня обработчик формы не правильно проверяет форму. А на основе проверки надо же запрос правильно составить...
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.  

в некоторых случаях, когда надо первый вариант применить, оно применяет последний, наверное потому, что
2. Panoptik - 11 Июня, 2015 - 14:33:30 - перейти к сообщению
код на свалку. и вперед читать учебники
3. file.shreder - 11 Июня, 2015 - 15:19:49 - перейти к сообщению
Panoptik пишет:
код на свалку. и вперед читать учебники


нигде по именно моему вопросу не могу найти, я уже с утра сижу в гугле, намекни
4. Tyoma5891 - 11 Июня, 2015 - 15:37:40 - перейти к сообщению
file.shreder пишет:
Panoptik пишет:
код на свалку. и вперед читать учебники


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


зачем тут гуглить, просто взять и сделать, переписать нормально условия и все
5. file.shreder - 11 Июня, 2015 - 15:57:45 - перейти к сообщению
Tyoma5891 пишет:
file.shreder пишет:
Panoptik пишет:
код на свалку. и вперед читать учебники


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


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

я вчера весь вечер делал, брал и делал вроде все просто, а в деле, почему не работает как надо
6. Panoptik - 11 Июня, 2015 - 16:15:28 - перейти к сообщению
ну давай попорядку посмотрим
первая строка
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

пишем базовый запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM tbl


Пишем заготовку для условия, есть 2 варианта
1) добавлять каждое новое условие а-ля
CODE (SQL):
скопировать код в буфер обмена
  1. AND field1 = 'var1'

CODE (SQL):
скопировать код в буфер обмена
  1. AND field2 = 'var2'

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

можно вылечить примерно таким
добавить подефолту
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE 1
и после конкатенировать выражения с 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_, и замечания по этому поводу заберу, но не удалю. что касается подготовленных выражений, так это должно быть в любом случае
7. file.shreder - 11 Июня, 2015 - 16:21:07 - перейти к сообщению
Panoptik пишет:

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


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

ты просто копипастишь в тему? ты где видел mysql?????????????
(Добавление)
и код там по моему не так уж и страшно оторматирован, но вообще - спасибо
(Добавление)
не читай так много луркоморья
(Добавление)
этот диалект - уже как минимум противно слушать
8. Sail - 11 Июня, 2015 - 16:56:10 - перейти к сообщению
file.shreder, нарисуйте блок-схему по приведённому в первом сообщении коду...
Наверняка сразу увидите, в чём подвох.
А так-же проделайте за PHP-интерпретатор его работу с ручкой (карандашом) и листом бумаги...
Ранжируйте условия, при которых должны выполняться разные блоки операторов... (помня о том, что пересечение множеств A и B является подмножеством и A и B)
Вспомните, что оператор ветвления обеспечивает выполнение либо одной, либо другой последовательности команд, в зависимости от истинности условия...
И то, что последовательность команд выполняется до тех пор, пока не будет достигнут конец скрипта, либо работа скрипта будет прервана соответствующей командой, или оператором...
9. Tyoma5891 - 11 Июня, 2015 - 17:11:44 - перейти к сообщению
Цитата:
А так-же проделайте за PHP-интерпретатор его работу с ручкой (карандашом) и листом бумаги...

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

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

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

я занимался и не раз. Помогает... (правда это самое последнее,что я делаю,если то "что должно работать" не работает)))
12. file.shreder - 11 Июня, 2015 - 21:21:11 - перейти к сообщению
ни хера не могу понять:

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.  


в каждом условии есть
PHP:
скопировать код в буфер обмена
  1. echo $sql."
чтобы понять, какое условие сработало, так вот, я делал и так
PHP:
скопировать код в буфер обмена
  1.  if(!empty($_POST['region']))
и этак
PHP:
скопировать код в буфер обмена
  1.  if(isset($_POST['region']))
делаю запрос с двумя параметрами регион и сфера, понятно, что рабатывает и первое условие и второе, как состваить условие, чтобы в случае второго фильтра, первый вообще не срабатывал?
(Добавление)
еще, по второму фильтру выводит ошибку, в случае когда сфера деятельности = Водопостачання та водовідведення: Ошибка -
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
и так со всеми, первое слово режет
13. likvidator - 11 Июня, 2015 - 21:56:36 - перейти к сообщению

мб
PHP:
скопировать код в буфер обмена
  1. "AND sfera_diyalnosti='$s'";
14. file.shreder - 11 Июня, 2015 - 22:03:19 - перейти к сообщению
likvidator пишет:
мб

я могу сюда дописать еще с десяток вариантов, каких я перепробовал
(Добавление)
Братанчик, извини
PHP:
скопировать код в буфер обмена
  1. "AND sfera_diyalnosti='$s'";

этот не пробовал, и он РАБОТАЕТ!!! Но проблема с тем как исключать условие которое не актуально? потому что эхо срабатывает и там и там, а если добавить сюда параметров фильтра,б по городам и еще по чем то, то оно не только эхо выведет а может и запрос не правильный построить, хотя... БУДУ ДЕЛАТЬ МЕТОДОМ ТЫКА! Спасибки!!!!
15. Ts.Saltan - 11 Июня, 2015 - 22:22:28 - перейти к сообщению
file.shreder пишет:
$result1 = mysqli_query($link, "SELECT * FROM `table_1` WHERE `region`='$reg'

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

будут преследовать тебя вечно

 

Powered by ExBB FM 1.0 RC1