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。只是不同的方法,但你应该