【问题标题】:Working with PHP OR/AND使用 PHP OR/AND
【发布时间】:2015-03-26 12:43:28
【问题描述】:

我有以下疑问:

 $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,如果他们选择持续时间 1,那么它应该只显示持续时间为 1 的 html 课程。

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

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

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

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

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

【问题讨论】:

  • 是的,这就是它应该做的,为什么会有不同的词'OR'和'AND'
  • 我认为我的工作不正确。它假设首先根据 and 用户的搜索结果填充结果,并且如果用户选择一个过滤器而不是缩小选项以反映该过滤器,则它有一个选项,就像在这个示例中 html 然后检查 duration1 应该只填充课程html和duration1,如果duration2被检查,那么用duration2
  • 任何帮助或提示将不胜感激
  • 警告:使用mysqli 时,您应该使用参数化查询和bind_param 将用户数据添加到您的查询中。 请勿使用字符串插值来完成此操作,因为您将创建严重的SQL injection bugs切勿将任意用户数据直接放入查询中。

标签: php html mysql search mysqli


【解决方案1】:

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

$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";

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

$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";

【讨论】:

  • 感谢您的澄清,是的,这种方式更容易查看查询。不幸的是,当检查一个项目时,它似乎没有填充不同的结果(进入具体),问题仍然存在
  • @explain 你的目标更深入。我猜你不需要那些OR。 you need them only if some checkbox like (category1, category2 ... etc) is selected?所以如果选择了 2 个复选框,它必须是 AND 而不是 OR?
  • 完全正确。这些过滤器是可选的。当页面加载时,它会读取用户输入的搜索查询,因此填充的结果基于其搜索。然后当用户选择像 category1 或 category2 这样的复选框时,它会进入细节。例子。填充 html 的课程,然后用户检查 duration1,因此如果用户检查 duration1 和 2,则显示只有 duration1 的所有 html 课程,然后显示具有 duration1 和 2 的 html 课程,因此结果数量减少。一开始它没有考虑过滤器,因此结果更大
  • 哎呀对不起,有一个错字一定是这样的:IN ('".implode("','", $durationArr)."')) ";检查更新的代码
  • 再复制一次,我的另一个错字一定是(!empty($_SESSION['userSearch']))?
猜你喜欢
  • 2012-01-14
  • 2016-09-07
  • 1970-01-01
  • 2012-10-10
  • 2017-03-21
  • 2021-09-18
  • 2013-06-04
相关资源
最近更新 更多