Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php/mysql级联过滤_Php_Mysql_Filtering - Fatal编程技术网

php/mysql级联过滤

php/mysql级联过滤,php,mysql,filtering,Php,Mysql,Filtering,我想创建一些链接过滤器,用户可以使用这些过滤器缩小数据库中的数据列表 例如,我有5种过滤器类型: 按日期 按地点 按类型 按主题 按关键字 用户可以同时自由使用所有、部分或不使用这些过滤器 我的第一印象是,我必须存储一个变量,其中WHERE子句的所有AND和OR一个接一个地堆叠在一起,但这似乎很乏味,因为我以后可能不得不以编程方式添加/删除一些过滤器类型 有没有一种方法可以不使用我过滤一次的整个mysql数据来处理一个巨大的请求,而是将目标请求链接起来,如果需要,我可以添加/撤销这些请求 我的意

我想创建一些链接过滤器,用户可以使用这些过滤器缩小数据库中的数据列表

例如,我有5种过滤器类型:

按日期 按地点 按类型 按主题 按关键字 用户可以同时自由使用所有、部分或不使用这些过滤器

我的第一印象是,我必须存储一个变量,其中WHERE子句的所有AND和OR一个接一个地堆叠在一起,但这似乎很乏味,因为我以后可能不得不以编程方式添加/删除一些过滤器类型

有没有一种方法可以不使用我过滤一次的整个mysql数据来处理一个巨大的请求,而是将目标请求链接起来,如果需要,我可以添加/撤销这些请求

我的意思是,我可以一个接一个地过滤每个先前过滤结果的结果吗

例如,不要这样做:

SELECT * FROM mytable WHERE (A=3 AND B=4 AND ((C>date1) OR (D<date2)) AND D LIKE '%sample%' )
有没有可能做一些事情来实现这个想法:

request 1 = SELECT * FROM mytable WHERE A=3
request 2 = SELECT * FROM "result of request 1" WHERE B=4
request 3 = SELECT * FROM "result of request 2" WHERE C>date1 OR D<date2
request 4 = SELECT * FROM "result of request 3" WHERE E LIKE '%sample%'
如果过滤器要随着时间的推移而改变,那么第一种方法很难管理,而第二种方法只是将所需的过滤器添加/撤回到链中。 更不用说,过滤器越多,第一种方法就越不可读和不可管理

如果我在检索整个mysql表后决定过滤数据,这可以在纯php中实现,但这似乎会适得其反,而且更加冗长,而mysql已经具备了直接过滤数据所需的一切,而且从mysql获取整个数据似乎没有用,因为我最后只需要部分数据


谢谢您的帮助。

我更喜欢第一个场景,我假设您正在提交一个表单来决定要过滤的内容。我要做的是使其具有可伸缩性和易于阅读,只需将表单字段命名为与DB字段相同的名称。然后,您可以保留包含要使用的字段的数组,或者进行db调用以检查某个字段是否是要在筛选器中使用的字段。一个简单的例子

$filterFields = array('startDate'=>'>',
                         'endDate'=>'<',
                         'location'=>'=',
                        'keyword'=>'LIKE');

function buildQuery($filterFields, $mysqli)
{
    $partCount = 0;
    $query = "SELECT * FROM mytable WHERE ";

    foreach($_POST as $key=>$value)
    {
        //is the field one we want to use? Does it contain a value?
        if(in_array($key, array_keys($filterFields) && !empty($value))
        {
            if($partCount > 1)
                $query .= ' AND ';

            if($filterFields[$key] == 'LIKE')
                $query .= "  `".$key."` LIKE '%".mysqli->real_escape_string($value)."%' ";

            else
              $query .= " `".$key."` ".$filterFields[$key]." '".mysqli->real_escape_string($value)."' ";

            ++$partCount;
        }
    }

    return $query;
}

希望这是有道理的。如果这不是你想要的,或者你需要澄清,让我知道。这也没有经过测试,只是写在这里。

这可以通过将结果保存为json,然后客户端过滤记录来完成。我相信我也可以在服务器端使用php实现这一点,但这是否意味着它在mysql中是完全可撤销的?没有办法在新的mysql查询中重用以前的mysql结果吗?你不能这样做,你可以使用php数组通过使用数组搜索来过滤你的mysql记录,但不能使用mysql查询。使用json过滤器是一种有效的方法