2017-06-01 51 views
0

我想显示通过WHERE子句过滤的数据。我已经应用了一些变量来代替条件值,现在,如果没有条件应用,如何获取数据。我已经尝试过,但它。它正在工作,如果给定了这些值,但如果没有给出这些值,它就不起作用。如果为空,则忽略WHERE子句中的条件

它应该做什么?

它有3个过滤器。如果选择日期,那么它应该显示给定日期的数据。如果选择来源,那么它应该显示给定日期和给定来源的数据。像这样,它应该工作。

$date_from = NULL; //the value will be given if the user selects the date range 
$date_to = NULL; 

$src_id = NULL; // this value will be given if the user wants data from specific source 
$gndr_id = NULL; // if user want data by gender 

$leadSql = "SELECT 
      lead.id as lead_id 
      , lead.name as lead_name 
      , lead.phone as lead_phone 
      , lead.email as lead_email 
      , gender.name as lead_gender 
      , treatment.name as treatment_name 
      , lead.date as lead_date 
      , source.name as source_name 
      , status.name as status_name 
      , lead.remark as lead_remark 
     FROM lead 
     join treatment on treatment.id = lead.treatment_id 
     join gender on gender.id = lead.gender_id 
     join source on source.id = lead.source_id 
     join status on status.id = lead.status_id 

     where (lead.date BETWEEN $date_from and $date_to) and 
     (lead.source_id = $src_id) and (lead.gender_id = $gndr_id) 

     ORDER BY lead_date DESC"; 

请给我一些方法来做到这一点。

+0

你可以在查询中使用三元运算符,这是一种方法。 –

回答

1

据我所知,你需要在一个condictional语句中包含整个WHERE行,以表示如果值存在,则应用WHERE子句,如果不忽略它的话。

if($date_from != NULL && $date_to != NULL .....){ 
    $where_clause = "where (lead.date BETWEEN $date_from and $date_to) and 
      (lead.source_id = $src_id) and (lead.gender_id = $gndr_id)"; 
} else{ 
    $where_clause =""; 
} 

$leadSql = "SELECT 
       lead.id as lead_id 
       , lead.name as lead_name 
       , lead.phone as lead_phone 
       , lead.email as lead_email 
       , gender.name as lead_gender 
       , treatment.name as treatment_name 
       , lead.date as lead_date 
       , source.name as source_name 
       , status.name as status_name 
       , lead.remark as lead_remark 
      FROM lead 
      join treatment on treatment.id = lead.treatment_id 
      join gender on gender.id = lead.gender_id 
      join source on source.id = lead.source_id 
      join status on status.id = lead.status_id 

      ".$where_clause." 

      ORDER BY lead_date DESC"; 

可以调整的if/else根据您的需要。这是最简单的解决方案。 您可以为每个变量编写条件语句,并在末尾将它们连接在一起。

$where = []; 
$where_clause = ''; 

if ($date_from && $date_to) { 
    $where[] = "(lead.date BETWEEN $date_from and $date_to)"; 
} 

if ($src_id) { 
    $where[] = "(lead.source_id = $src_id)"; 
} 

if ($gndr_id) { 
    $where[] = "(lead.gender_id = $gndr_id)"; 
} 

if (count($where)) { 
    $where_clause = 'WHERE ' . implode(' AND ', $where); 
} 
+0

谢谢Daniel,你太棒了!有效。 – Jayprakash