![](/img/trans.png)
[英]How to filter an array in PHP by fields with empty values and multiple criteria?
[英]How to filter by multiple fields in MySQL/PHP
我现在正在为应用程序编写过滤器/排序功能,该功能将在每列上方显示文本字段。 当用户在每个字段中键入内容时,请求将被发送到后端进行排序。 由于大约有6个文本字段,所以我想知道是否有更好的排序方式,而不是使用if语句检查每个变量,并写特定的查询(如果说所有字段都输入了,只是一个或两个字段)等
似乎会有很多if语句。 有没有更直观的方式来实现这一目标?
谢谢!
任何初始数据操作(例如排序)通常都是由数据库引擎完成的。
除非您有特殊原因需要在应用程序本身中完成排序,否则在其中放置一个ORDER BY
子句。
编辑:现在您说要过滤数据。 我仍然会在数据库级别执行此操作。 向PHP发送巨大的数据集是没有意义的,只是PHP必须经过它并在那里过滤数据。 在大多数情况下,在MySQL中执行此操作将比在PHP中构建效率高得多。
由于大约有6个文本字段,我想知道是否有更好的排序方式,而不是使用if语句检查每个变量
绝对没有
首先,按顺序使用多个if没错。
相信我-我本人是减少代码重复的忠实拥护者,但是请考虑将这些手动编写的块作为最佳解决方案。
接下来,尽管可以通过某种循环包装这些条件,但是大多数情况下,不同的条件需要不同的处理。
但是,在下一个语句中,您错了:
并编写特定的查询
您只需要一个查询
似乎会有很多if语句。
为什么? 不超过您拥有的字段数。
这是自定义搜索查询构建代码的完整示例:
$w = array();
$where = '';
if (!empty($_GET['rooms'])) $w[]="rooms='".mesc($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mesc($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'";
if (count($w)) $where="WHERE ".implode(' AND ',$w);
$query="select * from table $where";
用户进入查询的唯一字段。
订购将以几乎相同的方式进行。
select * from Users
order by Creadted desc, Name asc, LastName desc, Status asc
您的记录将根据查询的顺序进行排序。
首先按Created desc创建,然后按Name asc依次类推。
但是从您的问题中我可以看到您正在搜索过滤结果。
因此,要按多个文件过滤,只需将您的位置附加在后面,或者如果您使用的是任何ORM,则可以通过对象方法来完成。
但是,如果它很简单,您可以通过这种方式进行
$query = "";
foreach($_POST['grid_fields'] as $key => $value)
{
if(strlen($query) > 0)
$query .= ' and '
$query .= sprintf(" %s LIKE '%s' ", mysql_real_escape_string($key), '%' .mysql_real_escape_string($value) .'%');
}
if(strlen($query) > 0)
$original_query .= ' where ' . $query;
这可以帮助您实现目标。
不能。在对集合进行排序时,您无法避免测试操作,因为您必须以相同的方式比较集合中的元素。 这样做的载体是if语句。
你能看看这个吗?
WHERE (ifnull(@filter1, 1) = 1 or columnFilter1 = @filter1)
and (ifnull(@filter2, 1) = 1 or columnFilter2 = @filter2)
and (ifnull(@filter3, 1) = 1 or columnFilter3 = @filter3)
and (ifnull(@filter4, 1) = 1 or columnFilter4 = @filter4)
and (ifnull(@filter5, 1) = 1 or columnFilter5 = @filter5)
and (ifnull(@filter6, 1) = 1 or columnFilter6 = @filter6)
如果我误解了您的问题,请让我知道。它不像IF语句批处理,而且很冗长,但是您认为呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.