(编辑:伙计们,在跳到任何结论之前,我问你如何从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]);
。