首页 > 解决方案 > 创建了一个向 sql 查询添加条件但由于“AND”语句而返回 0 个结果的搜索表单

问题描述

我创建了一个包含复选框的搜索表单,用户选择复选框,然后过滤掉显示的结果。

目前它在某种程度上有效,但是,由于“AND”语句,它返回 0 结果。

例如

举个例子,我的数据库有一个名为 vibes 的列,我有 2 条记录,

name         | vibes
Brunch1      | Party Animal, Music Maniac, Arty        
Brunch2      | Arty, Party Animal        

假设用户选择了 Party Animal、Arty 的复选框

它返回“早午餐 1 和早午餐 2”,但是如果用户选择Touristy复选框并提交表单,它会返回 0 个结果,因为它正在检查vibes 列中是否Brunch1有。Brunch2Touristy

我假设它与添加 AND 语句有关,这就是单击提交后 SQL 查询当前的样子...

SELECT b.*, host FROM brunches b LEFT JOIN hosts ON hosts.id = 
b.hostid WHERE approved ='1' AND vibes LIKE '%Arty%' AND vibes LIKE 
'%Party Animal%' AND vibes LIKE '%Touristy%' 

我的php代码

$brunches = "SELECT b.*, host
FROM brunches b
LEFT JOIN hosts ON hosts.id = b.hostid  ";
$conditions = array();


$conditions[] = "approved ='1'";


if(! empty($vibes)) {
   foreach($vibes as $tag):
     $conditions[] = "vibes LIKE '%$tag%'";
   endforeach;
}

$sql = $brunches;
   if (count($conditions) > 0) {
   $sql .= " WHERE " . implode(' AND ', $conditions);
}

$sql= $this->db->query($sql);

我相信因为它使用 AND 而不是 OR,

但是,我在搜索表单中有其他字段,例如“名称”,因此确实要求它类似于 WHERE name = '' AND approved = '1' AND vibe= ''

ETC

希望这是有道理的。

标签: phpmysql

解决方案


where您可以在子句中添加approved = 1 作为硬编码,将like部分添加到括号中并通过OR而不是链接AND。我还移动了它添加的部分,它WHERE创建ifconditions值......

$sql = $brunches;
if(! empty($vibes)) {
    $conditions = [];
    foreach($vibes as $tag) {
        $conditions[] = "vibes LIKE '%$tag%'";
    }
    $sql .= PHP_EOL."WHERE approved ='1' and (" . implode(' OR ', $conditions).")";
}

这会产生类似...

SELECT b.*, host
FROM brunches b
LEFT JOIN hosts ON hosts.id = b.hostid   
WHERE approved ='1' and (vibes LIKE '%a%' OR vibes LIKE '%b%')

推荐阅读