【问题标题】:Search Filtering with PHP/MySQL使用 PHP/MySQL 进行搜索过滤
【发布时间】:2012-10-23 18:41:51
【问题描述】:

我正在尝试在我的献血者应用程序中创建搜索/过滤选项。可以按性别、姓名、血型或选择所有三项来搜索供体。这是我的代码

function search_donar($_POST) {

        $by_name = $_POST['by_name'];
        $by_sex = $_POST['by_sex'];
        $by_group = $_POST['by_group'];
        $by_level = $_POST['by_level'];

        $search_query = "SELECT * FROM donar WHERE";
        if($by_name !="") {
          $search_query .= " name='$by_name'";
        }
        if($by_sex !="") {
          $search_query .= " sex='$by_sex'";
        }
        if($by_group !="") {
          $search_query .= " blood_group='$by_group'";
        }
        if($by_level !="") {
          $search_query .= " e_level='$by_level'";
        }
        $search_query;
        $result = mysql_query($search_query);

        return $result;
    }

这里是html

if(isset($_POST['submit'])) {

    $retrived_result = $donar->search_donar($_POST);

}

   <form action="" method="post">
    <table width="100%" border="0" style="border:none;">
      <tr>
        <td><label>Name:&nbsp;</label><input type="text" name="by_name" /></td>
        <td><label>Sex:&nbsp;</label><input type="text" name="by_sex" /></td>
        <td><label>Blood Group:&nbsp;</label><input type="text" name="by_group" /></td>
        <td><label>Level:&nbsp;</label><input type="text" name="by_level" /></td>
        <td><input class="button" type="submit" name="submit" value="Search" /></td>
      </tr>
    </table>
    </form>

单过滤效果很好。但是要过滤我使用的所有 AND ,但它给了我错误。任何人都可以帮忙吗?

提前致谢

【问题讨论】:

  • 它会给你什么错误...?
  • 请至少在使用mysql_real_escape_string($_POST['by_name']);在数据库中搜索时转义您的数据强烈建议使用mysqli_*或PDO而不是mysql_*
  • 您的问题中的$donar 变量是什么?

标签: php mysql database


【解决方案1】:
function search_donar($_POST) {

    $by_name = $_POST['by_name'];
    $by_sex = $_POST['by_sex'];
    $by_group = $_POST['by_group'];
    $by_level = $_POST['by_level'];

    $search_query = "SELECT * FROM donar WHERE";

    $and = '';
    if(count($_POST) > 1) {
        $and ='AND';
    }
    if($_POST[0]) {
        $and ='';
    }

    if($by_name !="") {
        $search_query .= $and." name='$by_name'";
    }
    if($by_sex !="") {
        $search_query .= $and." sex='$by_sex'";
    }
    if($by_group !="") {
        $search_query .= $and." blood_group='$by_group'";
    }
    if($by_level !="") {
        $search_query .= $and." e_level='$by_level'";
    }

    if(count($_POST) == 0) {
        $search_query .= " 1 ";
    }

    $search_query;
    $result = mysql_query($search_query);

    return $result;
}

【讨论】:

    【解决方案2】:

    我会这样做。

    function search_donar($_POST) {
    
        $by_name = $_POST['by_name'];
        $by_sex = $_POST['by_sex'];
        $by_group = $_POST['by_group'];
        $by_level = $_POST['by_level'];
    
        $search_query = "SELECT * FROM donar WHERE 1 = 1";
        if($by_name !="") {
          $search_query .= " AND name='$by_name'";
        }
        if($by_sex !="") {
          $search_query .= " AND sex='$by_sex'";
        }
        if($by_group !="") {
          $search_query .= " AND blood_group='$by_group'";
        }
        if($by_level !="") {
          $search_query .= " AND e_level='$by_level'";
        }
        $result = mysql_query($search_query);
        return $result;
    }
    

    【讨论】:

      【解决方案3】:

      像所有其他帖子一样,您需要使用 AND 附加所有条件,就像这样。这是迄今为止最干净的答案。请记住,尽管使用 mysqli OOP 方式而不是旧的 mysql,但要真正转义您的字符串。只是一个建议。

      这是一个典型查询的示例。

      正确方法:

      SELECT * FROM donar WHERE name='dxenaretionx' AND sex='M';
      

      你的做法

      SELECT * FROM donar WHERE name='dxenaretionx' sex='M';
      

      代码:

      function search_donar($_POST) {
          $by_name = $_POST['by_name'];
          $by_sex = $_POST['by_sex'];
          $by_group = $_POST['by_group'];
          $by_level = $_POST['by_level'];
      
          //Do real escaping here
      
          $query = "SELECT * FROM donar";
          $conditions = array();
      
          if(! empty($by_name)) {
            $conditions[] = "name='$by_name'";
          }
          if(! empty($by_sex)) {
            $conditions[] = "sex='$by_sex'";
          }
          if(! empty($by_group)) {
            $conditions[] = "blood_group='$by_group'";
          }
          if(! empty($by_level)) {
            $conditions[] = "e_level='$by_level'";
          }
      
          $sql = $query;
          if (count($conditions) > 0) {
            $sql .= " WHERE " . implode(' AND ', $conditions);
          }
      
          $result = mysql_query($sql);
      
          return $result;
      }
      

      【讨论】:

      • 我在 stackoverflow 上看到的最好最清晰的答案之一。非常感谢@Rejinderi。
      • 谢谢@LaurenceNicolaou,你的评论让我很开心:D
      【解决方案4】:

      在不使用验证的情况下,建议不要使用字段是否为空。试试下面的代码,希望它能工作

      function search_donar($_POST) {
      
          $by_name = $_POST['by_name'];
          $by_sex = $_POST['by_sex'];
          $by_group = $_POST['by_group'];
          $by_level = $_POST['by_level'];
      
          $search_query = "SELECT * FROM donar WHERE name LIKE '%$by_name%' AND sex LIKE '%$by_sex%' AND blood_group LIKE '%$by_group%' AND  e_level LIKE '%$by_level%' ";
      
          $result = mysql_query($search_query);
      
          return $result;
      }
      

      【讨论】:

        【解决方案5】:

        在您的代码中,查询 where condition 存在问题。在这里,您的查询将像 select * from donar where by_name = "A" by_group = "N" 没有 And/Or 可以正确设置 where 条件。请尝试下面给出的代码。

        $search_query = "SELECT * FROM donar";
        $query_cond = "";
        
        if($by_name !="") {
              $query_cond .= " name='$by_name'";
        }
        if($by_sex !="") {
        
              if(!empty($query_cond)){
                  $query_cond .= " AND ";
               }
        
              $query_cond .= " sex='$by_sex'";
        }
        
        if($by_group !="") {
        
              if(!empty($query_cond)){
                  $query_cond .= " AND ";
               }
        
              $query_cond .= " blood_group='$by_group'";
        }
        
        if($by_level !="") {
        
              if(!empty($query_cond)){
                  $query_cond .= " OR ";
               }
        
              $query_cond .= " e_level='$by_level'";
         }
        
         if(!empty($query_cond)){
              $query_cond = " Where ".$query_cond;
              $search_query.$query_cond;
         }
        

        在代码中首先我们将$query_cond变量为空并根据代码设置条件。并据此管理AND运营商。最后,如果我们发现$query_cond 不为空,则将其添加到$select_query

        希望对你有帮助。

        谢谢

        【讨论】:

          【解决方案6】:

          试试这样:

          function search_donar($_POST) {
          
                  $by_name = $_POST['by_name'];
                  $by_sex = $_POST['by_sex'];
                  $by_group = $_POST['by_group'];
                  $by_level = $_POST['by_level'];
          
                  $isfirst=0;
                  $search_query = "SELECT * FROM donar WHERE";
                  if($by_name !="") {
          
                    $search_query .= " name='$by_name'";
                    $isfirst=1;
                  }
                  if($by_sex !="") {
                      if($isfirst!=0)
                      $search_query .= " AND ";
                    $search_query .= " sex='$by_sex'";
                    $isfirst=1;
                  }
                  if($by_group !="") {
                      if($isfirst!=0)
                      $search_query .= " AND ";
                    $search_query .= " blood_group='$by_group'";
                    $isfirst=1;
                  }
                  if($by_level !="") {
                      if($isfirst!=0)
                      $search_query .= " AND ";
                    $search_query .= " e_level='$by_level'";
                    $isfirst=1;
                  }
                  $result = mysql_query($search_query);
          
                  return $result;
              }
          

          【讨论】:

            【解决方案7】:

            以下代码sn-p:

            $search_query = "SELECT * FROM donar WHERE";
            if($by_name !="") {
              $search_query .= " name='$by_name'";
            }
            if($by_sex !="") {
              $search_query .= " sex='$by_sex'";
            }
            

            产生类似的查询

            SELECT * FROM donar WHERE name='nowak' sex='m'
            

            ,这是无效的,因为子句之间没有逻辑运算符。您需要添加一个“与”。为了简化代码,可以生成“true and a and b ...”形式的条件:

            $search_query = "SELECT * FROM donar WHERE true";
            if($by_name !="") {
              $search_query .= " AND name='$by_name'";
            }
            if($by_sex !="") {
              $search_query .= " AND sex='$by_sex'";
            }
            ...
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-03-09
              • 2019-11-16
              • 1970-01-01
              • 2021-01-06
              • 1970-01-01
              • 1970-01-01
              • 2018-03-11
              • 2011-03-21
              相关资源
              最近更新 更多