【发布时间】: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应该可以解决您的问题。