我正在为网站制作过滤器和排序选项,似乎卡住了。整个代码可以在这里看到: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
数组中用户的项目,按字母,年份,发布者,数字和未来其他过滤器进行过滤。或者它可以是年份和出版商,或出版商,数量和年份......等等。
答案 0 :(得分:1)
由于您正在尝试“约束或条件的组合”,我可以建议您使用以下用于商店的模式:
优化缓存或其他内容
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();
答案 1 :(得分:0)
我在工作中使用类似于此的东西,但显然不是一起扔的:
$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);
}