php - 如果 WHERE 子句为空则忽略条件

标签 php mysql database mysqli

我想显示按 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";

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

最佳答案

据我所知,您需要在条件语句中包含整个 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);
}

关于php - 如果 WHERE 子句为空则忽略条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44312934/

相关文章:

php - paypal iPN 和 custom 不会将自定义变量添加到数据库

Php Login/Mysql 检查 mysql 不适用于 SHA512

php - 将 Laravel 应用程序转移到新服务器 - 无法正常工作

mysql - SQL:检查现在时间戳是否大于过期时间戳

java - 如何在 AWS 实例中设置与 Mysql 的 jdbc 连接?

sql - 我怎样才能批量更新这个?

php - DOCKERFILE:运行多个 CMD。 (启动 NGINX 和 PHP)

php - 我一直收到 "You have an error in your SQL syntax",如果直接运行,SQL 会工作

php - 在 PHP 中从操作表单调用函数的最佳方法是什么?

带有 CONCAT 和 DATE_FORMAT 的 MySQL IF