过滤和排序函数


PHP MYSQL - Filter and sort function

我正在为一个网站做一个过滤器和排序选项,似乎被卡住了。完整的代码可以在这里看到:http://pastebin.com/pYfnLiSZ

这不是100%完成…像这样的部分

        if(array_key_exists('number', $sorts))
        {
            $issue = $sorts['number'];
            $setIssue = "AND i.item_number = ?";
        }

仍然需要编辑一点,但我希望它是可以理解的。

我不明白的部分是这个(pastebin中的第126行):

if( !empty($userIDS) && $letter )
        {
            $ref = array();
            foreach($userIDS as $id)
            {
                $ref[] = $id['followed'];
            }
            $ref[] = $letter;
            $params = implode(",", array_fill(0, count($userIDS), "?"))."?";
            $prep = implode("", array_fill(0, count($userIDS), "i"))."s";
        }

我不确定如何使上述if动态。我只需要它,如果$userIDS数组不为空,$letter$year$publisher$number设置。所以它基本上可以是任何组合。$userIDS数组中属于用户的项目,并通过字母、年份、出版商、数字进行筛选,将来可能还会进行其他筛选。也可以是年份和出版商,或者出版商、数字和年份……等等

既然你正在尝试"约束或条件的组合",我可以建议你使用以下我用于商店的模式:

    定义一个类
  1. 制定规则
  2. 得到查询
  3. 优化缓存或其他东西

     class condition {
     public function add($query) {
         $this->query[] = $query;
         return $this;
     }
     public function get() {
         return " SELECT * FROM TABLE WHERE " . implode(" and " ,$this->query);
     }
    
     $con = new condition();
      $query =   $con->add("price > 100 and price < 200")->add("year > 1980")->get();
    

我在工作中使用了类似的东西,但显然不是把它们放在一起:

$search = [
    'fields' => [
        'name',
        'phone',
        'email'
    ],
    'filter' => [
        'name LIKE' => 'Joe'
    ]
];
function search(array $search) {
    $allowedFields = [
        'name',
        'phone',
        'email',
        'address',
    ];
    $allowedFilters = [
        'name',
        'phone',
        'email',
    ];
    $allowedActions = [
        '=',
        'LIKE',
        '<',
        '<=',
        '>',
        '>=',
    ];
    $fields = array();
    if(isset($search['fields'])) {
        foreach($search['fields'] as $field) {
            if(in_array($field, $allowedFields)) $fields[] = $field;
        }
    } else {
        $fields = $allowedFields;
    }
    $filters = array();
    if(isset($search['filters'])) {
        foreach($search['filters'] as $filter => $val) {
            $filter_split = explode(' ', $filter);
            $field = $filter;
            $action = '=';
            if(count($filter_split) > 1) {
                $field = $filter_split[0];
                $action = $filter_split[1];
            }
            if(!in_array($action, $allowedActions)) continue;
            if(in_array($field, $allowedFilters)) $filters[] = "{$field} {$action} {$val}";
        }
    }
    $fields_str = implode(',', $fields);
    $query = "SELECT {$fields_str} FROM users "
    if(count($filters) > 0) {
        $first = true;
        foreach($filters as $filter) {
            $action = 'AND';
            if($first) {
                $action = 'WHERE';
                $first = false;
            }
            $query .= "{$action} {$filter} ";
        }
    }
    mysqli_query($db, $query);
}