在连接查询中使用多个 and 条件

Using multiple and condition in join query

如果 post 中的值不等于空白,我想加入查询,并且当 post 值中的值都为空时,它可以完美运行。问题是当值只有一个 post 时,然后 AND 出现在任何其他第二个值之前。希望得到解决方案。我正在使用核心 PHP

if(!empty($_POST['agent_wise'])){       
    $agent_wise = $_POST['agent_wise'];
    $queryCondition .= "allusers.sno ='$agent_wise'";
} 

if(!empty($_POST['status_wise'])){      
    $status_wise = $_POST['status_wise'];
    $queryCondition .= " AND st_application.admin_status_crs ='$status_wise'";
}   
if(!empty($_POST['course_wise'])){      
    $course_wise = $_POST['course_wise'];
    $queryCondition .= " AND st_application.prg_name1 ='$course_wise'";
}


$result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where " . $queryCondition . " ";

懒惰的 hack 也是在第一个条件中包含一个 AND,并将 WHERE 更改为 WHERE 1,但我怀疑还有更聪明且易于搜索的方法解决这个。哦,还有关于 sql 注入和准备语句的重要性

试试这个代码。

if(!empty($_POST['agent_wise'])){      
    $agent_wise = $_POST['agent_wise'];
    $queryCondition .= "allusers.sno ='$agent_wise'";
 } 

if(!empty($_POST['status_wise'])){      
    $status_wise = $_POST['status_wise'];
    $queryCondition .= " AND st_application.admin_status_crs ='$status_wise'";
}   

if(!empty($_POST['course_wise'])){      
    $course_wise = $_POST['course_wise'];
    $queryCondition .= " AND st_application.prg_name1 ='$course_wise'";
}


$queryCondition = trim($queryCondition, 'AND'); 


$result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where " . $queryCondition . " ";

希望对你有帮助

这是解决方案...

$flag = 0;
if(!empty($_POST['agent_wise'])){ 
        $flag = 1;    
        $agent_wise = $_POST['agent_wise'];
        $queryCondition .= "allusers.sno ='$agent_wise'";
     } 

if(!empty($_POST['status_wise'])){      
        $status_wise = $_POST['status_wise'];
        if($flag == 1){
        $queryCondition .= " AND st_application.admin_status_crs ='$status_wise'";
        }
      else {
        $queryCondition .= " st_application.admin_status_crs ='$status_wise'";
         $flag = 1;
  }
    }   
    if(!empty($_POST['course_wise'])){      
        $course_wise = $_POST['course_wise'];
       if ($flag == 1){
        $queryCondition .= " AND st_application.prg_name1 ='$course_wise'";
      }
       else {
           $queryCondition .= " st_application.prg_name1 ='$course_wise'";
    }
    }


$result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where " . $queryCondition . " ";

连接前检查空字符串 'AND'。

$queryCondition .=  (empty($queryCondition) ? "" : " AND ") . 
    "st_application.admin_status_crs ='$status_wise'"

您的问题有两种解决方案。一种SQL解法和一种PHP解法:

第一个解决方案

if(!empty($_POST['agent_wise'])){       
    $agent_wise = $_POST['agent_wise'];
    $queryCondition .= " AND allusers.sno ='$agent_wise'";
} 

if(!empty($_POST['status_wise'])){      
    $status_wise = $_POST['status_wise'];
    $queryCondition .= " AND st_application.admin_status_crs ='$status_wise'";
}   
if(!empty($_POST['course_wise'])){      
    $course_wise = $_POST['course_wise'];
    $queryCondition .= " AND st_application.prg_name1 ='$course_wise'";
}


$result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where TRUE" . $queryCondition . " ";

这是可行的,因为在 WHERE TRUE AND 'something else' 中,TRUE 条件是多余的。唯一的缺点是,如果存在 none 个 POST,您将取回所有记录,因为 WHERE TRUE 总是带回记录。但是您可以轻松地检查所有 POST 是否存在,如果不存在则退出:

if (empty($_POST['agent_wise']) && empty($_POST['status_wise']) && empty($_POST['course_wise']) ) exit;

第二种解法

$queryConditionsArray = [];

if(!empty($_POST['agent_wise'])){       
    $agent_wise = $_POST['agent_wise'];
    $queryConditionsArray[] = "allusers.sno ='$agent_wise'";
} 

if(!empty($_POST['status_wise'])){      
    $status_wise = $_POST['status_wise'];
    $queryConditionsArray[] = "st_application.admin_status_crs ='$status_wise'";
}   
if(!empty($_POST['course_wise'])){      
    $course_wise = $_POST['course_wise'];
    $queryConditionsArray[] = "st_application.prg_name1 ='$course_wise'";
}

$queryCondition = implode(' AND ', $queryConditionsArray);

$result2 = "SELECT * FROM st_application INNER JOIN allusers on st_application.user_id = allusers.sno where " . $queryCondition . " ";

这是有效的,因为 implode 只会在条件之间插入单词 'AND' - 而不是在每个条件的开头。同样,您将必须检查是否不存在 POST,否则您的 SQL 将失败。

个人比较喜欢第二种方式,但要视情况而定