我前几天回答过一个问题,我觉得和你的很相似:
PHP:准备好的语句,IF 语句需要帮助 https://stackoverflow.com/questions/2732734/php-prepared-statement-if-statement-help-needed/2732757#2732757
这个想法是,您在代码中使用条件逻辑来根据需要收集与应用程序输入相对应的术语。然后以产生正确 SQL 表达式的方式将它们连接在一起。
它确实需要一些应用程序函数来动态构建 SQL 表达式,并且有一些技术可以使其尽可能简洁。如果您确实有许多可能的搜索词,则最终可能会得到一个冗长的函数。但猜猜怎么了?如果您有复杂的输入,那么需要复杂的代码来处理它们也就不足为奇了。
回复您的评论:
url.com?location=gb&color=3&hair=4
好的,您最多有三个输入,并且必须根据这些输入动态构建 SQL 查询。让我们从最后开始并倒推。最终你想要一个像这样的 SQL 表达式:
WHERE (location = 'gb') AND (color = 3) AND (hair = 4)
如果您有一个包含三个术语的数组,您可以使用 PHP 将它们连接在一起implode() http://php.net/implode功能。但您的数量也可能少于三个。您可以通过将任意数量的项放入数组中并将它们内爆来处理任意数量的项AND
每个术语之间:
$where_array = array(
"(location = 'gb')",
"(color = 3)",
"(hair = 4)"
);
$where_expr = "WHERE " . implode(" AND ", $where_array);
那么如何使用这些术语创建数组呢?通过编写代码,为应用程序当前请求中存在的每个输入有条件地附加到数组:
$where_array = array();
if (array_key_exists("location", $_GET)) {
$location = mysql_real_escape_string($_GET["location"]);
$where_array[] = "(location = '$location')";
}
if (array_key_exists("color", $_GET)) {
$color = mysql_real_escape_string($_GET["color"]);
$where_array[] = "(color = '$color')";
}
if (array_key_exists("hair" $_GET)) {
$hair = mysql_real_escape_string($_GET["hair"]);
$where_array[] = "(hair = '$hair')";
}
完成所有操作后,您的数组将包含零到三个元素。如果有一个或多个,你想生成一个WHERE
子句如前所示,否则跳过它。
$where_expr = '';
if ($where_array) {
$where_expr = "WHERE " . implode(" AND ", $where_array);
}
然后附加$where_expr
到您的基线 SQL 查询。
$sql .= $where_expr
关于的东西$params
用于查询参数,这是将动态值包含到 SQL 表达式中的另一种方法,而不是mysql_real_escape_string()
。这不是强制性的(事实上 PHP 的旧 mysql 扩展不支持查询参数),但我建议切换到 PDO,以便您可以使用此功能。请参阅此处的示例:PDO::prepare() http://php.net/manual/en/pdo.prepare.php.