B
Published on
· Last modified on
· Public

Yii报错:Indirect modification of overloaded property

基于Yii 1 开发的站点,在迁移到新服务器之后,出现了"Indirect modification of overloaded propery has no effect"的错误。源码部分如下,错误定位到下列代码的第三行:

$sql = "SELECT SUM(amount) AS income FROM accountlog WHERE uid=:uid AND bop=1";
$command = Yii::app()->db->createCommand($sql);
$command->bindParam(':uid',Yii::app()->user->id);
$income = $command->queryScalar();

是个很普通的sum查询语句,通过YII的数据库组件直接执行一个标准的SQL查询,同样的代码在其他环境下运行一直是正常的,基本可以断定是环境的问题。报错信息字面上的意思是“间接修改重载的属性无效”,我这行代码确实是赋值的动作,但赋值的对象是个SQL占位符,并不存在所谓的“重载后的属性”,倒是有个获取属性值的动作:Yii::app()->user->id,相当于通过__get方法获取User对象的id属性。好吧,查Yii文档,看看bindParam函数对于它这第二个参数的定义和描述:

public static bindParam(mixed $name, mixed &$value, integer $dataType=NULL, integer $length=NULL, mixed $driverOptions=NULL)

$value mixed Name of the PHP variable to bind to the SQL statement parameter

第二个参数$value的数据类型的定义是mixed混合类型,描述:Name of the PHP variable to bind to the SQL statement parameter。也就是说这第二个参数得是个PHP变量,难道"Yii::app()->user->id"这样的写法在这里出现了语法歧义?于是乎,改代码如下:

$sql = "SELECT SUM(amount) AS income FROM accountlog WHERE uid=:uid AND bop=1";
$command = Yii::app()->db->createCommand($sql);
$uid = Yii::app()->user->id;
$command->bindParam(':uid',$uid);
$payout = $command->queryScalar();

把uid的值通过一个变量传递到bindParam参数中去,提交代码,刷新页面,OK没问题了。
这时候想起YII中另外一个类似的函数bindValue,API:

public static bindValue(mixed $name, mixed $value, integer $dataType=NULL)

$value mixed The value to bind to the parameter

第二个参数$value的数据类型的定义也是mixed混合类型,不过描述是这样的:The value to bind to the parameter。看来刚开始的使用场景下,应该调用的是这个函数,重新修改代码如下:

$sql = "SELECT SUM(amount) AS income FROM accountlog WHERE uid=:uid AND bop=1";
$command = Yii::app()->db->createCommand($sql);
$command->bindValue(':uid',Yii::app()->user->id);
$income = $command->queryScalar();

提交,刷新,OK也没问题。
Yii的这两个函数其实就是直接用了PDO的同名函数,php官方关于这两个函数的说明可以查看以下链接:

http://php.net/manual/en/pdostatement.bindparam.ph...

http://php.net/manual/en/pdostatement.bindvalue.ph...

那么,为什么同样的代码在不同的环境下又是正常的呢,这是网上搜到的一个帖子:http://zhangxugg-163-com.iteye.com/blog/1855088,可进一步作了解。

S
Published on

已星。

M
Published on

已星,求星

C
Published on

已星,求星

P
Published on

已星,求星

H
Published on

已星,求星

A
Published on

已星,求星 :https://www.textarea.com/ARjason/curl-he-zhengzebi...

I
Published on

已星 求星

F
Published on

已星

Sign in or Sign up Leave Comment