Поиск ActiveRecord возвращает ошибку «Синтаксическая ошибка или нарушение прав доступа» - PullRequest
2 голосов
/ 23 марта 2012

В моем приложении Yii у меня есть модель, которая представляет siteconfig таблицу и имеет четыре столбца:

  • целое число 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 siteconfig t ГДЕ ключ =: ключ LIMIT 1

Где я ошибся?

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

Вы использовали key для имени столбца, которое является зарезервированным словом в MySQL .Yii использует псевдоним таблицы в запросах, но не проявляет особой осторожности в случае слова 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);

Это должно решить вашу проблему.

1 голос
/ 24 марта 2012

Как объяснил @Dmitry, SQL не позволяет использовать имя столбца key. Вызов Yii в коде в вашем ответе работает, потому что Yii выполняет привязку параметров автоматически, используя для параметров имена, отличные от зарезервированных слов. Он также использует полные имена столбцов (префикс всех ссылок на имена столбцов с <tablename>., независимо от того, какое недопустимое имя столбца (зарезервированные слова) вы передаете методу findByAttributes.

0 голосов
/ 23 марта 2012

теперь это работает .. ^^

я просто использую этот код ...

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

возможно, мне нужно как-то изучить activerecord как-то ...

но все же я не знаю, почему приведенный выше код не работает

...