我正在创建搜索过滤器功能,并将通过URL发送过滤器信息。我面临的问题是,由于它是一个过滤器,有些信息会在某些时候存在,有些则不会。这会产生未定义的变量问题。
最大过滤器数量如下:search.php?猫=计算机与安培;制作人员名单1 = 1&安培;制作人员名单2 = 2及转= 5&安培;分= 5。我还将根据设置的GET变量从多个SQL表中提取数据。
如何在某些时候设置某些未设置的变量来运行我的查询?我想我可以通过一堆if else语句来解决每个案例,但这看起来像“脏代码”。
答案 0 :(得分:3)
您应该根据传递的过滤器值动态构建SQL语句。这可能意味着条件,但这确实是优化数据库查询的最佳方法。
它可能看起来像这样(示例使用mysqli,但对于使用预准备语句的任何类型的DB库,这应该类似):
$query = 'SELECT * FROM table'; // or specifically specify the fields you need in result set.
if (empty($_GET['cat']) && empty($_GET['credits1']) && empty($_GET['credits2']) && empty($_GET['rev']) && empty($_GET['stars'])) {
// there are no search filters set so maybe you alert some sort of error
} else {
$query .= ' WHERE ';
$parameters = array();
$at_least_one_where_set = false;
if (!empty($_GET['cat'])) {
if($at_least_one_where_set === true) {
$query .= ' AND cat=?';
} else {
$query .= 'cat=?';
}
$at_least_one_where_set = true;
$parameters[]['value'] = $_GET['cat'];
$parameters[]['type'] = 's';
}
// do similar conditionals for each $_GET value you are interested in.
// query the database
$mysqli = new mysqli('host', 'user', 'password', 'database');
$stmt = $mysqli->stmt_init();
$stmt->prepare($query);
foreach ($parameters as $parameter) {
$stmt->bind_param($parameter['type'], $parameter['value']);
}
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with your result row
}
}