目标
嗨,我正在尝试通过基于$ _GET
动态构建查询来缩短我的代码。当前我有所有可能的If语句与相关的SELECT
查询。但是,我想为功能更新创建一个动态系统。
当前进度
//Set Filter based on url
if ($_GET[GAME] != "") { $gameFilter = $_GET[GAME]; } else { $gameFilter = ''; }
if ($_GET[Region] != "") { $regionFilter = $_GET[Region]; } else { $regionFilter = ''; }
if ($_GET[Console] != "") { $consoleFilter = $_GET[Console]; } else { $consoleFilter = ''; }
$result = get_matchfinder($gameFilter, $regionFilter, $consoleFilter);
//功能
function get_matchfinder($gameFilter, $regionFilter, $consoleFilter) {
//Set Varibles
$database = 'matchFinder';
$order = 'DESC';
$limit = '20';
//Query Function
$connection = connection();
$sql = 'SELECT * FROM '. $database .' WHERE game = "'.$gameFilter.'" AND region = "'.$regionFilter.'" AND console = "'.$consoleFilter.'" ORDER BY ID '. $order .' LIMIT '. $limit .'';
$response = mysqli_query($connection, $sql);
//Return
return $response;
}
问题
Currenly它可以在所有过滤器都处于活动状态时起作用,但如果其中一个不是整个查询失败,我知道这是因为它试图选择匹配''
的东西。
所以我的问题是如何在未设置过滤器的情况下搜索所有过滤器?
答案 0 :(得分:2)
您必须动态构建搜索
您可以使用
开始基本查询$sql='SELECT * FROM '. $database .' WHERE 1=1'
然后,如果$ gameFilter!="",请附加到"and game=$gameFilter"
的现有$ sql字符串
附加的语法就像这样
if ($gameFilter!="")
{
$sql.=' and game=$gameFitler'
}
等检查所有搜索条件。
答案 1 :(得分:2)
您应该根据过滤器的长度构建查询部分:
$sql = '
SELECT * FROM '.$database.'
';
$filters = array();
if (strlen($gameFilter) > 0) {
$filters[] = 'game = "'.mysqli_escape_string($connection, $gameFilter).'"';
}
if (strlen($regionFilter) > 0) {
$filters[] = 'region = "'.mysqli_escape_string($connection, $regionFilter).'"';
}
if (strlen($consoleFilter ) > 0) {
$filters[] = 'console= "'.mysqli_escape_string($connection, $consoleFilter).'"';
}
if (count($filters) > 0) {
$sql .= ' WHERE '.implode(' AND ', $filters);
}
if (strlen($oder) > 0) {
$sql .= ' ORDER BY ID '.$order;
}
if ($limit > 0) {
$sql .= ' LIMIT '.$limit;
}
$response = mysqli_query($connection, $sql);
你在做什么是根据条件的长度建立一系列条件。如果条件的输入是空字符串,则不会将其添加到数组中。最后,如果有任何过滤器,请使用implode
将条件绑定到字符串中。 implode
的工作方式,如果只有一个条件,则不使用胶水串。
还要提到的是,您正在暴露自己的SQL注入。上面的代码显示了使用mysqli_escape_string
来转义输入,但您应该查看参数化查询以采取完整的预防措施:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php - 如果您使用了参数化查询,则上述示例只会略有不同,但更安全。
文档
答案 2 :(得分:1)
让你像这样的字符串
$sql = 'SELECT * FROM '. $database .' WHERE 1=1 {0} {1} {2}'
if ( $gameFilter <> '')
$sql = str_replace("{0}", "AND game = '".$gameFilter."'" , $sql);
else
$sql = str_replace("{0}", "" , $sql);
if ( $regionFilter <> '')
$sql = str_replace("{1}", "AND region = '".$regionFilter."'" , $sql);
else
$sql = str_replace("{1}", "" , $sql);
if ( $consoleFilter <> '')
$sql = str_replace("{2}", "AND console = '".$consoleFilter."'" , $sql);
else
$sql = str_replace("{2}", "" , $sql);