这有点紧急!
我正在尝试进行简单的过滤器搜索,从中可以从3个下拉列表中进行选择,然后基于此下拉列表显示结果,我将如何针对每个条件调整sql查询,如果要仅选择从3个中的一个进行搜索,而不是从所有3个中搜索…例如,可能存在带有输入的url,例如:url.com?location=gb&color=3&hair=4并且仍对诸如此类的内容形成正确的sql查询:url.com?location=gb&hair=1并且不会遇到WHERE和AND等问题和语句中的空变量
url.com?location=gb&color=3&hair=4
url.com?location=gb&hair=1
不需要使用大量功能来检查是否查看所有可能性的数据设置方式吗?
谢谢,Stefan
这个想法是您在代码中使用条件逻辑来根据需要收集与您的应用程序输入相对应的术语。然后,以产生正确的SQL表达式的方式将它们连接在一起。
它确实需要一些应用程序功能来动态构建SQL表达式,并且有一些技巧可以使其尽可能简洁。如果确实有很多可能的搜索词,则可能会得到冗长的功能。但猜猜怎么了?如果您有复杂的输入,则需要复杂的代码来处理它们就不足为奇了。
发表您的评论:
好的,您最多有三个输入,并且您必须根据这些输入动态构建一个SQL查询。让我们从头开始,然后倒退。最终,您需要这样的SQL表达式:
WHERE (location = 'gb') AND (color = 3) AND (hair = 4)
如果您有一个包含三个术语的数组,则可以使用implode()函数在PHP中将它们连接在一起。但是您可能也少于三个。您可以通过将数组中包含的多个术语放入AND每个术语之间来处理它们,从而处理任意数量的术语:
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
$where_expr = ''; if ($where_array) { $where_expr = "WHERE " . implode(" AND ", $where_array); }
然后将追加$where_expr到您的基准SQL查询中。
$where_expr
$sql .= $where_expr
有关的内容$params是查询参数,这是将动态值包含在SQL表达式中的替代方法,而不是mysql_real_escape_string()。它不是强制性的(事实上,PHP的旧mysql扩展不支持查询参数),但是我建议切换到PDO,以便可以使用此功能。请参阅此处的示例:PDO::prepare()。
$params
mysql_real_escape_string()
PDO::prepare()