考虑任何电子商务网站的情况,我们根据零到“n”个约束参数(例如价格、可用性、品牌等)过滤产品结果,其中“n”是允许的最大可能约束数。在这样做的同时,我们也可以添加或删除参数选择(例如,删除价格约束)。
我正在尝试使用 mysql 和 Php 为上述场景制作一个小原型。
我知道我们将使用嵌套查询并继续过滤产品 ID 的选择(在这种情况下为主键)。最终结果可以根据生成的产品 ID 集显示。
我仍然想知道开始这方面的最佳方法是什么。任何帮助将不胜感激。
谢谢!
您的回答给人的印象是您的项目中可能需要一个查询构建器类。
它将帮助您准确实现您的意图并保持您的代码干净。
如果您使用的是 Yii 等框架,它已经提供了此功能,对于独立的查询构建器类,请尝试以下操作:
免责声明,我没有尝试或测试过任何这些。
这是列表中第二个选项的代码示例:
<?php
require_once './QueryBuilder.php';
$qb = QueryBuilder::create()
->select(array('column1', 'alias' => 'column2'))
->from('mytable as mt')
->join('another_table at', 'on', 'at.id = mt.fk_at_id')
->where('mt.status = 1')
->group('mt.group_field')
->order('mt.date_field desc')
->limit(15);
// when printed, gives the following query:
// SELECT column1,column2 as alias
// FROM mytable as mt
// JOIN another_table as at on at.id = mt.fk_at_id
// WHERE mt.status = 1
// GROUP BY mt.group_field
// ORDER BY mt.date_field as desc
// LIMIT 15
基本上,您需要一种将复选框选择转换为 where 语句的方法。此处描述了此概念的一个非常基本的示例:https ://stackoverflow.com/a/14761616/1688441
引用(最简单的例子):
<?php
$location= $_GET['location'];
$language= $_GET['language'];
$name= $_GET['name'];
if($location!=""){
$where[] = " `location` = '".mysql_real_escape_string($location)."'";
}
if($language!=""){
$where[] = " `language` = '".mysql_real_escape_string($language)."'";
}
if($name!=""){
$where[] = " `name` = '".mysql_real_escape_string($name)."'";
}
$where_clause = implode(' OR ', $where);
//same code for the other 2 options
$sql_json = "SELECT * FROM myTable WHERE $where_clause ORDER BY id DESC";
?>
你需要做两件事: