【问题标题】:What is the differences and advantages between bindParam(), bindValue() and execute(array())bindParam()、bindValue()和execute(array())有什么区别和优势
【发布时间】:2015-06-08 00:25:41
【问题描述】:
<?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()?以前的所有方法似乎都更简单,需要的代码行数更少。

与其他方法(bindValue()execute())相比,使用bindParam() 有什么好处?

【问题讨论】:

  • 既然可以用钉子,为什么还要有螺丝?这只是完成同一件事的不同方式。
  • 是的,但是 SO 中的很多站点和一些示例都使用了 bindParam,我什么时候应该使用 bindParam? php 文档中的一些示例显示它与返回值的存储过程一起使用
  • 不同情况下的不同用途。在完全没有功能的代码中,bindParam() 有点像:foo &amp;= $var。 foo 参数将是对 $var 的引用,并在您调用 execute() 时简单地提取变量中的任何值。 -&gt;exec(array(...)) 版本使用当时的变量值。
  • 如果我使用存储过程,我可以使用 bindValue 将返回值存储在所需的变量中

标签: php database pdo


【解决方案1】:

bindParam() 通过引用绑定参数,因此它将在$stmt-&gt;execute() 处进行评估,这与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->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();
    }

?>

效果很好!

绑定值:

<?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&OUT 过程将输出存储回变量中,则可以(必须)使用该参数长度(这还需要将带有 OR 语句的 PDO::PARAM_INPUT_OUTPUT 附加到类型参数)
  • bindParam() & bindValue() 可以指定值的类型,这在execute() 中是做不到的,一切都只是一个字符串(PDO::PARAM_STR)

【讨论】:

  • 嗨,你能解释一下它的评价吗?我了解占位符在 sql 语句中被替换为实际值。
  • @AAB 添加了一个例子希望它可以帮助你更多地理解它
  • 您的第二个示例忘记将 bindParam 更改为 bindValue
  • @Rizier123 如何使用占位符进行绑定?我以为我的查​​询是 INSERT INTO table(age) VALUES(?) 然后问号被我提供的值替换,所以如果它是一个字符串,那么我的查询将是 INSERT INTO table(age) VALUES('12 ')
  • @AAB 与占位符的绑定如何工作?您准备一个查询,然后您可以绑定占位符的值,并且根据您使用的函数,您还可以指定类型,值被替换并执行查询。 (这也是你不能绑定列或表名之类的东西的原因,因为你的 dbms 必须能够准备/构建查询,如果它不知道列和表名,它就不能准备它;但是在这(准备中)您可以随时使用查询)
【解决方案2】:

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

绑定值

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

绑定参数

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

【讨论】:

  • 所以使用 $stmt = $db->prepare('INSERT INTO table(uname,age) VALUES(:uname,:age)'); $stmt->execute(array(':uname'=>$uname,':age'=>$age));而不是 bindValue 好吗?
  • @AAB 在执行中通过数组绑定参数将它们绑定为字符串...使用 bindParam 和 bindValue 您可以根据需要将数据类型指定为其他类型。所以不完全一样。
  • so execute(array("age"=>$age)) is different from bindParam(":age",$age,PARAM_INT) 还是您的意思是说我可以将年龄指定为如果我愿意的话,可以在 bindParam 中输入字符串吗?
  • @AAB 是的,execute(array("age"=&gt;$age)) 会将年龄绑定为字符串。 bindParam(":age",$age) 也将其绑定为字符串。但你可以做bindParam(":age",$age,PARAM_INT)。您根本无法将 execute(array) 绑定为 int。
  • 如何使用占位符进行绑定?我以为我的查​​询是 INSERT INTO table(age) VALUES(?) 然后问号被我提供的值替换,所以如果它是一个字符串,那么我的查询将是 INSERT INTO table(age) VALUES('12 ')
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 2019-05-09
  • 1970-01-01
相关资源
最近更新 更多