在PDOStatement :: bindParam中绑定重载属性时的PHP注意事项

时间:2012-02-26 10:57:51

标签: php pdo

当我尝试在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。

这个问题有解决办法吗?

2 个答案:

答案 0 :(得分:5)

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

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

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

有关非参考__get的更多解释:https://stackoverflow.com/a/5337433/1233508

答案 1 :(得分:0)

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

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