Как отфильтровать набор результатов, используя строку запроса в PHP / MySQL? - PullRequest
1 голос
/ 08 июня 2009

Я создаю страницу событий, похожую на last.fm / events

Пользователь может фильтровать события по дате, категории и т. Д. С параметрами, передаваемыми в строке запроса

Мой вопрос: каков наилучший способ структурировать ваш код (запросы, циклы), чтобы учесть эти разные типы запросов, и потенциально объединить их (например, отфильтровать по дате и категории)

Я ищу практические примеры / ссылки на то, как создать страницу такого типа (набор результатов, который можно отфильтровать с помощью строки запроса).

Ответы [ 2 ]

5 голосов
/ 08 июня 2009

Общий шаблон для создания пользовательских запросов к базе данных:

$sql  = 'SELECT * FROM foo ';
$sql .= 'WHERE 1 ';

if (array_key_exists('category', $_GET)) {
    $sql .= sprintf('AND category_id = %d ', intval($_GET["category"]));
}

if (array_key_exists('date', $_GET)) {
    $sql .= sprintf('AND date = "%s" ', mysql_real_escape_string($_GET["date"]));
}

// and so on...

Или, используя PDO:

$params = array();

$sql  = 'SELECT * FROM foo ';
$sql .= 'WHERE 1 ';

if (array_key_exists('category', $_GET)) {
    $sql .= 'AND category_id = ? ';
    $params[] = $_GET["category"];
}

if (array_key_exists('date', $_GET)) {
    $sql .= 'AND date = ? ';
    $params[] = $_GET["date"];
}

// and so on...

$stmt = $db->prepare($sql);
$stmt->execute($params);

Если вам необходимо выполнить дополнительную фильтрацию результата базы данных, просто используйте цикл для копирования данных в целевой массив и continue всякий раз, когда вы сталкиваетесь со строкой, которая должна быть пропущена в результате.

0 голосов
/ 08 июня 2009

Во-первых, если вы используете данные из строки запроса для выполнения запросов, вы захотите использовать подготовленные операторы / хранимые процедуры для безопасности. Плюс, так как MySQL 5.1.17 кэширование запросов работает с подготовленными операторами.

Подготовленные операторы могут быть построены так же, как обычный запрос в PHP, объединяя различные части запроса, необходимые для этого конкретного запроса.

Во избежание неприятностей, связанных с необходимостью помещать промежуточные элементы 'AND', вы можете назначить каждый оператор массиву используемых вещей и затем взорвать их:

if(use_date) $sql_where[] = "date = ?";
if(use_category) $sql_where[] = "category = ?";
$sql = $sql . implode(" AND ", $sql_where);

Повторение процедуры (или одновременное выполнение) для вставки полей данных, необходимых для запроса.

...