这有点紧急!
我正在尝试进行简单的过滤搜索,您可以从一系列的3个下拉菜单中进行选择,然后在此基础上显示结果,我将如何调整每个的SQL查询?你只能选择从3个中搜索而不是全部3个等...
例如,可能有输入的url如:url.com?location=gb&color=3&hair=4
仍然形成正确的sql查询,如下所示:url.com?location=gb&hair=1
并且不会遇到WHERE和AND等问题以及语句中的空变量< / p>
这不需要是一个庞大的功能来检查使用if来查看如何为所有可能性设置数据?
谢谢, 斯蒂芬
答案 0 :(得分:1)
我前几天回答了一个问题,我认为这与你的问题很相似:
PHP: prepared statement, IF statement help needed
这个想法是你在代码中使用条件逻辑来根据你的应用程序输入收集需要的术语。然后以一种产生正确SQL表达式的方式将它们连接在一起。
它确实需要一些应用程序函数来动态构建SQL表达式,并且有一些技术可以使它尽可能简洁。如果您确实有很多可能的搜索术语,那么最终可能会有一个冗长的功能。但猜猜怎么了?如果您有复杂的输入,那么您需要复杂的代码来处理它们就不足为奇了。
重新评论:
url.com?location=gb&color=3&hair=4
好的,您最多有三个输入,您必须从这些输入中动态构建SQL查询。让我们从最后开始,向后工作。最终你想要一个像这样的SQL表达式:
WHERE (location = 'gb') AND (color = 3) AND (hair = 4)
如果您有三个术语的数组,可以使用implode()
函数在PHP中将它们连接在一起。但是你可能只有不到三个。您可以通过将多个术语放入数组并在每个术语之间使用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')";
}
完成所有操作后,您的数组将包含0到3个元素。如果它有一个或多个,你想要生成一个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()
。
答案 1 :(得分:1)
以下是我的观点:
// discard empty values and unwanted keys
$get = array_intersect_key(array_filter($_GET, 'strlen'), array_flip(array('location', 'color', 'hair')));
foreach ($get as $key => $value)
{
$get[$key] = $key . ' = ' . mysql_real_escape_string($value);
}
$sql .= ((count($get) == 0) ? null : ' WHERE ') . implode(' AND ', $get);
我没有测试过,但它应该运行良好。