2012-03-23 17 views
2

在我的Yii應用,我有一個表示siteconfig表的模型,並有四列:ActiveRecord的搜索返回「語法錯誤或訪問衝突」錯誤

  • 整數config_id
  • key
  • 字符串value,
  • 字符串update_time

我使用Gii創建了一個模型(以確保我不會犯任何錯誤)。我不會在這裏發佈整個代碼,因爲這是我修改的100%,由Gii生成的標準模型代碼。由於我的問題是有關搜索,我只發佈的生成代碼(search()法)重要組成部分:

public function search() 
{ 
    // Warning: Please modify the following code to remove attributes that 
    // should not be searched. 

    $criteria=new CDbCriteria; 

    $criteria->compare('config_id',$this->config_id); 
    $criteria->compare('key',$this->key,true); 
    $criteria->compare('value',$this->value,true); 
    $criteria->compare('update_time',$this->update_time,true); 

    return new CActiveDataProvider($this, array(
     'criteria'=>$criteria, 
    )); 
} 

我試圖使用生成的模型在正常的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語句爲:SELECT value FROM siteconfigt WHERE key =:key LIMIT 1

我哪裏出錯了?

回答

3

您使用key作爲列名,這是一個reserved word in MySQL。 Yii在查詢中使用table alias,但在用作列名稱的預留字時不需要特別注意。所以,你必須自己照顧。

例如:

$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); 

這應該解決您的問題。

0

現在的作品.. ^^

我只是用這個代碼...

$etona = SiteConfigurationRecord::model()->findByAttributes(array('key'=>'sitename')); 

也許我需要學習的ActiveRecord更莫名其妙......

但仍然我不t知道爲什麼上面的代碼不起作用

1

正如@Dmitry所解釋的,SQL不允許您使用列名key。 Yii在您的答案中的代碼中調用,因爲Yii自動執行參數綁定,使用參數以外的保留字以外的名稱。而且它也使用完全限定的列名稱(前綴爲<tablename>.的所有列名稱引用,而不考慮通過findByAttributes方法的列名稱(保留字)無效。

相關問題