使用 PHP OR/AND

Working with PHP OR/AND

我有以下查询:

 $get_crs_mysqli = "select * from courses where course_date1 >= CURRENT_DATE() AND ((course_title like '%" . $_SESSION['userSearch'] . "%') 
    AND ((course_duration = '" . $duration1 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%') 
      OR (course_duration = '" . $duration2 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')
OR (course_duration = '" . $duration3 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%') 
OR (course_delivery2 = '" . $delivery2 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%') 
OR (course_guarantee = '" . $guarantee1 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')
OR (course_guarantee = '" . $guarantee2 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')
OR (course_city = '" . $city . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')
OR (course_subc1 = '" . $category1 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')
OR (course_subc2 = '" . $category2 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')
OR (course_subc3 = '" . $category3 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')
OR (course_subc4 = '" . $category4 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')
OR (course_subc5 = '" . $category5 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')
OR (course_delivery2 = '" . $delivery2 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%')

OR (course_delivery = '" . $delivery1 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%'))) ORDER BY course_date1 ASC LIMIT  $position, $item_per_page";

本质上发生的是用户搜索课程,然后当他们应用可选的搜索过滤器时,它会被修改以反映过滤器。例如,他们搜索所有 html,并加载所有 html,如果他们 select 持续时间为 1,那么它应该只显示 html 持续时间为 1 的课程。

在当前状态下,当一个可选过滤器被 selected 时,它保持不变,如果我改变这个

(course_duration = '" . $duration1 . "' AND course_title like '%" . $_SESSION['userSearch'] . "%') 

(course_duration = '" . $duration1 . "' OR course_title like '%" . $_SESSION['userSearch'] . "%') 

然后显示所有持续时间为 1 的课程,并完全忽略 html 查询

下面是一个带图片的例子:

首先,最好将查询重写为更具可读性的变体:

$get_crs_mysqli = "
    SELECT * 
    FROM courses 
    WHERE course_date1 >= CURRENT_DATE() 
       AND ( 
          (course_title like '%" . $_SESSION['userSearch'] . "%') 
          AND (
             (course_duration IN ('" . $duration1 . "','" . $duration2 . "','" . $duration3 . "') ) 
          OR (course_delivery2 = '" . $delivery2 . "' ) 
          OR (course_guarantee IN ('" . $guarantee1 . "','" . $guarantee2 . "' ) )
          OR (course_city = '" . $city . "')
          OR (course_subc1 = '" . $category1 . "')
          OR (course_subc2 = '" . $category2 . "')
          OR (course_subc3 = '" . $category3 . "')
          OR (course_subc4 = '" . $category4 . "')
          OR (course_subc5 = '" . $category5 . "')
          OR (course_delivery2 = '" . $delivery2 . "')
          OR (course_delivery = '" . $delivery1 . "' )
          )
        ) 
    ORDER BY course_date1 ASC 
    LIMIT  $position, $item_per_page";

现在了解如何添加或删除任何规则变得更加简单。

所以你想检查 course_duration = $duration1 而不检查 $_SESSION['userSearch']?让我们试试这个方法:

$get_crs_mysqli = "
    SELECT * 
    FROM courses 
    WHERE course_date1 >= CURRENT_DATE() 
       AND ( 
          (course_title like '%" . $_SESSION['userSearch'] . "%') 
          AND (
             (course_duration IN ('" . $duration1 . "','" . $duration2 . "','" . $duration3 . "') ) 
          OR (course_delivery2 = '" . $delivery2 . "' ) 
          OR (course_guarantee IN ('" . $guarantee1 . "','" . $guarantee2 . "' ) )
          OR (course_city = '" . $city . "')
          OR (course_subc1 = '" . $category1 . "')
          OR (course_subc2 = '" . $category2 . "')
          OR (course_subc3 = '" . $category3 . "')
          OR (course_subc4 = '" . $category4 . "')
          OR (course_subc5 = '" . $category5 . "')
          OR (course_delivery2 = '" . $delivery2 . "')
          OR (course_delivery = '" . $delivery1 . "' )
          )
          OR (course_duration = '" . $duration1 . "')
        ) 
    ORDER BY course_date1 ASC 
    LIMIT  $position, $item_per_page";

编辑 根据您的评论,我猜您应该 AND 多于 OR。所以我们不应该偷懒,用你的变量做一些工作来准备查询字符串。

$get_crs_mysqli = "
    SELECT * 
    FROM courses 
    WHERE course_date1 >= CURRENT_DATE() ";

$get_crs_mysqli .= (!empty($_SESSION['userSearch']))?(" AND course_title like '%".$_SESSION['userSearch']."%' ") : '';

$durationArr = array();
if (!empty($duration1)) $durationArr[] = $duration1;
if (!empty($duration2)) $durationArr[] = $duration2;
if (!empty($duration3)) $durationArr[] = $duration3;
if (count($durationArr)>0) {
    $get_crs_mysqli .= " AND  (course_duration IN ('".implode("','", $durationArr)."') ";
 }

$guaranteeArr = array();
if (!empty($guarantee1)) $guaranteeArr[] = $guarantee1;
if (!empty($guarantee2)) $guaranteeArr[] = $guarantee2;
if (count($guaranteeArr)>0) {
    $get_crs_mysqli .= " AND  (course_guarantee IN ('".implode("','", $guaranteeArr)."') ";
 }

$fieldsArr = array();
$fieldsArr['course_delivery2']  = $delivery2;
$fieldsArr['course_city']  = $city;
$fieldsArr['course_subc1']  = $category1;
$fieldsArr['course_subc2']  = $category2;
$fieldsArr['course_subc3']  = $category3;
$fieldsArr['course_subc4']  = $category4;
$fieldsArr['course_subc5']  = $category5;
$fieldsArr['course_delivery2']  = $delivery2;
$fieldsArr['course_delivery']  = $delivery1;
foreach ($fieldsArr as $key=>$val) {
    if (!empty($val)) {
        $get_crs_mysqli .= " AND  $key = $val ";
    }
}

$get_crs_mysqli .= "
    ORDER BY course_date1 ASC 
    LIMIT  $position, $item_per_page";