2015-06-14 128 views
0

嘿一个小问题。PDO bindParam正确的方式?

什么是更好或最安全的方式来绑定参数,值和列? i'v看到了这两种方式来做到这一点,但我无法弄清楚它们有什么区别?

有:电子邮件和:email$email

$stmt = $db->prepare("SELECT `email` FROM `users` WHERE `email` = :email"); 
     $stmt->bindValue(':email', $email); 

还是问号?

$stmt = $db->prepare("SELECT `email` FROM `users` WHERE `email` = :?"); 
     $stmt->bindValue(1, $email); 
+1

如果您使用第一种方法(:email ...),您可以在大型查询中检测并分离参数。它们之间没有任何区别。 – M2sh

+1

没有区别。第一个使用名称占位符,第二个使用问号占位符。两者同样安全。 –

+0

完美,谢谢 – user3426191

回答

2

没有区别,但只有优势它更具可读性。

mysqli只有?这是不一样好的阅读时,你有太多的参数

想象这样的事情:

$stmt = $db->prepare("Call store_procedure ?,?,?,?,?,?,?,?,?,?"); 

它可能是这么多的错误倾向和难以调试

2

它们都是同样有效的方式(但是,你的第二个例子在应该不存在的问号之前有一个冒号)。第一个例子更具可读性。在第二个例子中,如果您稍后决定更改SQL语句,则可能必须对所有内容重新编号。

所以,如果你本来有这样的:

$stmt = $db->prepare("INSERT INTO `users` (`fname`, `lname`, `address`, `email`) values (?, ?, ?, ?)"); 
    $stmt->bindValue(1, $fname); 
    $stmt->bindValue(2, $lname); 
    $stmt->bindValue(3, $address); 
    $stmt->bindValue(4, $email); 

,并想插入一个中间名首字母。你可以在末尾插入,但为便于阅读,你很可能把它的姓和名之间将不得不重新编号您的代码如下:

$stmt = $db->prepare("INSERT INTO `users` (`fname`, `initial`, `lname`, `address`, `email`) values (?, ?, ?, ?)"); 
    $stmt->bindValue(1, $fname); 
    $stmt->bindValue(2, $initial); 
    $stmt->bindValue(3, $lname); 
    $stmt->bindValue(4, $address); 
    $stmt->bindValue(5, $email); 

它只是使事情有点不太可读而且修复起来有点麻烦。我用问号方法可以看到的唯一好处是少打字,但从长远来看最好不用。另外,当插入和移动它时,更容易发生错误而不会发现它。例如,你可能会不小心放置了最初以错误的地点如下:

$stmt = $db->prepare("INSERT INTO `users` (`fname`, `initial`, `lname`, `address`, `email`) values (?, ?, ?, ?)"); 
    $stmt->bindValue(1, $fname); 
    $stmt->bindValue(2, $lname); 
    $stmt->bindValue(3, $initial); 
    $stmt->bindValue(4, $address); 
    $stmt->bindValue(5, $email); 

您的代码不会知道这是不是你想要做什么,它会尝试把姓氏在初始列和最后名称列中的inital。使用命名参数方法你不会有这个问题。