ActiveRecord搜索返回“语法错误或访问冲突”错误

ActiveRecord搜索返回“语法错误或访问冲突”错误,activerecord,yii,mysql-error-1064,yii-cmodel,Activerecord,Yii,Mysql Error 1064,Yii Cmodel,在我的Yii应用程序中,我有一个表示siteconfig表的模型,它有四列: 整数配置id, 字符串键, 字符串值, 字符串更新时间。 我使用Gii创建了一个模型,以确保我不会犯任何错误。我不会在这里发布全部代码,因为这是我100%未修改的,由Gii生成的标准模型代码。由于我的问题与搜索有关,我只发布生成代码的重要部分搜索方法: 我尝试在正常的Yii ActiveRecord搜索中使用生成的模型,如下所示: $etona = new SiteConfigurationRecord(); $cri

在我的Yii应用程序中,我有一个表示siteconfig表的模型,它有四列:

整数配置id, 字符串键, 字符串值, 字符串更新时间。 我使用Gii创建了一个模型,以确保我不会犯任何错误。我不会在这里发布全部代码,因为这是我100%未修改的,由Gii生成的标准模型代码。由于我的问题与搜索有关,我只发布生成代码的重要部分搜索方法:

我尝试在正常的Yii ActiveRecord搜索中使用生成的模型,如下所示:

$etona = new SiteConfigurationRecord();
$crit = new CDbCriteria();
$crit->select = "value";
$crit->condition = "key=:key";
$crit->params = array(":key"=>"sitename");
$etona = $etona->find($crit);
但是,没有得到预期的搜索结果,出现了一个奇怪的错误:

CDbCommand无法执行SQL语句:SQLSTATE[42000]: 语法错误或访问冲突:1064您的SQL中有错误 句法;检查与MySQL服务器版本对应的手册 在第1行的“key='sitename'LIMIT 1”附近使用正确的语法。 执行的SQL语句是:从siteconfig t中选择值 其中key=:key LIMIT 1

我哪里出错了?

现在它可以工作了^^

我只是用这个代码

$etona = SiteConfigurationRecord::model()->findByAttributes(array('key'=>'sitename'));
也许我需要更深入地学习activerecord

但是我仍然不知道为什么上面的代码不起作用

现在它起作用了^^

我只是用这个代码

$etona = SiteConfigurationRecord::model()->findByAttributes(array('key'=>'sitename'));
也许我需要更深入地学习activerecord

但我仍然不知道为什么上面的代码不起作用

您使用了列名键,这是一个。Yii在查询中使用,但在保留字用作列名的情况下不需要特别注意。所以,你必须自己处理这件事

例如:

$etona = new SiteConfigurationRecord();
$crit = new CDbCriteria();
$crit->select = "value";
$crit->condition = "t.key=:key"; // 't' is default alias
$crit->params = array(":key"=>"sitename");
$etona = $etona->find($crit);
这应该可以解决您的问题。

您使用了列名键,这是一个。Yii在查询中使用,但在保留字用作列名的情况下不需要特别注意。所以,你必须自己处理这件事

例如:

$etona = new SiteConfigurationRecord();
$crit = new CDbCriteria();
$crit->select = "value";
$crit->condition = "t.key=:key"; // 't' is default alias
$crit->params = array(":key"=>"sitename");
$etona = $etona->find($crit);

这应该可以解决您的问题。

正如@Dmitry所解释的,SQL不允许您使用列名键。答案中代码中的Yii调用之所以有效,是因为Yii自动执行参数绑定,使用的名称不是参数的保留字。而且它还使用完全限定的列名,在所有列名引用的前缀中加上.,而不管通过findByAttributes方法传递的是什么无效的列名保留字

正如@Dmitry所解释的,SQL不允许您使用列名键。答案中代码中的Yii调用之所以有效,是因为Yii自动执行参数绑定,使用的名称不是参数的保留字。而且它还使用完全限定的列名,在所有列名引用的前缀中加上.,而不管通过findByAttributes方法传递的是什么无效的列名保留字