【问题标题】:Is it possible to bind a PDO parameter to the member variable of an object?是否可以将 PDO 参数绑定到对象的成员变量?
【发布时间】:2012-12-14 04:53:20
【问题描述】:

使用PDOStatement::bindParam(),可以将参数绑定到变量——这在多次执行准备好的语句时特别有用,每个语句都有不同的参数值。例如:

$dbh = new PDO('mysql:dbname=foo', 'eggyal', 'password1');
$qry = $dbh->prepare('DELETE FROM bar WHERE qux = ?');
$qry->bindParam(1, $qux, PDO::PARAM_INT);

while (true) {
  $qux = ... ;
  $qry->execute();
  // etc
}

我的问题是:

  1. 是否可以将参数绑定到对象的成员变量?例如:

    $qry->bindParam(1, $obj->qux, PDO::PARAM_INT);
    
  2. 如果是这样,到哪个对象的成员变量是这样一个参数绑定:在bindParam() 调用时引用的那个,还是在语句执行时引用的那个?例如:

    $obj->qux = 123;
    
    $obj = new stdClass();
    $obj->qux = 456;
    
    $qry->execute();  // which value is used for qux ?
    
  3. 这种行为记录在哪里(如果有的话)?

【问题讨论】:

  • 绑定时绑定到对象的实例属性。创建一个新对象并将其分配给以前的对象变量名不会更新引用。
  • 同意。如果您一次将多个对象保存到数据库中,我是否建议在事务中重写它? (如果你的引擎支持的话。)

标签: php oop pdo prepared-statement pdostatement


【解决方案1】:

PHP 存储变量的引用以使用它。调用$qry->bindParam(1, $obj->qux, PDO::PARAM_INT)时,存储的引用就是实例化类成员的引用。

当您更改成员$obj->qux 时,引用仍与您的$obj 中存储的引用相同。但是,如果您将 $obj 重新实例化为一个新类,那么每个引用都会更改,但您的旧对象仍在内存中!所以当你给新的$obj->qux分配一个新值时,它不是使用的同一个变量,所以运行$qry->execute会使用旧值。

我希望我已经足够清楚了。

【讨论】:

    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多