MySQL запрос не работает, если пользователь заполняет только одно поле - PullRequest
0 голосов
/ 08 мая 2011

Я работаю в CodeIgniter с поиском, который будет запрашивать базу данных.

Три поля: «Местоположение» (раскрывающийся список), «Дата» (дата) и «Тип события» (раскрывающийся список).

Код, который я сейчас использую:

public function search_flyers($location, $date) {
    $date = $this->utils_model->get_sql_date($date);
    $query = $this->db->query("SELECT *, flyers.fid FROM flyers 
                LEFT JOIN event_dates ON flyers.fid = event_dates.fid 
                WHERE ((flyers.interval='weekly' 
                    AND DATEDIFF('" . $date . "',flyers.start_date)%7=0 
                    AND '" . $date . "' <= flyers.end_date)
                  OR (flyers.interval='fornightly' 
                    AND DATEDIFF('" . $date . "',flyers.start_date)%14=0 
                    AND '" . $date . "' <= flyers.end_date)
                  OR (flyers.interval='manual' 
                    AND event_dates.date = '" . $date . "' 
                    OR flyers.start_date = '".$date."' 
                    AND '".$date."' <= flyers.end_date) AND flyers.approved = 1) 
                AND flyers.location = '".$location."' 
                GROUP BY flyers.fid 
                ORDER BY flyers.start_date ASC");

    $data['flyers'] = $query->result();
    $data['rows'] = $query->num_rows();

    return $data;

Упомянутая дата события используется вместе с полем «интервал», чтобы определить, попадает ли событие в дату, которую искал пользователь.

Событие также должно быть одобрено для возможности показа в результатах поиска.

Проблема в том, что форма не работает, если пользователь заполняет только одно поле.

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

Обычно я бы изменил AND flyers.location... на OR flyers.location, но это означает, что он вернет результаты либо даты, либо местоположения, которое вы указали.

1 Ответ

1 голос
/ 28 августа 2011

Существует несколько способов решения этой проблемы, но самый быстрый - просто установить значение по умолчанию в самой сигнатуре метода.

Вместо

public function search_flyers($location, $date) 

вы можете добавить значение по умолчаниюзначения, устанавливая их следующим образом (только пример)

public function search_flyers($location = 'mylocationstring', $date = strtotime("-1 week"))

Если пользователь не выберет дату или местоположение, $ date и $ location по умолчанию будут соответствовать указанным вами значениям.

Теперь более чистым способом было бы на самом деле убедиться, что пользователь правильно заполнил форму в представлении, прежде чем позволить ему отправить ее.Вы можете сделать это с помощью проверки формы CodeIgniter http://codeigniter.com/user_guide/libraries/form_validation.html, не позволяя пользователю запускать search_flyers ($ date, $ location), если запуск проверки формы равен false

if ($this->form_validation->run() == FALSE) 
{
   //go back to your initial view
}
else
     {
          $data['results'] = search_flyers($location,$date)     
                  $this->load->view('form success',$data);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...