通过querystring php选择表过滤器

时间:2011-05-10 18:08:03

标签: php mysql select filter query-string

好吧所以我现在已经尝试了一段时间才能让它发挥作用,但必须有一个比我想的更好的解决方案。我是php / mysql的新手,所以不确定如何执行以下操作:

我有一个搜索框,其中包含国家/地区,州,城市的下拉列表 现在,如果用户只选择国家/地区并点击搜索,则需要按国家/地区过滤选择并显示其他内容。

if(!empty($_REQUEST['city']))
    $city = $_REQUEST['city'];
else
    $city= "%";

if(!empty($_REQUEST['state']))
    $state= $_REQUEST['state'];
else
    $state= "%";

if(!empty($_REQUEST['country']))
    $country= $_REQUEST['country'];

select * from table where country = $country and state = $state and city = $city

问题是那些列是整数,所以我不能使用“%”来过滤它。我希望我能解释一下,任何帮助都非常受欢迎。提前致谢

4 个答案:

答案 0 :(得分:3)

  1. 如果您不想约束列,只需在查询中省略它
  2. 即可
  3. 永远不要将$ _REQUEST中的字符串直接插入查询字符串 - 经典的SQL注入缺陷。
  4. 您可能希望强制执行某种限制,以免查询返回数据库中的每个结果。
  5. 示例:

    <?php
    $conditions = array();
    
    if(!empty($_REQUEST['city']))
        $conditions[] = "city = " . mysql_real_escape_string($_REQUEST['city']);
    
    if(!empty($_REQUEST['state']))
        $conditions[] = "state = " . mysql_real_escape_string($_REQUEST['state']);
    
    if(!empty($_REQUEST['country']))
        $conditions[] = "country = " . mysql_real_escape_string($_REQUEST['country']);
    
    $sql = 'select * from table ';
    if(!empty($conditions))
        $sql .= ' where '. implode(' AND ', $conditions);
    $sql .= ' LIMIT 1000';
    

答案 1 :(得分:1)

$where = array();
if(!empty($_REQUEST['city'])) $where[] = "city = '".(int)$_REQUEST['city']."'";
if(!empty($_REQUEST['state'])) $where[] = "state = '".(int)$_REQUEST['state']."'";
if(!empty($_REQUEST['country'])) $where[] = "country = '".(int)$_REQUEST['country']."'";

$wherestring = if(count($where) != 0) ? " WHERE ".implode(' AND ', $where) : "" ;

$query = "SELECT * FROM table".$wherestring;

答案 2 :(得分:0)

您可能需要考虑编写多个查询字符串,一个用于国家,一个用于州和国家,一个用于城市,州和国家。或者,您可以根据必须使用的不同参数组装查询字符串。

示例:

if(isset() || isset() || isset() ) //make sure at least one is set
{
  $query_string = "SELECT * FROM table WHERE ";

  if(isset($_REQUEST['country']))
  {
      $country = $_REQUEST['country'];
      $query_string .= " country = $country";
  }

  if(isset($_REQUEST['state']))
  {
      $state = $_REQUEST['state'];
      $query_string .= " state = $state";
  }

  if(isset($_REQUEST['city']))
  {
      $city = $_REQUEST['city'];
      $query_string .= " city = $city";
  }
}
else
{
    //Else, if none are set, just select all the entries if no specifications were made
    $query_string = "SELECT * FROM table";
}

  //Then run your query...

所以在英语中,你要做的第一件事就是检查你的参数,确保在尝试将空变量连接在一起之前有一些工作要做。   然后你创建基本查询字符串(只要我们有参数)并保持开放状态,这样我们就可以添加你需要的任何参数。   接下来检查每个参数,如果已设置,则将该参数连接到查询字符串的末尾。   最后通过将查询发送到SQL服务器来处理查询。

祝你好运!

ħ

答案 3 :(得分:0)

这是我的建议。

我给你一个答案,即使你已经有三个。我认为我的代码眼睛可能更容易。

  1. 使用原始$_REQUEST值,因为用户可能会通过提供假$_REQUEST数据来中毒您的数据库。虽然可能有更好的方法,但请记住命令“mysql_real_escape_string($string)”。
  2. 我已经看到解决这个问题的常用方法如下。 (内心的想法,基本上。弗兰克法默在他的同时做到了。)
  3. -

    $__searchWheres = array(); //Where we'll store each requirement used later
    foreach( array('city','state','country') as $_searchOption) {
       if ( ! empty( $_REQUEST[$_searchOption] ) ) {
           $__searchWheres[] = $_searchOption . '= "' . mysql_real_escape_string( $_REQUEST[$_searchOption] ) . '"';
       }
    }
    $__query = 'select * from table' . (count($__searchWheres) > 0 ? ' WHERE ' . implode(' AND ',$__searchWheres) : '');  //Implode idea also used by Frank Farmer
    //Select from the table, but only add the 'WHERE' key and where data if we have it.
    mysql_query($__query);