Php bindParam和bindValue之间有什么区别?

Php bindParam和bindValue之间有什么区别?,php,pdo,bindparam,bindvalue,Php,Pdo,Bindparam,Bindvalue,和之间的区别是什么?以下是我可以思考的一些问题: 使用bindParam,只能传递变量;不是价值观 使用bindValue,您可以同时传递两个值(显然是值和变量) bindParam仅适用于变量,因为它允许通过“引用”(并且值在PHP中不是有效的“引用”)将参数作为输入/输出提供:它对以下驱动程序很有用(引用手册): 支持调用存储的 将数据作为输出返回的过程 参数,以及一些 同时发送的输入/输出参数 输入数据并更新以接收数据 对于某些DB引擎,存储过程可以具有参数,这些参数可以用于输入(从P

和之间的区别是什么?

以下是我可以思考的一些问题:

  • 使用
    bindParam
    ,只能传递变量;不是价值观
  • 使用
    bindValue
    ,您可以同时传递两个值(显然是值和变量)
  • bindParam
    仅适用于变量,因为它允许通过“引用”(并且值在PHP中不是有效的“引用”)将参数作为输入/输出提供:它对以下驱动程序很有用(引用手册):
支持调用存储的 将数据作为输出返回的过程 参数,以及一些 同时发送的输入/输出参数 输入数据并更新以接收数据


对于某些DB引擎,存储过程可以具有参数,这些参数可以用于输入(从PHP向过程提供值)和输出(从存储过程向PHP返回值);要绑定这些参数,必须使用bindParam,而不是bindValue。

答案在以下文档中:

与PDOStatement::bindValue()不同,该变量被绑定为引用,仅在调用PDOStatement::execute()时进行计算

调用PDOStatement::bindParam()将PHP变量绑定到参数标记:绑定的变量将其值作为输入传递,并接收其关联参数标记的输出值(如果有)

例如:

$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'

发件人:

[使用
bindParam
]与
PDOStatement::bindValue()
不同,变量被绑定为引用,仅在调用
PDOStatement::execute()
时进行计算

例如:

$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'


对于最常见的用途,应该使用
bindValue

bindParam
有两种棘手或意外的行为:

  • bindParam(':foo',4,PDO::PARAM_INT)
    不起作用,因为它需要传递一个变量(作为引用)
  • bindParam(':foo',$value,PDO::PARAM_INT)
    运行
    execute()
    后将
    $value
    更改为字符串。当然,这会导致很难捕捉到的细微缺陷
来源:

来自

使用
bindParam
一次绑定插入多行:

<?php

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();

通过行为(就PHP而言)将这一点转化为记忆的最简单方法:

  • bindParam:
    reference
  • bindValue:
    变量

    • 如果有一种方法可以做到这一点,你就不必再挣扎了:

      $stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
      $stmt->execute([":val" => $bind]); 
      

      @PascalMartin我想知道的是,你能用bindParam绑定值吗。干杯。我仍然不知道这到底意味着什么,变量是什么,值是什么。我使用bindParam将值绑定到占位符,使用bindValue我也可以这样做在我的例子中,至少…非常棒,谢谢!问题——为什么你想用一个来代替另一个?例如,如果您使用不同的数据多次执行查询,那么仅在execute()时间对bind参数求值是有用的还是必要的?@Coldblackice。使用
      bindValue
      时,每次都需要重新绑定数据。使用
      bindParam
      只需更新变量即可。使用
      bindValue
      的主要原因是静态数据,例如文字字符串或数字。例如,您希望将bindValue与函数返回值一起使用:$stmt->bindValue(':status',strtolower($status),PDO::PARAM_STR);我想升级投票,但因为它是666,所以我会留下它。BindValue取一个值。
      <?php
      
      $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
      $stmt->bindParam(1, $name);
      $stmt->bindParam(2, $value);
      
      // insert one row
      $name = 'one';
      $value = 1;
      $stmt->execute();
      
      // insert another row with different values
      $name = 'two';
      $value = 2;
      $stmt->execute();
      
      $stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
      $stmt->execute([":val" => $bind]);