2012-11-09 7 views
1

Мне нужно сделать запрос в MySQL. Но запрос нужно сделать динамически с параметрами, выбранными пользователем.Построение запроса с параметрами

Варианты День, Месяц, Год & SellerID.

Пользователь будет выбирать, хочет ли он просматривать историю продаж у продавцов по дням, месяцам и годам.

Но, допустим, он хочет видеть все продажи на March, 2012. Он оставит день в пустой и получить все продажи от 01 марта по 31 марта ...

А может быть, он оставляет возможность месяц в пустой, и установить день = 15 и Год = 2012 , он получит историю продаж с 2012 года и 15-го числа каждого месяца.

Моей программе необходимо создать запрос, который точно отражает то, что он хотел просмотреть.

Возникает вопрос:
ли мне действительно нужно использовать тысячи IF на мой код? Разве нет лучшего способа сделать это?

if(($day==0) && ($month==0) && ($year>0)){ 

    $query.="`date`>='{$year}-01-01' AND `date`<='{$year}-12-31'"; 

}elseif(($day==0) && ($month>0) && ($year>0)){ 

    $query.="`date`>='{$year}-{$month}-01' AND `date`<='{$year}-{$month}-31'"; 

}elseif{ 

etc... 
+0

Я ценю, что у вас есть * некоторые * ошибка проверка. Однако я рекомендую вам рассмотреть [SQL Injection] (http://php.net/manual/en/security.database.sql-injection.php) и [Подготовленные утверждения] (http://php.net/manual/ о/mysqli.quickstart.prepared-statements.php). –

+0

Итак, вы используете раскрывающийся список для каждого параметра? Не календарный виджет? Переосмысливая пользовательский интерфейс, некоторые могут сделать это проще. Sane по умолчанию и хороший интерфейс могут позволить вам то, что вы хотите, не имея необходимости писать столько логики на контроллере. – ficuscr

+0

Спасибо за указание SQL-инъекций Джейсон, я знаю его существование, но моя система будет использоваться только для авторизованного персонала, и они не испортят свою собственную базу данных. – BernaMariano

ответ

3

Вы могли предобработки значения перед их использованием:

$year = $year > 0 ? (int) $year : 2012; 
$month = $month > 0 ? (int) $month : 1; 
$day = $day > 0 ? (int) $day : 1; 

$query .= sprintf("`date` BETWEEN '%4d-%2d-%2d' AND '%4d-%2d-%2d'", 
    $year, $month, $day, 
    $year, $month, 31 
); 
+0

Функция 'between' предотвращает ее обработку моего второго примера, но это лучше, чем 'IF', я буду использовать его, спасибо – BernaMariano

+0

Если он оставляет« Месяц »в пустом и устанавливает только« День »и« Год », он получит историю продаж за весь год, бот только желаемый день каждого месяца. @rid – BernaMariano

+0

@BernaMariano, 'BETWEEN x AND y' похож на' ...> = x AND ... <= y'. The '> =/<= 'версия должна работать так же хорошо. – rid

0

RESTRICT сортировкой год, месяц, формат даты или месяца, год формат месяц или формат Год, означает уровень вашей сортировки в иерархии и для этого вам нужно обрабатывать 3 случая здесь, который будет работать только на два ИНЕК ДАТА> = DYNAMIC_START_DATE и ДАТА < = DYNAMIC_END_DATE (Вы также можете использовать BETWEEN здесь)

  • Если задан только год, то вы должны указать дату начала в качестве 1-го янв. Года и дату окончания 31-го декабря.
  • Если задан месяц И Год, то вы должны указать дату начала в качестве 1-го месяца и даты окончания как [2830/31] месяц год
  • Если заданы только дата и месяц И Год, тогда вы должны указать дату начала в качестве даты месяца и даты окончания в качестве даты месяца.
Смежные вопросы