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 :: Фильтр для поиска по базе
Покинул форум
Сообщений всего: 286
Дата рег-ции: Окт. 2014
Помог: 2 раз(а)
[+]
Подскажите, кто знает, у меня не получается, как сделать форму для поиска по базе состоящую из трех параметров, в первом - регионы, во втором сфера деятельности, и третий в виде чекбокса дополнительный критерий. Может быть несколько вариантов, первый и третий, второй и третий, по одиночке, первый и второй, так вот у меня обработчик формы не правильно проверяет форму. А на основе проверки надо же запрос правильно составить...
$result1=mysqli_query($link,"SELECT * FROM `table_1` WHERE `region` = '$reg' AND `sfera_diyalnosti`='$sfera' ORDER BY id DESC") or die(mysqli_error($link));
$a=2;
}
}
в некоторых случаях, когда надо первый вариант применить, оно применяет последний, наверное потому, что
то что реквест метод может быть постом ладно и если это важно то хорошо что мы это проверяем, второе условие может с легкостью вызвать нотис если не будет в посте этого индекса
в куске кода несколько раз вызывается одна и та же функция и смертоносный die()
во-первых функции mysql_* это прошлый век (читаем про mysqli, а лучше про PDO)
во-вторых убивать скрипт die некошерно
в-третьих вызов должен быть всего один и в конце, а до того всего лишь формирование запроса
есть такой принцип называется DRY (don't repeat yourself) что значит "не повторяйся"
собственно нужно об этом почитать
далее еще бы порекомендовал почитать про булеву алгебру
ну и по сабжу как сделать фильтр - вопрос можно преобразовать в формулировку как составить sql
что тут еще не так? - отсутствие секурности. то есть примерно как заниматься сексом без контрацептивов
понятное дело что вместо слов var1, var2 будут какие-то переменные и чаще всего эти переменные приходят к нам от пользователя. тут нас может поджидать западло, а именно некоторый абстрактный умный пользователь может ввести данные которые сломают запрос, например кавычку, но хуже если он подкинет туда не только кавычку, но и еще дополнительный запрос (например, на удаление данных)
короче, читаем еще про SQL-инъекции, а заодно и про prepared statement и PDO
вобщем пример на PDO я уже писать не буду, в интернетах примеров полно, но если это код из первого поста будет продолжать жить, то лучше у меня больше ничего не спрашивать
помоему общую идею и проблемы я осветил, осталось дело за малым
ну и еще рекомендация форматировать нормально код, чтобы было понятно какой блок кода за что отвечает и визуально можно было понять вложенность
на сем пока закончу, следующие замечания будут только к обновленному коду с учетом текущих проблем (Добавление)
ПС: щас заметил что в коде используется все-таки mysqli_, и замечания по этому поводу заберу, но не удалю. что касается подготовленных выражений, так это должно быть в любом случае
Покинул форум
Сообщений всего: 286
Дата рег-ции: Окт. 2014
Помог: 2 раз(а)
[+]
Panoptik пишет:
второе условие может с легкостью вызвать нотис если не будет в посте этого индекса
вторым условием я проверяю какая форма сработала, по скрытому полю, его и проверяю (Добавление)
Panoptik пишет:
во-первых функции mysql_* это прошлый век (читаем про mysqli, а лучше про PDO)
ты просто копипастишь в тему? ты где видел mysql????????????? (Добавление)
и код там по моему не так уж и страшно оторматирован, но вообще - спасибо (Добавление)
не читай так много луркоморья (Добавление)
этот диалект - уже как минимум противно слушать
Sail
Отправлено: 11 Июня, 2015 - 16:56:10
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Помог: 57 раз(а)
file.shreder, нарисуйте блок-схему по приведённому в первом сообщении коду...
Наверняка сразу увидите, в чём подвох.
А так-же проделайте за PHP-интерпретатор его работу с ручкой (карандашом) и листом бумаги...
Ранжируйте условия, при которых должны выполняться разные блоки операторов... (помня о том, что пересечение множеств A и B является подмножеством и A и B)
Вспомните, что оператор ветвления обеспечивает выполнение либо одной, либо другой последовательности команд, в зависимости от истинности условия...
И то, что последовательность команд выполняется до тех пор, пока не будет достигнут конец скрипта, либо работа скрипта будет прервана соответствующей командой, или оператором...
Tyoma5891
Отправлено: 11 Июня, 2015 - 17:11:44
Частый посетитель
Покинул форум
Сообщений всего: 621
Дата рег-ции: Авг. 2013
Помог: 5 раз(а)
Цитата:
А так-же проделайте за PHP-интерпретатор его работу с ручкой (карандашом) и листом бумаги...
Sail а Вы лично когда-нибудь подобным занимались?
file.shreder
Отправлено: 11 Июня, 2015 - 17:23:52
Посетитель
Покинул форум
Сообщений всего: 286
Дата рег-ции: Окт. 2014
Помог: 2 раз(а)
[+]
Sail пишет:
file.shreder, нарисуйте блок-схему по приведённому в первом сообщении коду...
Наверняка сразу увидите, в чём подвох.
А так-же проделайте за PHP-интерпретатор его работу с ручкой (карандашом) и листом бумаги...
Ранжируйте условия, при которых должны выполняться разные блоки операторов... (помня о том, что пересечение множеств A и B является подмножеством и A и B)
Вспомните, что оператор ветвления обеспечивает выполнение либо одной, либо другой последовательности команд, в зависимости от истинности условия...
И то, что последовательность команд выполняется до тех пор, пока не будет достигнут конец скрипта, либо работа скрипта будет прервана соответствующей командой, или оператором...
Оно вообще то правильно сказано!
likvidator
Отправлено: 11 Июня, 2015 - 19:51:59
Посетитель
Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012
Помог: 4 раз(а)
[+]
Tyoma5891 пишет:
Sail а Вы лично когда-нибудь подобным занимались?
я занимался и не раз. Помогает... (правда это самое последнее,что я делаю,если то "что должно работать" не работает)))
file.shreder
Отправлено: 11 Июня, 2015 - 21:21:11
Посетитель
Покинул форум
Сообщений всего: 286
Дата рег-ции: Окт. 2014
делаю запрос с двумя параметрами регион и сфера, понятно, что рабатывает и первое условие и второе, как состваить условие, чтобы в случае второго фильтра, первый вообще не срабатывал? (Добавление)
еще, по второму фильтру выводит ошибку, в случае когда сфера деятельности = Водопостачання та водовідведення: Ошибка -
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
этот не пробовал, и он РАБОТАЕТ!!! Но проблема с тем как исключать условие которое не актуально? потому что эхо срабатывает и там и там, а если добавить сюда параметров фильтра,б по городам и еще по чем то, то оно не только эхо выведет а может и запрос не правильный построить, хотя... БУДУ ДЕЛАТЬ МЕТОДОМ ТЫКА! Спасибки!!!!
Ts.Saltan
Отправлено: 11 Июня, 2015 - 22:22:28
Посетитель
Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013 Откуда: Belarus
Помог: 22 раз(а)
file.shreder пишет:
$result1 = mysqli_query($link, "SELECT * FROM `table_1` WHERE `region`='$reg'
раз уж используешь mysqli, будь добр, пользуйся подготовленными выражениями
иначе ошибки типа этой
file.shreder пишет:
я могу сюда дописать еще с десяток вариантов, каких я перепробовал
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.