PHP & MySQL - создание фильтруемого поиска (пример предоставлен) - PullRequest
1 голос
/ 14 июля 2011

Я собираю сайт практики, использующий PHP и MySQL для репликации (или очень похожего) этот сайт . На данный момент мои доступные для поиска поля включают в себя: Аренда (мин-макс), Тип аренды (любой, квартира, дом), Количество спален (любой, 1+, 2+, 3+, 4+)

Пока у меня нет проблем с составлением кода, я просто беспокоюсь о проблемах масштабирования и хочу знать, что считается наилучшей практикой. Кроме того, любой совет о том, как повторить «поиск с помощью боковой панели», который находится на сайте, на который я ссылался (eBay также имеет нечто очень похожее), был бы великолепен.

Вот где я натолкнулся на развилку: должен ли я индивидуально обрабатывать каждый фильтр поля в запросе MySQL или я вызываю все элементы таблицы и затем фильтрую их в PHP?

    $sql = "SELECT * FROM properties ";

$properties = Property::find_by_sql($sql);
$matched_properties = array();
foreach($properties as $property):
    if ($min_rent <= $property->rent && $property->rent <= $max_rent) {
        $matched_properties[] = $property;
    }
endforeach;

Приведенный выше код извлекает все из таблицы свойств в MySQL и создает массив классов свойств (базовый класс CRUD).

Извиняюсь, если я звучу беспорядочно, но мой главный вопрос - Как я могу повторить фильтрованный поиск, такой как на этом сайте ИЛИ eBay.com? И я на правильном пути?

Спасибо

1 Ответ

0 голосов
/ 14 июля 2011

Вообще говоря, чем меньше данных нужно извлечь из базы данных для обработки в PHP, тем лучше.Меньше кода, который вам нужно написать, меньше возникающих ошибок, меньше данных для передачи через программный стек и т. Д. И т. Д. Возможно, вам придется ознакомиться с тем, как писать более сложные запросы SQL.Ниже приведен гораздо более эффективный вариант фрагмента кода, который вы дали:

$sql = "SELECT * FROM properties WHERE rent >= $min_rent AND rent <= $max_rent";
$matched_properties = Property::find_by_sql($sql);

Однако для обеспечения безопасности вам необходимо убедиться, что $min_rent и $max_rent проверены как действительные числа.(Подсказка: пропустите входные данные через is_numeric() и сгенерируйте ошибку, если эта функция вернет false.) В противном случае хакер может выполнить то, что известно как Внедрение кода , введя другие фрагменты строк запроса SQL на месте"min_rent" или "max_rent", чтобы ваш запрос делал много нежелательных вещей.

Что касается реализации механизма фильтрации, подобного этому U сайта Айовы, то это вопрос наличия ссылок или формы на боковой панели, котораяобновляет страницу при нажатии.Вы можете сделать это несколькими способами.Самый крутой способ, вероятно, использовать AJAX для автоматического обновления главного окна контента.Сайт U of Iowa, похоже, этого не делает, потому что, когда я нажимаю на различные ссылки фильтра на боковой панели, обновляется вся страница, а не только основная область содержимого.

jQuery действительно полезная библиотека JavaScript, которая может помочь вам сделать AJAX с минимальным кодированием.Проверьте это.По сути, вы захотите построить боковую панель фильтра так, чтобы каждая нажатая ссылка вызывала запрос AJAX на ваш сервер, который извлекает обновленный набор данных на основе выбранных пользователем фильтров.Когда результат возвращается из вызова AJAX, вы можете использовать методы JavaScript и / или jQuery для ввода данных по мере необходимости на вашу страницу.

Удачи!

...