php - 创建了一个向 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
有。Brunch2
Touristy
我假设它与添加 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
希望这是有道理的。
解决方案
where
您可以在子句中添加approved = 1 作为硬编码,将like
部分添加到括号中并通过OR
而不是链接AND
。我还移动了它添加的部分,它WHERE
创建if
了conditions
值......
$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%')
推荐阅读
- matlab - 不符合 3-d 矩阵和向量的参数
- java - 使用 feignclient 访问 HTTPS url 时的证书路径问题
- database-design - 如何设计数据库模式来存储文章某些部分的评论?
- powershell - 过滤/删除 CSV 文件的最后一列
- angular - 角度迁移(从 4 到 6)警告 - 无法解析流
- c# - Xamarin.Forms.Mac 命令未调用
- android - 如何在内部存储中为其他使用 android 的应用程序公开共享文件?
- javascript - Angular 6 从 HTMLTemplateElement 创建 HTMLElement
- android - 使用 IMASDK、android 暂停广告?
- php - 如何使用更改事件 ExtJS 重置组合框值