ActiveRecord搜索返回“语法错误或访问冲突”错误
在我的Yii应用程序中,我有一个表示siteconfig表的模型,它有四列: 整数配置id, 字符串键, 字符串值, 字符串更新时间。 我使用Gii创建了一个模型,以确保我不会犯任何错误。我不会在这里发布全部代码,因为这是我100%未修改的,由Gii生成的标准模型代码。由于我的问题与搜索有关,我只发布生成代码的重要部分搜索方法: 我尝试在正常的Yii 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
$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方法传递的是什么无效的列名保留字