【问题标题】:PHP notice when binding overloaded property in PDOStatement::bindParam在 PDOStatement::bindParam 中绑定重载属性时的 PHP 通知
【发布时间】:2012-02-26 10:57:51
【问题描述】:

当我尝试在 PDOStatement::bindParam 方法中绑定重载属性时,

$stmt->bindParam(':'.$field.'', $this->$field, $pdoparam);
...

public function __get($param)
    {
        if(isset($this->$param))
            return $this->$param;
    }

我收到通知

Notice: Indirect modification of overloaded property Msgs::$posttime has no effect in ...

经过一些研究,我在 php.net 上发现了一个关于类似 problem 的错误报告。建议的解决方案是在 __get 定义之前添加 &。

&__get(...

但是当我尝试这样做时,我会收到另一个通知

Notice: Only variable references should be returned by reference in ...

PHP 版本为 5.3.8。

有没有办法解决这个问题?

【问题讨论】:

  • 我们需要更多的代码,我们不知道 $posttime 做了什么以及函数 get 与什么有什么关系..
  • 对不起,我错误地发表了这条评论。
  • 您从哪个代码收到其他消息?
  • foreach ($this->modelfields as $field => $type) { $pdoparam = (stripos($type, 'int') === 0) ? PDO::PARAM_INT : PDO::PARAM_STR; $stmt->bindValue(':'.$field.'', ​​$this->$field, $pdoparam); $this->modelfields 属性包含一个表字段(键)及其类型(值)的数组,$this->$field - 应插入该字段的对应值。只要有定义的值,一切都可以正常工作,但在某些情况下没有要插入的值(例如,如果该字段必须用它的默认值填充)。在那种情况下,我会收到前面提到的通知。

标签: php pdo


【解决方案1】:

PDOStatement::bindParam 需要引用并可能修改传递给它的参数(将其转换为最合适的类型,或者如果它是 OUT/INOUT 参数,则将结果写入它)。

PDOStatement::bindValue 不接受引用,也不修改参数。

__get 返回 $this->$param 的值,但实际上并没有使其成为对 $this->$param 的引用,并且对返回值的引用会产生此通知。它不是特定于 PDO,即使是简单的$x =& $this->$param 也会触发相同的通知。 使用bindValue 而不是bindParam 来避免这种情况。

关于非引用__get的更多解释:https://stackoverflow.com/a/5337433/1233508

【讨论】:

    【解决方案2】:

    如果您确实将代码更改为&__get(...,我认为您还应该更改以下行:

    $stmt->bindParam(':'.$field.'', &$this->$field, $pdoparam);
    

    【讨论】:

    • 这不起作用。这样我会多收到一个通知。 “已弃用:调用时传递引用已在...中弃用”
    • 您是否尝试使用临时变量?像 "$temp = &$this->$field; $stmt->bindParam(':'.$field.'', ​​$temp, $pdoparam);"
    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 2010-11-29
    • 2011-04-27
    • 2011-09-14
    • 1970-01-01
    • 2010-09-23
    • 2014-05-08
    • 2013-08-16
    相关资源
    最近更新 更多