如何在php的PDO查询语句中转义


How to escape during PDO query statement in php?

(编辑:伙计们,在跳到任何结论之前,我问你如何从php.net网站的示例#2中转义查询变量。我尝试了很多方法,但他们都给我错误。如果你可以,请阅读这个例子,并发布你的版本,确切的例子#2。也请阅读为什么他们有那个例子。)

我正在寻找一个可靠的'row:count'方法与PHP PDO跨多个数据库类型使用,并从php.net遇到下面的代码http://php.net/manual/en/pdostatement.rowcount.php(参见示例2)它说要使用SELECT语句执行行计数以查看条目是否存在于数据库中,错误证明方法是使用PDO::query()而不是PDOStatement::fetchColumn()。

我的问题是我知道如何绑定和执行PDO,但我不知道如何分配用户提交的变量($username)到这个$sql语句并成功转义?

是否可以使用PDO将参数绑定到此$sql方法?

            try{
            $conn = new PDO($dsn, $db_username, $db_password);
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $this->db = $conn;
        } catch(PDOException $e){
            echo 'Error:'.$e;
        }
    public function usernameExists($username){
        //Check db for a match.
        $sql = "SELECT * FROM users WHERE username = '".$username."'";
        $results = $this->db->query($sql);
        if($results->fetchColumn() > 0){
            //Matching username found in the db
            return true;
        }else{
            //No matching username in db
            return false;
        }
}

您要找的是bindValue。有了它,您可以在编写查询时使用占位符,然后传递用户的输入。

例如:

public function usernameExists($username){
//$result = $this->db->query('SELECT * FROM users WHERE username = ');
    //Check db for a match.
    $sql = "SELECT * FROM users WHERE username = :username";
    $s = $conn->prepare($sql);
    $s->bindValue(':username',$username);
    $s->execute();
    $results = $s->fetchAll();
    if(count($results) > 0){
        //Matching username found in the db
        return true;
    }else{
        //No matching username in db
        return false;
    }

有关更多信息,请参阅PHP手册。

您将希望使用这样的参数化查询:

<?php
$value = "whatever";
$stmt = $dbh->prepare("SELECT * FROM TABLE_NAME where column_name = ?");
if ($stmt->execute(array($value))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}
?>

如果您真的想 quote +转义字符串,那么这也是可能的。使用复杂变量插值比原始字符串补丁看起来更清晰:

 $sql = "SELECT * FROM users WHERE username = {$this->db->quote($username)}";
                                      // ->quote itself adds ↑ 'quotes' around

当然,不要那样做。使用占位符,并将其传递给每个->execute([$var]);