gpt4 book ai didi

php - SELECT查询, ""为空时WHERE全选

转载 作者:行者123 更新时间:2023-12-01 00:39:24 25 4
gpt4 key购买 nike

目标

您好,我正在尝试通过基于 $_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;
}

问题目前它在所有过滤器都处于事件状态时有效,但如果其中一个不是整个查询失败,我知道那是因为它试图选择匹配 '' 的内容。

所以我的问题是如何在未设置过滤器时搜索所有内容?

最佳答案

您应该根据过滤器的长度构建查询部分:

$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 将条件绑定(bind)到一个字符串中。 implode 的工作方式是,如果只有一个条件,则不使用粘合字符串。

还值得一提的是,您正在将自己暴露于 SQL 注入(inject)。上面的代码显示了使用 mysqli_escape_string 来转义输入,但是您应该查看参数化查询以采取充分的预防措施:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php -- 如果您使用参数化查询,上面的示例只会略有不同,但安全得多。

文档

关于php - SELECT查询, ""为空时WHERE全选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37426840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com