php - 如果用户只填写一个字段,MySQL 查询将不起作用

标签 php mysql forms codeigniter

我正在 CodeIgniter 中进行搜索,该搜索将查询数据库。

这三个字段是“Location”(下拉列表)、“Date”(日期)和“Event Type”(下拉列表)。

我当前使用的代码是:

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,但这意味着它将返回日期或位置的结果您指定的。

最佳答案

有多种方法可以解决此问题,但最快的方法是简单地在方法签名本身中设置默认值。

而不是

public function search_flyers($location, $date) 

您实际上可以通过像这样设置它们来添加默认值(只是一个示例)

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

如果用户未选择日期或位置,$date 和 $location 将默认为您指定的值。

现在,更简洁的方法是在让用户提交表单之前实际验证用户是否已在 View 中正确填写表单。您可以使用 CodeIgniter 的表单验证来做到这一点 http://codeigniter.com/user_guide/libraries/form_validation.html如果表单验证运行等于 false,则不让用户运行 search_flyers($date,$location)

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);
    }

关于php - 如果用户只填写一个字段,MySQL 查询将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924047/

相关文章:

forms - Google 表单计时器

PHP、isset 以及如何去掉重复的变量链?

mysql - 从多个表中提取不同的记录作为一个交易历史列表

php - 如何使 SSL 覆盖 1 个主域下不同目录中的 2 个 WordPress 安装

php - 如何将具有一对多关系的数据从 MySQL 处理到 PHP

Mysql 将几个查询合二为一?

php - html 表单预设值字段

javascript - 如何将 html 文本表单发送到 javascript?

php - 字符串到数组返回参数中的数组

php - Zend 中缓慢的 Postgres 查询