Во-первых, если вы используете данные из строки запроса для выполнения запросов, вы захотите использовать подготовленные операторы / хранимые процедуры для безопасности. Плюс, так как MySQL 5.1.17 кэширование запросов работает с подготовленными операторами.
Подготовленные операторы могут быть построены так же, как обычный запрос в PHP, объединяя различные части запроса, необходимые для этого конкретного запроса.
Во избежание неприятностей, связанных с необходимостью помещать промежуточные элементы 'AND', вы можете назначить каждый оператор массиву используемых вещей и затем взорвать их:
if(use_date) $sql_where[] = "date = ?";
if(use_category) $sql_where[] = "category = ?";
$sql = $sql . implode(" AND ", $sql_where);
Повторение процедуры (или одновременное выполнение) для вставки полей данных, необходимых для запроса.