Php 选择查询,其中选择所有当"&引用;是空的
目标 您好,我正试图通过基于$Php 选择查询,其中选择所有当"&引用;是空的,php,mysql,sql,Php,Mysql,Sql,目标 您好,我正试图通过基于$\u GET动态构建查询来缩短代码。当前我有所有可能的If语句和相关的SELECTquery。不过,我想为功能更新创建一个动态系统 当前进度 //Set Filter based on url if ($_GET[GAME] != "") { $gameFilter = $_GET[GAME]; } else { $gameFilter = ''; } if ($_GET[Region] != "") { $regionFilter
\u GET
动态构建查询来缩短代码。当前我有所有可能的If语句和相关的SELECT
query。不过,我想为功能更新创建一个动态系统
当前进度
//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 .' WHERE 1=1'
然后,如果$gameFilter=“”,用和game=$gameFilter“
追加的语法如下所示
if ($gameFilter!="")
{
$sql.=' and game=$gameFitler'
}
$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);
然后检查所有搜索条件。您必须动态构建搜索 您可以使用
$sql='SELECT * FROM '. $database .' WHERE 1=1'
然后,如果$gameFilter=“”,用和game=$gameFilter“
追加的语法如下所示
if ($gameFilter!="")
{
$sql.=' and game=$gameFitler'
}
$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);
依此类推,检查所有搜索条件。您应该根据过滤器的长度构建查询部分:
$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);
你在那里做的是建立一个基于条件长度的条件数组。如果条件的输入是空字符串,则不会将其添加到数组中。最后,如果有任何筛选器,请使用内爆
将条件绑定到字符串中。内爆
的工作方式是,如果只有一个条件,则不使用粘合字符串
还值得一提的是,您将自己暴露在SQL注入中。上面的代码显示了如何使用mysqli_escape_string
来转义输入,但是您应该查看参数化查询以采取充分的预防措施:--如果使用了参数化查询,上面的示例只会略有不同,但安全性明显提高
文档
-strlen
-内爆
- Mysql参数化查询-
$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);
你在那里做的是建立一个基于条件长度的条件数组。如果条件的输入是空字符串,则不会将其添加到数组中。最后,如果有任何筛选器,请使用内爆
将条件绑定到字符串中。内爆
的工作方式是,如果只有一个条件,则不使用粘合字符串
还值得一提的是,您将自己暴露在SQL注入中。上面的代码显示了如何使用mysqli_escape_string
来转义输入,但是您应该查看参数化查询以采取充分的预防措施:--如果使用了参数化查询,上面的示例只会略有不同,但安全性明显提高
文档
-strlen
-内爆
- Mysql参数化查询-
- 让你像这样
if ($gameFilter!="")
{
$sql.=' and game=$gameFitler'
}
$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);
$sql='SELECT*FROM'$数据库。'WHERE 1=1{0}{1}{2}'
如果($gameFilter“”)
$sql=str_replace(“{0}”,“和game=”)“$gameFilter.”,$sql);
其他的
$sql=str_replace(“{0}”,”,$sql);
如果($regionFilter“”)
$sql=str_replace(“{1}”,“和region=”)“$regionFilter.”,$sql);
其他的
$sql=str_replace(“{1}”,“”,$sql);
如果($consoleFilter“”)
$sql=str_replace(“{2}”,“AND console=”)“$consoleFilter.”,$sql);
其他的
$sql=str_replace(“{2}”,“”,$sql);
让你的字符串像这样
if ($gameFilter!="")
{
$sql.=' and game=$gameFitler'
}
$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);
$sql='SELECT*FROM'$数据库。'WHERE 1=1{0}{1}{2}'
如果($gameFilter“”)
$sql=str_replace(“{0}”,“和game=”)“$gameFilter.”,$sql);
其他的
$sql=str_replace(“{0}”,”,$sql);
如果($regionFilter“”)
$sql=str_replace(“{1}”,“和region=”)“$regionFilter.”,$sql);
其他的
$sql=str_replace(“{1}”,“”,$sql);
如果($consoleFilter“”)
$sql=str_replace(“{2}”,“AND console=”)“$consoleFilter.”,$sql);
其他的
$sql=str_replace(“{2}”,“”,$sql);
我想,但是这样我就无法将它附加到当前查询中,请您举个例子,说明一下这一点好吗?还有什么是1=1?我添加了一个简单的附加字符串编辑…@Chris Baker给出的答案似乎更完整…好吧,我想我明白了,所以我有一个开始查询,然后在1=1'i之后,如果每个瓷砖?@MattHammond如果你采用这种方法,“1=1”位是非语句,也就是说,它不会影响查询。但是,它允许您在字符串上获取WHERE语句,因此稍后添加条件时,WHERE已经在字符串上了。如果你看我的例子,我会一直等到最后,并且只在有条件的情况下才附加WHERE。只是不同的方法,但您应该理解其中的差异,并知道为什么这里需要“1=1”,但在我的示例中不需要。这两种方法都能起作用,只是方法上的一个偏好问题。我想,尽管如此,我还是无法将其附加到当前查询中,请您举个例子来说明这一点好吗?还有什么是1=1?我添加了一个简单的附加字符串编辑…@Chris Baker给出的答案似乎更完整…好吧,我想我明白了,所以我有一个开始查询,然后在1=1'i之后,如果每个瓷砖?@MattHammond如果你采用这种方法,“1=1”位是非语句,也就是说,它不会影响查询。但是,它允许您在字符串上获取WHERE语句,因此稍后添加条件时,WHERE已经在字符串上了。如果你看我的例子,我会一直等到最后,并且只在有条件的情况下才附加WHERE。只是不同的方法,但你应该