【问题标题】:PHP notice: Indirect modification of overloaded property Url::$id has no effectPHP通知:间接修改重载属性Url::$id没有效果
【发布时间】:2013-02-08 22:09:12
【问题描述】:

我使用 Yii,我得到了这个错误;我应该理解和做什么?

不重复:source 或任何其他;

错误在:->bindParam(":url_id", $url->id)

$url = Url::model()->findByAttributes(array('link' => $_url));
        if (empty($url)) {
            $url = new Url();
            $url->website_id = $website->id;
            $url->link = $_url;
            $url->title = '';
            $url->description = '';
            $url->doctype = $_doctype;
            $url->visits = 1;
            $url->created = date('Y-m-d h:i:s',time());
            $url->updated = date('Y-m-d h:i:s',time());
            $url->status = 1;
            $url->save(false);
        } else {
            // update visits
            $url->saveCounters(array('visits' => 1));
            // url existed, let's load products
            if (!Yii::app()->user->isGuest) {
                $sql = "select u.id from url as u
                    left join url_follower as u_f
                    on u.id = u_f.url_id and u_f.user_id = :user_id
                    where u.id =:url_id";
                $cmd = Yii::app()->db->createCommand($sql)
                        ->bindParam(":url_id", $url->id)
                        ->bindParam(":user_id", Yii::app()->user->id);
                $url_id = $cmd->queryScalar();

【问题讨论】:

  • 我不使用 yii,但一般来说,将参数绑定到查询通常会通过引用来获取 value 参数。通过引用访问Yii::app()->user->id 会抛出一个错误,指出在bind 方法之外对变量进行更改不会更新bind 方法内的值的副本。如果您要将Yii::app()->user->id 保存到局部变量并将其传入,则应该不会出错。
  • 带有 :url_id 是问题
  • 是的,我刚刚注意到了。那么问题是 $url->id 可能是使用重载 __get 方法从 Url 类中获取的。虽然意思是一样的。 __get 不通过引用返回属性,并且 bind 期望该属性是可引用的。同样的想法是更新 Url 中的属性不会更新 bind 中的值。
  • 有趣的是,这段代码是书签的一部分,在所有书签上,这段代码都有效,在这个上,它会破解;这个我不明白
  • @JonathanKuhn 是正确的,因为 id 是由魔术 __get 方法返回的。不存在$id 变量,而是由数据库表中存在的列自动创建getter。从 bindParam 更改为 bindValue 应该可以解决您的问题。

标签: php yii


【解决方案1】:

经过测试的解决方案:

$user_id = Yii::app()->user->id;
                $url_id = $url->id;
                $cmd = Yii::app()->db->createCommand($sql)
                        ->bindParam(":user_id", $user_id)
                        ->bindParam(":url_id", $url_id);

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多