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

已星。

M

已星,求星

C

已星,求星

P

已星,求星

H

已星,求星

A

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

I

已星 求星

F

已星

M

Mockingbirds don’t do one thing but make music for us to enjoy. They don’t eat up people’s gardens, don’t nest in corncribs, they don’t do one thing but sing their hearts out for us.  https://payforessay.net/ That’s why it’s a sin to kill a mockingbird.

V

手机最快vpn,秒连P站,油管4K高清无压力!点击下载链接:免费体验

诸位打扰一下 如有需要加速器的可以下载试试 适合手机使用 下载体验

Sign in or Sign up Leave Comment