PDO bindParam正确吗?

时间:2015-06-14 19:03:51

标签: php sql pdo

嘿,快一点问题。

绑定参数,值和列的更好或最安全的方法是什么? 我已经看到了这两种方法,但我无法弄清楚它们的区别是什么?

with:email和: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 );

2 个答案:

答案 0 :(得分:2)

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

mysqli只有?,如果参数太多,就不会很好看

想象一下这样的事情:

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

它可能更容易出错并且难以调试

答案 1 :(得分: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 );

您的代码不会意识到这不是您想要做的事情,它会尝试将姓氏放在初始列中,并将最后一个名称放在姓氏列中。使用命名参数方法,您不会遇到此问题。