查询PHP/MySql和/或高级搜索

查询PHP/MySql和/或高级搜索,php,mysql,search,parameters,Php,Mysql,Search,Parameters,我不熟悉php和mysql,所以我需要一些查询方面的帮助。这是我的sql查询 SELECT * FROM table1 WHERE (Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%') AND Category LIKE '$category' AND Country LIKE '$country' LIMIT $start, $limit 现在我想做的是 此查询应使用带有Name关键字的文本字段搜索带有Name或ZipCode的列名。即关

我不熟悉php和mysql,所以我需要一些查询方面的帮助。这是我的sql查询

SELECT * FROM table1 WHERE (Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%') AND Category LIKE '$category' AND Country LIKE '$country' LIMIT $start, $limit
现在我想做的是

  • 此查询应使用带有Name关键字的文本字段搜索带有Name或ZipCode的列名。即关键字与名称列或ZipCode匹配
  • 如果没有输入关键字,并且从下拉列表中只选择了一个国家,那么查询也应该可以工作
  • 如果没有输入关键字或国家,并且只从下拉列表中选择了一个类别,则查询也应该可以工作

  • 用更简单的话来说,如果选择了things关键字、country或category中的任何一个,则搜索应相应地显示结果。此外,如果输入了所有字段,它也应该工作。我设法做到了一半,但有时它给我错误的结果。请提供帮助。

    我建议使用几个不同的查询(每个搜索参数组合一个),使用php决定使用哪个查询,或者使用php动态构建一个查询

    请注意,使用以%开头的like可能会非常慢

    如果你真的想把它当作一句话(我不推荐这样做),那么:-

    或者动态地建立它

    $ConditionArray = array();
    if ($keyword != '') $ConditionArray[] = "(Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%' OR '$keyword' = '')";
    if ($category != '') $ConditionArray[] = "Category = '$category'";
    if ($country != '') $ConditionArray[] = "Country = '$country'";
    
    if (count($ConditionArray) > 0)
    {
        $query = "
        SELECT *
        FROM table 1
        WHERE ".implode(' AND ', $ConditionArray);
    }
    

    我建议使用几个不同的查询(每个搜索参数组合一个),使用php来决定使用哪个查询,或者使用php动态构建一个查询

    请注意,使用以%开头的like可能会非常慢

    如果你真的想把它当作一句话(我不推荐这样做),那么:-

    或者动态地建立它

    $ConditionArray = array();
    if ($keyword != '') $ConditionArray[] = "(Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%' OR '$keyword' = '')";
    if ($category != '') $ConditionArray[] = "Category = '$category'";
    if ($country != '') $ConditionArray[] = "Country = '$country'";
    
    if (count($ConditionArray) > 0)
    {
        $query = "
        SELECT *
        FROM table 1
        WHERE ".implode(' AND ', $ConditionArray);
    }
    

    您可以检查设置了哪些字段,并在运行时进行相应的查询。你可以做这样的事情:

    $query = "";
    $keyword = $_REQUEST['keyword'];
    $country = $_REQUEST['country'];
    $category = $_REQUEST['category'];
    if(isset($keyword)){//if keyword set goes here
       $query = "SELECT * FROM table1 WHERE Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%' OR country LIKE '%$keyword%'";
       if(isset($category)){
         $query .= "AND category LIKE '$category'";
       }
       if(isset($country)){
         $query . = "AND country LIKE '$country'"
       }
    }else if (isset($category)){ //if keyword not set but category set then goes here
      $query = "SELECT * FROM table1 WHERE category LIKE '$category'";
      if(isset($country)){
        $query . = "AND country LIKE '$country'";
      }
    }else if(isset($country)){//if only country set goes here
      $query = "SELECT * FROM table1 WHERE country LIKE '$country'"
    }
    

    您可以检查设置了哪些字段,并在运行时进行相应的查询。你可以做这样的事情:

    $query = "";
    $keyword = $_REQUEST['keyword'];
    $country = $_REQUEST['country'];
    $category = $_REQUEST['category'];
    if(isset($keyword)){//if keyword set goes here
       $query = "SELECT * FROM table1 WHERE Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%' OR country LIKE '%$keyword%'";
       if(isset($category)){
         $query .= "AND category LIKE '$category'";
       }
       if(isset($country)){
         $query . = "AND country LIKE '$country'"
       }
    }else if (isset($category)){ //if keyword not set but category set then goes here
      $query = "SELECT * FROM table1 WHERE category LIKE '$category'";
      if(isset($country)){
        $query . = "AND country LIKE '$country'";
      }
    }else if(isset($country)){//if only country set goes here
      $query = "SELECT * FROM table1 WHERE country LIKE '$country'"
    }
    

    你真的应该添加你的代码;但作为一个粗略的指导-您需要检查在
    $\u请求中设置了哪些参数,然后适当地构建您的查询-如果没有设置关键字,则无需搜索名称或ZipCode。此外,请确保阅读有关您应该真正添加代码的信息;但作为一个粗略的指导-您需要检查在
    $\u请求中设置了哪些参数,然后适当地构建您的查询-如果没有设置关键字,则无需搜索名称或ZipCode。另外,请确保阅读您的观点是正确的,但对于这个特定任务,我并不担心这一点。我想我应该试着做几个查询,但这是不可能的,只有一个查询使用或/和?嘿,谢谢你的建议。我能够以稍微不同的方式实现结果,但是的,我决定动态地进行查询,而不仅仅是一个查询,因为这很容易混淆。再次感谢:)你说得对,但对于这个特殊的任务,我并不担心。我想我应该试着做几个查询,但这是不可能的,只有一个查询使用或/和?嘿,谢谢你的建议。我能够以稍微不同的方式实现结果,但是的,我决定动态地进行查询,而不仅仅是一个查询,因为这很容易混淆。再次感谢:)这是最好的答案。非常感谢@Smita这真的很容易理解,也很有帮助。:)正如已经指出的,这很容易受到
    array('keyword'=>'anything;DROP TABLE table1;--')
    类sql注入攻击。正如Patrick Dougall正确地提到的,这个回复很好地理解了这个想法,但请记住,这是一个想法,永远不要将此代码放在生产环境中。至少mysqli真正的转义非常简单,但更好的是,使用:params构造查询,并使用PDO。为了简单起见,您可以绑定所有变量,是否执行
    $variable=isset($\u POST[“variable”])$_POST[“变量”]:“”最后执行。这是最好的答案。非常感谢@Smita这真的很容易理解,也很有帮助。:)正如已经指出的,这很容易受到
    array('keyword'=>'anything;DROP TABLE table1;--')
    类sql注入攻击。正如Patrick Dougall正确地提到的,这个回复很好地理解了这个想法,但请记住,这是一个想法,永远不要将此代码放在生产环境中。至少mysqli真正的转义非常简单,但更好的是,使用:params构造查询,并使用PDO。为了简单起见,您可以绑定所有变量,是否执行
    $variable=isset($\u POST[“variable”])$_POST[“变量”]:“”并最终执行。