php - 可以在同一表 SQL 的一列或多列中进行搜索
问题描述
我有一个夹板,上面展示了几种产品。左侧是几个选项,以便人们可以在产品列表中进行过滤。
如果变量具有值,我正在尝试创建一个表单,它将被组装成部分。
这是我的代码:
if (!empty($_GET) && (!empty($_GET['search']))) {
$where = "WHERE";
}else{
$url_atual = "";
}
if (isset($_GET['search']) && ($_GET['search'] != "")) {
$serch = "titulo LIKE '%".$_GET['search']."%' ";
}else{
$serch = "";
}
if (isset($_GET['cat']) && ($_GET['cat'] != "")) {
$cat = "AND categoria = ".$_GET['cat']." ";
}else{
$cat = "";
}
if (isset($_GET['cat_sub']) && ($_GET['cat_sub'] != "")) {
$cat_sub = "AND subcategoria IN ('".$_GET['cat_sub']."')";
}else{
$cat_sub = "";
}
if (isset($_GET['fpag']) && ($_GET['fpag'] != "all")) {
$fpag = "AND fixoHora = '".$_GET['fpag']."' ";
}else{
$fpag = "";
}
$projetos = $conn->query("SELECT * FROM projetos {$where} {$serch} {$cat} {$cat_sub} {$fpag} LIMIT {$inicio},{$itens_por_pagina}");
问题
在我使用AND
, 变量的开头,如果有任何变量没有初始化,比如search
,就会报错,因为它会这样开始:
SELECT * FROM projetos AND cat = 1
有没有更好的方法来进行这些搜索?
谢谢您的帮助!
解决方案
开发动态查询是一件棘手的事情,因为您必须考虑所有可能的变化和可能性。因此,您拥有的选择越少越好。在这种情况下,你有 4 个。我解决这个问题的方法是详细说明每个结果。我并不是说这是完美的,有人可能会提出更好更简洁的方法,但这就是我的做法:
1.用伪代码绘制你的逻辑
从基本查询开始
有搜索词吗?
是:添加“喜欢”
否:空白
有分类和搜索吗?
是:添加“AND 类别”
否:有类别吗?
是:添加“类别”。
否:空白
是否有类别和子类别或搜索和子类别?
是:添加“AND 子类别”
否:是否有子类别?
是:添加“子类别”
否:空白
是否有类别或子类别或搜索
是:如果有 fpag,添加 'AND fpag'
否:是否有 fpag
是:添加 'fpag'
否:空白
2. 转换为 if 和 else 语句并附加原始查询
//Basic query
if (!empty($_GET)) {
$query = "SELECT * FROM projetos WHERE ";
}
else{
$query = "SELECT * FROM projetos";
}
//is there a search term?
if (isset($_GET['search']) && ($_GET['search'] != "")) {
$query .= "titulo LIKE '%".$_GET['search']."%' ";
}
else{
$query .= "";
}
//is there a category and a search?
if (isset($_GET['cat']) && (isset($_GET['search']))) {
$query .= "AND categoria = ".$_GET['cat']." ";
}
else{
if (isset($_GET['cat'])){
$query .= "categoria = ".$_GET['cat']." ";
}
else{
$query .= "";
}
}
//is there a Category and a subcategory OR a search and a Subcategory?is there a Category and a subcategory OR a search and a Subcategory?
if (isset($_GET['cat']) && isset($_GET['cat_sub']) || isset($_GET['search']) && isset($_GET['cat_sub'])){
$query .= "AND subcategoria IN ('".$_GET['cat_sub']."') ";
}
else{
if(isset($_GET['cat_sub'])){
$query .= "subcategoria IN ('".$_GET['cat_sub']."') ";
}
else{
$query .= "";
}
}
//is there a Category OR a subcategory OR a Search
if(isset($_GET['cat']) || isset($_GET['search']) || isset($_GET['cat_sub'])){
if(isset($_GET['fpag'])){
$query .= "AND fixoHora = '".$_GET['fpag']."' ";
}
else{
$query .= "";
}
}
else{
if(isset($_GET['fpag'])){
$query .= "fixoHora = '".$_GET['fpag']."' ";
}
else{
$query .= "";
}
}
$projetos = $conn->query($query . "LIMIT {$inicio},{$itens_por_pagina}");
我快速检查了上面的代码,它似乎有效。可以修改上述代码以确保 $_GET 值不为空,但可以在加载页面之前在验证中完成。
我希望这有帮助。
推荐阅读
- java - 如何对使用尚未实现为方法参数的接口的类执行 JUnit 测试?
- php - 如何从子目录中删除所有 .gif 图像
- c - 普通 C:为什么这个 scanf 代码不起作用?
- android - 用于跟踪的 Firebase 动态链接:应用安装、首次打开、在应用内部重新打开并使用客户事件
- python - 如何为另一个包打包类型存根?
- javascript - 无法使用已通过浏览器扩展附加到 DOM 的 Cypress.io 选择元素
- javascript - 循环元素javascript
- go - 从核心函数中获取未知类型的 nil 值
- tcp - 灯服务器中的 WordPress 端口转发后我无法从 wlan 访问它
- c# - 在 C# 中以编程方式更改串行端口配置