我目前正在尝试编写从 $_GET 变量(它们本身来自选择下拉菜单)生成的复杂 MySQL WHERE 子句。首先,一些代码让你知道我在说什么:
if(!isset($_GET['order'])){
$order= 'start asc';
} elseif ($_GET['order'] == "dateasc") {
$order= 'start asc';
} elseif ($_GET['order'] == "titleasc") {
$order= 'title asc';
} elseif ($_GET['order'] == "titledesc") {
$order= 'title desc';
};
if(!isset($_GET['cat'])){
$cat= '0';
} else {
$cat = $_GET['cat'];
};
if(!isset($_GET['loc'])){
$loc= '0';
} else {
$loc = $_GET['loc'];
};
if (isset($_GET['sd']) || isset($_GET['ed']) || isset($_GET['cat']) || isset($_GET['loc']) || isset($_GET['order']) ) {
$where = 'WHERE ';
if (isset($_GET['sd'])) {
$where .= "start = " . $_GET['sd'];
};
if (isset($_GET['ed'])) {
$where .= "AND end = " . $_GET['ed'];
};
if (isset($_GET['cat'])) {
$where .= "AND category = " . $_GET['cat'];
};
if (isset($_GET['loc'])) {
$where .= "AND location = " . $_GET['loc'];
};
};
$result = mysql_query("SELECT * FROM " . TABLE . $where . " ORDER BY " . $order);
显然这是行不通的,否则我不会在这里。:) 基本上,我有 4 个变量,我想有条件地用于在我的查询中进行排序:开始日期和结束日期、类别和位置。我的问题是所有这 4 个可能并不总是被使用.. 所以鉴于上面的例子,可能有人选择一个类别($cat)但不是开始日期($sd)......这意味着我的WHERE 子句将以“AND”开头,这显然是无效的。那么如何根据可能使用或可能不使用的变量构建查询呢?
我真的觉得我想多了,我害怕编写 9000 行 isset 测试来解释 $_GET 变量使用的每种组合。当然有一种简单的方法可以从多个 $_GET 构建 WHERE 子句,每次都可能使用也可能不使用......?我试过谷歌搜索,但只能找到建议使用框架来构建复杂查询的解决方案,而且对于这样一个简单的问题,这似乎过于......笨拙......