PHP: кодирование «расширенный поиск» лучший способ - PullRequest
2 голосов
/ 02 октября 2010

Хорошо, я хотел бы получить несколько советов о том, как правильно выполнить расширенный поиск профилей.

Расширенный поиск содержит:

Gender   female/both/male
Search in    All/latest profiles 1/2/7/14/32 days ago
Online: Yes(checked)
Age (xx) to (xx) years (xx means you can write e.g 12 and 18)
Cities: all/city1/city2/city3

Существует множество критериев, которые вы можете выбрать.

Я хотел бы знать, как мне кодировать это наиболее эффективным способом с наименьшим повторением кода. Должен ли я построить запрос из того, что выбирает пользователь? Пример:

$query = "SELECT * FROM users WHERE"
if(!empty($gender){ // if its empty, then the user chose both..
    $query .= "gender = $gender";
}
....

Или есть лучшие решения? Я думаю, что это приведет к проблемам, потому что, если пользователь не выбирает пол, а другой, если $ online (пример) начинается с AND, это приведет к ГДЕ И ..

Ответы [ 3 ]

0 голосов
/ 02 октября 2010

Проблема «и» решается довольно просто:

$andArr[] = "gender = $gender";
$andArr[] = "age between $from and $to";
...

$adsString = implode(' AND ', $andArr);

Для пола я бы использовал выпадающий список с "обоими", как было предварительно выбрано.

0 голосов
/ 02 октября 2010

Пожалуйста, не пишите код, который позволяет SQL-инъекции . Также убедитесь, что ваш php-код работает с register_globals, установленным на off. Кроме того, я не думаю, что есть какая-то причина, почему это не сработало бы.

Итак, вот простой пример использования PDO :

$query = 'SELECT * FROM users WHERE 1';
$params = array();
if (!empty($_POST['gender'])) {
    $query .= ' AND gender=:gender'
    $params[':gender'] = $_POST['gender'];
}
...
$st = $pdo->prepare($query);
$result = $st>execute($params);
0 голосов
/ 02 октября 2010

Я думаю, что ваше решение - хорошее начало. Продолжайте проверять поля расширенного поиска и, при необходимости, создавайте выражение SQL where.

Проблема возникнет, если вам понадобится нечеткая логика - мужчины или город1. Но вы не указали это в своем ОП.

Чтобы избежать WHERE AND, просто начните выражение where с истинного выражения:

$query = "SELECT * FROM users WHERE 1"

Это всегда будет иметь значение true, и когда вы добавите больше условий, они будут добавлены правильно - SELECT * FROM users WHERE 1 AND city = 'city1'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...