使用 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";
我有以下查询:
$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";