我正在创建搜索过滤器功能,并将通过URL发送过滤器信息。我面临的问题是,由于它是一个筛选器,因此某些信息有时会存在,而有些则不会。这会产生未定义的变量问题。
过滤器的最大数量将如下所示:search.php? cat = Computers&credits1 = 1&credits2 = 2&rev = 5&stars = 5。我还将基于GET变量集从多个SQL表中提取数据。
如何计算某些时间未设置的变量以运行查询?我认为我可以通过针对每种情况的一堆if else语句来做到这一点,但这似乎是“肮脏的代码”。
最佳答案
您应该只基于传递的过滤器值动态构建SQL语句。这可能意味着有条件,但这实际上是优化数据库查询的最佳方法。
它可能看起来像这样(示例使用mysqli,但是对于使用预备语句的任何种类的数据库库来说,这应该相似):
$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
}
}
关于php - 如何在多个MySQL表上执行大型查询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13995578/