【问题标题】:Php and mysql filterphp和mysql过滤器
【发布时间】:2018-05-23 16:05:04
【问题描述】:

我正在尝试在 mysql 和 php 中创建过滤器。在我的数据库中,我有很多字段,例如:姓名、电话号码、电子邮件......即使我做了类似的事情

if(!empty($_POST['name'])){ 
$name=$_POST['name']
}
if(!empty($_POST['phoneNumber'])){ 
   $phoneNumber= $_POST['phoneNumber']
    }
if(!empty($_POST['email'])){ 
    $email=$_POST['email']
    }

如果有人只输入姓名字段,我该怎么做才能不包括查询中的其他字段?

$query=query("SELECT * FROM clients WHERE clientName=$clientName && phoneNumber=$phoneNumber && email=$email)

【问题讨论】:

    标签: php mysql filter


    【解决方案1】:

    你可以试试下面给出的方法

    if(!empty($_POST['name'])){ 
    $name=$_POST['name'];
    $query="SELECT * FROM clients WHERE clientName='$name'";
    }
    if(!empty($_POST['phoneNumber'])){ 
       $phoneNumber= $_POST['phoneNumber'];
       $query.= " AND phoneNumber='$phoneNumber'";
        }
    if(!empty($_POST['email'])){ 
        $email=$_POST['email'];
        $query.= " AND email='$email'";
        }
    

    注意:使用准备好的查询,因为这容易受到 sql 注入攻击。 这只是演示。

    【讨论】:

      【解决方案2】:

      我对这类事情所做的是将所有搜索词发送到单个 JSON 对象中发布。因此,在 javascript 中,我收集所有搜索输入并有一个对象,其中每个键对应于输入的名称,每个值对应于 val。例如在 jQuery 中

      var searchObj = {};
      $(".searchInput").each(function() {
           searchObj[$(this).attr('name')] = $(this).val();
      });
      var searchJSON = JSON.stringify(searchObj);
      //later send searchJSON to php
      
      //in php
      $seachObj = json_decode($_POST["searchJSON"], true);
      $sql = "SELECT * in CLIENTS WHERE ";
      foreach($searchObj as $key => $val) {
          $sql .= "$key = '$val' AND ";
      }
      $sql .= "1";
      

      现在这完全没有保障!!!仅包括在内,以便清楚。最好使用 PDO 或 mysqli,以使用准备好的语句。像这样:

      $seachObj = json_decode($_POST["searchJSON"], true);
      $sql = "SELECT * in CLIENTS WHERE ";
      $vals = [];
      foreach($searchObj as $key => $val) {
          $vals[] = $val;
          $sql .= "$key = ? AND ";
      }
      $sql .= "1";
      //learn more about PDO to get this part
      $stmt = $pdo->prepare($sql);
      $stmt->execute($vars);
      

      【讨论】:

        【解决方案3】:

        我觉得这样就可以了。

        $condition = "";
        
        if(!empty($_POST['name'])){ 
        $name=$_POST['name'];
        $condition .= " AND clientName LIKE ".$name;
        }
        if(!empty($_POST['phoneNumber'])){ 
           $phoneNumber= $_POST['phoneNumber'];
            $condition .= " AND phoneNumber ='".$phoneNumber."'";
        }
        if(!empty($_POST['email'])){ 
            $email=$_POST['email'];
            $condition .= " AND email='".$email."'";
        }
        
        if(!empty($condition)){
           $query="SELECT * FROM clients WHERE ".ltrim($condition," AND");
        }else{
           $query="SELECT * FROM clients";
        }
        

        【讨论】:

        • 感谢您的回答,但是当我尝试您的代码时,会出现此错误:警告:PDO::query(): SQLSTATE[42S22]: Column not found: 1054 Champ 'qsfd' inconnu dans where 子句在第 39 行的 C:\wamp64\www\applocations\gestion-client.php 中。你知道为什么吗?
        猜你喜欢
        • 2012-01-22
        • 1970-01-01
        • 2011-08-02
        • 2011-01-06
        • 2012-11-29
        • 2018-03-11
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        相关资源
        最近更新 更多