SELECT Query,当“”为空时,WHERE选择所有

时间:2016-05-25 02:32:14

标签: php mysql sql

目标

嗨,我正在尝试通过基于$ _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它可以在所有过滤器都处于活动状态时起作用,但如果其中一个不是整个查询失败,我知道这是因为它试图选择匹配''的东西。

所以我的问题是如何在未设置过滤器的情况下搜索所有过滤器?

3 个答案:

答案 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);