Php 日期和更多参数之间的Codeigniter搜索

Php 日期和更多参数之间的Codeigniter搜索,php,codeigniter,search,Php,Codeigniter,Search,我正在尝试在我的页面上实现搜索引擎,我想使用以下参数搜索票证: 车票#和/或 范围/关键字(票据描述中的任何单词或字符)和/或 在两个日期之间,开始日期和结束日期 我的模型中的搜索功能如下所示: function search($id,$scope,$start_date,$end_date) { if (!empty($id) || !empty($scope)){ $this->db->like('TROUBLE_ID', $id);

我正在尝试在我的页面上实现搜索引擎,我想使用以下参数搜索票证:

  • 车票#和/或
  • 范围/关键字(票据描述中的任何单词或字符)和/或
  • 在两个日期之间,开始日期和结束日期
  • 我的模型中的搜索功能如下所示:

    function search($id,$scope,$start_date,$end_date)
        {
            if (!empty($id) || !empty($scope)){
            $this->db->like('TROUBLE_ID', $id);
            $this->db->or_like('PROBLEM_DESCRIPTION', $scope);
            $this->db->where('ASSIGNED_DATE >=', $start_date);
            $this->db->where('ASSIGNED_DATE <=', $end_date); 
            $query = $this->db->get($this->db);
            return $query->result_array();
            }
            else {echo 'No results to display';}
        }
    
    和“查看结果”页面:

    <?php
    foreach($results as $row){
        $id = $row['TROUBLE_ID'];
    ?>
        <tr>
            <td><?php echo $row['TROUBLE_ID']?></td>
            <td><?php echo $row['ASSIGNED_DATE']?></td>
            <td><?php echo $row['CREATOR']?></td>
            <td><?php echo $row['PROBLEM_DESCRIPTION']?></td>
            <td><?php echo $row['RESOLUTION']?></td>
            <td><?php echo $row['RESOLVED_DATE']?></td>            
        </tr>
    
    <?php
    }
    }
    ?>
    
    
    
    但不知何故,搜索没有正确进行,如果我将ticket#字段留空,并且没有在这两个日期之间过滤ticket,则搜索不起作用。有什么想法吗?谢谢

    尝试使用

    $this->db->last_query() 
    

    然后直接在phpmyadmin中尝试sql,这将帮助您找到问题。

    我认为您有两个不同的问题。我猜测日期搜索不起作用是因为它们不是yyyy-mm-dd格式,这是MySQL进行比较所需要的

    如果您将ID保留为空,则不起作用,因为您没有将此行从空白ID的条件中排除

        $this->db->like('TROUBLE_ID', $id);
    
    因此,如果您将一个空白ID留空,但该行始终包含在内,那么您要求MySQL只返回具有空白ID的行

    这是解决问题的一种方法。我删除了这个示例中的一个参数,因为如果您知道id,您可能也不需要关键字,而且为了使示例更简单

    function search($id_or_scope, $start_date, $end_date)
        {
            if (!empty($id_or_scope))
            {
              if (is_numeric($id_or_scope))
                $this->db->like('TROUBLE_ID', $id_or_scope);
              else
                $this->db->like('PROBLEM_DESCRIPTION', $id_or_scope);
    
              $this->db->where('ASSIGNED_DATE >=', $start_date);
              $this->db->where('ASSIGNED_DATE <=', $end_date); 
              $query = $this->db->get($this->db);
              return $query->result_array();
            }
            else {echo 'No results to display';}
        }
    
    函数搜索($id\u或\u范围,$start\u日期,$end\u日期)
    {
    如果(!空($id\u或\u范围))
    {
    如果(是数字($id\u或\u范围))
    $this->db->like('TROUBLE\u ID'、$ID\u或\u scope);
    其他的
    $this->db->like('PROBLEM\u DESCRIPTION'、$id\u或\u scope);
    $this->db->where('ASSIGNED_DATE>=',$start_DATE);
    
    $this->db->where('ASSIGNED#DATE)如果您将票据字段保留为空,则它不起作用,因为存在一个条件,
    如果(!empty($id)| |!empty($scope)){
    我将该条件用于测试目的,即使我删除它,它也不起作用。您是否尝试$this->db->last#query()?我使用
    $this->output->enable#profiler(TRUE)
    并显示没有像您的方法那样进行任何查询,但是从哪里来的
    $id\u或\u scope
    ?而且所有字段都是可选的,有或没有,我认为这是我的问题,因为如果我将任何字段留空,所有记录都会显示如果它们都是可选的,那么您将需要对每个参数使用if语句。如果参数为空,请不要包含该参数的db->where子句。在我的示例中,$id\u或\u范围将以调用$this->rfi\u model->search($id\u或\u范围、$start\u date、$end\u date)方法的方式显示;如果在将每个参数包括在db类中之前对其进行if检查以检查其是否为空,那么您自己的原始代码也可以正常工作。如果它们都是可选的,那么您可以将每个where或like子句包装在if条件中,这将省略与空值的比较。
    function search($id_or_scope, $start_date, $end_date)
        {
            if (!empty($id_or_scope))
            {
              if (is_numeric($id_or_scope))
                $this->db->like('TROUBLE_ID', $id_or_scope);
              else
                $this->db->like('PROBLEM_DESCRIPTION', $id_or_scope);
    
              $this->db->where('ASSIGNED_DATE >=', $start_date);
              $this->db->where('ASSIGNED_DATE <=', $end_date); 
              $query = $this->db->get($this->db);
              return $query->result_array();
            }
            else {echo 'No results to display';}
        }