Работа с бд

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
dzentota
Сообщения: 2
Зарегистрирован: 2011.01.15, 03:46

Работа с бд

Сообщение dzentota »

1. Во всех документациях пишут
Что можно собрать запрос, используя Построитель запросов

Код: Выделить всё

$command = Yii::app()->createCommand();
$command->update('tbl_user', array(
    'name'=>'Tester',
), 'id=:id', array(':id'=>1));
 
Однако я получаю ошибку:
Missing argument 1 for CDbConnection::createCommand();
Можно передать в createCommand первым параметром false, тогда это ошибка исчезнет, зато появится:
DbCommand не содержит метода "update".

2. Вариант номер два

Код: Выделить всё

$sql = 'UPDATE {{users}} SET active=1 WHERE activekey=:key';
$command = Yii::app()->db->createCommand($sql);
$command->bindParam(':key', $key);
$command->execute();
 
Не меняет {{users}} на имя таблицы `users`. Ну, и ладно , однако кроме этого, даже если $sql = 'UPDATE users SET active=1 WHERE activekey=:key'; То выполняется запрос 'UPDATE users SET active=1 WHERE activekey=:key';
То есть не происходит заполнение плейсхолдеров. Уже честно устал биться с реализацией запросов в Yii, видимо лучше сделать Компонентом DbSimple - Имхо лучшая библиотека для работы с Mysql, лаконично и ВСЕ РАБОТАЕТ
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Работа с бд

Сообщение samdark »

1. Подождите до понедельника или обновитесь из SVN.
2. Вообще-то и должен выполняться запрос 'UPDATE users SET active=1 WHERE activekey=:key'. Передача параметров идёт не подстановкой в строку, а через prepared statement, что быстрее и безопаснее.
dzentota
Сообщения: 2
Зарегистрирован: 2011.01.15, 03:46

Re: Работа с бд

Сообщение dzentota »

Спасибо за быстрый ответ. Не ожидал.
ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: Работа с бд

Сообщение ikarushka »

Забирал версию 1.1.6. в конце января. Те же проблемы с построителем запросов
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Работа с бд

Сообщение samdark »

ikarushka, можете привести код, который вызывает проблемы?
ikarushka
Сообщения: 39
Зарегистрирован: 2010.11.23, 15:49

Re: Работа с бд

Сообщение ikarushka »

Да, просто попробовал, как написано в рецепте. Не получилось и сделал все через AR.
Вот такой был код:

Код: Выделить всё

$command = Yii::app()->db->createCommand();
$command->update('tx_oder', array(
                    'status'=>'take',),
'id=:id', array(':id'=>$_GET['oderid'])); 
 
Сейчас снова проверил его. Ошибка лезит:
Missing argument 1 for CDbConnection::createCommand()...
Может я как-то криво обновился?
Filsh
Сообщения: 77
Зарегистрирован: 2010.10.17, 11:00
Откуда: Днепропетровск
Контактная информация:

Re: Работа с бд

Сообщение Filsh »

у меня тоже с построением запросов проблемы) постоянно что-то не получается, что очень не удобно(хотя может причина во мне))))
у меня такой вот кусок кода

Код: Выделить всё

$this->_sql .= ' FROM album_comments
                    WHERE :_name_id = :_id
                    ORDER BY thread_id, thread_pos';

        $this->_limitSql();
        $command = Yii::app()->db->createCommand($this->_sql);
        $command->bindParam(':_name_id', $this->_name_id, PDO::PARAM_STR);
        $command->bindValue(':_id', intval($this->_id), PDO::PARAM_INT); 
плейсхолдеры не хотят заменятся, причем только в :_name_id, в :_id получилось, но только после использования bindValue
Может я что-то не правильно делаю?
vitas
Сообщения: 1
Зарегистрирован: 2011.05.06, 19:33

Re: Работа с бд

Сообщение vitas »

Может кому то поможет, убил на это часа 4.
построитель запросов прекрасно работает, если в
$this->getCommand()->update($tableName, $columns, $conditions, $params);

например:

Код: Выделить всё

$this->update(array('activation_key'=>'1'),
                              'email=:email AND activation_key=:activationkey',
                              array(':email'=>$email, ':activationkey'=>$activationkey)); 
в $conditions не использовать знак "_", т.е. такое не будет работать:

Код: Выделить всё

$this->update(array('activation_key'=>'1'),
                              'email=:email AND activation_key=:activation_key',
                              array(':email'=>$email, ':activation_key'=>$activationkey)); 
Ответить