bindParam(),bindValue()和execute(array())之间的区别和优点是什么?

时间:2015-04-02 22:05:03

标签: php database pdo

<?php

    $db = new PDO($dsn,$username,$password);
    $uname='avi';
    $age=19;
    $stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(:uname,:age)');
    $stmt->execute(array(':uname'=>$uname,':age'=>$age));

    $stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(?,?)');
    $stmt->execute(array($uname,$age));

    $stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(:uname,:age)');
    $stmt->bindValue(':uname',$uname); //can be $uname or just 'avi'
    $stmt->binParam(':age',$uname); //cannot be 'avi' or value only
    $stmt->execute();

?>

我们应该何时使用bindParam()?所有以前的方法似乎都更容易,并且需要更少的代码行。

使用bindParam()优于其他方法(bindValue()execute())的好处是什么?

2 个答案:

答案 0 :(得分:4)

bindParam()通过引用绑定参数,因此它将在$stmt->execute()进行评估,这与bindValue()不同,后者在函数调用时进行求值。

以此为例:

bindParam:

<?php

    try {

        $dbh = new PDO("mysql:host=localhost;dbname=test", "root", "");
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $stmt = $dbh->prepare("SELECT * FROM test WHERE number = ?");
        $stmt->bindParam(1, $xy, PDO::PARAM_INT);
        $xy = 123;  //See here variable is defined after it has been bind
        $stmt->execute();

        print_r($stmt->fetchAll());

    } catch(PDOException $e) {
        echo $e->getMessage();
    }

?>

效果很好!

bindValue:

<?php

    try {

        $dbh = new PDO("mysql:host=localhost;dbname=test", "root", "");
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $stmt = $dbh->prepare("SELECT * FROM test WHERE number = ?");
        $stmt->bindValue(1, $xy, PDO::PARAM_INT);
        $xy = 123;  //See here variable is defined after it has been bind
        $stmt->execute();

        print_r($stmt->fetchAll());

    } catch(PDOException $e) {
        echo $e->getMessage();
    }

?>

输出:

  

注意:未定义的变量:xy

还有一些其他差异:

  • bindParam()也有参数长度,如果你调用IN&amp; OUT过程将输出存储回变量(也需要在PDO::PARAM_INPUT_OUTPUT附加一个OR),它可以(必须)使用语句到类型参数)
  • 使用bindParam()&amp; bindValue()您可以指定值的类型,您可以在execute()中执行此操作,一切都只是一个字符串(PDO :: PARAM_STR)

答案 1 :(得分:1)

bindParam优于bindValue的好处是,您可以在决定放入变量之前绑定变量。为什么你真的需要这样做,我不知道,但你可能会这样做。

绑定值

$x = function_call_to_determine_value();
$stmt->bindValue(':x',$x);
$stmt->execute();

Bind Param

$stmt->bindParam(':x',$x);
$x = function_call_to_determine_value();
$stmt->execute();