在连接查询中使用多个 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 将失败。
个人比较喜欢第二种方式,但要视情况而定
如果 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 将失败。
个人比较喜欢第二种方式,但要视情况而定