2012-03-23 2 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-сервера , для правильного синтаксиса, используемого рядом с 'key =' sitename 'LIMIT 1' в строке 1. Выполненный SQL-оператор: SELECT value FROM siteconfigt WHERE key =: key LIMIT 1

Где я ошибся?

ответ

3

Вы использовали key для названия столбца, которое является reserved word in MySQL. Yii использует table alias в запросах, но не требует особого внимания в случае слова reserverd, используемого в качестве имен столбцов. Итак, вы должны сами позаботиться об этом.

Например:

$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.