Добавление данных с помощью Yii Framework
Это моя структура таблицы пользователя:
+----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------------+------+-----+---------+----------------+
| ID | int(10) unsigned | NO | PRI | NULL | auto_increment |
| screen_name | varchar(20) | NO | UNI | NULL | |
| slug | varchar(20) | NO | | NULL | |
| email | varchar(50) | NO | UNI | NULL | |
| pass | varchar(32) | YES | | NULL | |
| signin_twitter | enum('T','F') | NO | | F | |
| twitter_id | int(11) | YES | UNI | NULL | |
| bg_image | varchar(50) | YES | | NULL | |
+----------------+------------------+------+-----+---------+----------------+
Я пытаюсь добавить данные в свою базу данных. (в моем контроллере)
$model=new Users;
//$this->performAjaxValidation($model);
if(isset($_POST['Users']))
{
//screen_name, email,pass comes from form. Also, we need to set **slug** and **singin_twitter**
$_POST['Users']['slug'] = $this->sanitize($_POST['Users']['screen_name']);
$_POST['Users']['signin_twitter'] = 'F';
$model->attributes=$_POST['Users'];
if($model->save())
$this->redirect('dash/index');
}
Но это не сохранение данных. $model->save() returning FALSE
, Как я могу отладить это?
10 ответов
Панель инструментов отладки Yii - очень хороший инструмент для отладки Страница загрузки панели инструментов yii-debug
Для отладки активируйте CWebLogRoute в config/main.php. Раскоментируйте:
array(
'class'=>'CWebLogRoute',
),
если $model->save()
вернуть false, поэтому сохранение данных в базе данных может завершиться неудачей (для этого: посмотрите CWebLogOutput и / или MySQL Errors) или проверка может завершиться неудачей, потому что в общем случае yii вызывает $model->validate перед сохранением.
Для тестирования звоните $model->validate();
до $model->save()
и проверьте возвращаемое значение. Важно, чтобы все атрибуты были "безопасными" перед сохранением их в базе данных. Если каждый атрибут действителен / безопасен, так $model->validate();
возвращается true
,
$model->save();
возвращает false, когда проверка ввода не удалась. Первый параметр save() является логическим и указывает, следует ли запускать проверку атрибутов или нет.
Внимательно прочитайте эти два раздела окончательного руководства yii:
- http://www.yiiframework.com/doc/guide/1.1/en/database.ar#data-validation
- http://www.yiiframework.com/doc/guide/1.1/en/form.model
Вы можете получить ошибки проверки, вызвав getErrors():
$model->getErrors();
$_POST['Users']['slug'] = $this->sanitize($_POST['Users']['screen_name']);
$_POST['Users']['signin_twitter'] = 'F';
$model->attributes=$_POST['Users'];
Вы не должны использовать $model->attributes=$_POST['Users']
после ручной атрибуции ваше поле может быть переназначено, если оно входит в правила модели.
Также для отладки:
...
$model->attributes=$_POST['Users'];
$model->validate();
var_dump($model->getErrors());
if($model->save())
...
Обратите внимание, что вы можете использовать $model->save(false)
переопределить проверку модели.
Тебе стоит попробовать $model->save(false);
вместо. Если это требует проверки, это пропустит это и сохранит ваши данные успешно
Чтобы узнать, что такое работа, просто посмотрите на $model->getErrors();
Я хотел бы использовать <?php echo $model->errorSummary();?>
в представлении.
Во-первых, ваша модель должна называться Пользователь, а не Пользователь. Следующее, вероятно, будет работать, как я пытался это раньше. Любое поле, которое не является частью таблицы, в модели должно быть помечено как "безопасное", иначе сохранение пользователя не удастся:
public function actionSaveUser()
{
$model = new User;
if(isset($_POST['User']))
{
$model->setAttributes( $_POST['User'] );
if( $model->save() ) {
// render success
}
}
// render form
}
Допустим, вам нужно поле в модели User, которое не является частью таблицы модели. Вы должны пометить его как безопасный, иначе, из соображений безопасности, сохранение не удастся, если "uglyName" находится в $_POST['User'].
class User extends CFormModel
{
private $uglyName;
/**
* Declares the validation rules.
*/
public function rules()
{
return array(
array('uglyName', 'safe'),
);
}
}
Для отладки такого рода проблем с активной записью Yii (обычно проблем с проверкой) я использую:
$model->getErrors()
Но когда все становится сложнее, Yii::log() очень полезен:
Yii::log($expressionOrVariable,'error');
Он записывает строку в журнал приложения (в папке /protected/runtime), если вы не хотите активировать CWebLogRoute. Добавив несколько строк журнала, вы можете отслеживать, что происходит и где.
Yii-debug-toolbar также является отличным расширением, но также очень тяжелым, если вы работаете с javascript и firebug.
Перед отладкой, если вы используете MySQL, проверьте, что ваша конфигурация БД настроена на emulatePrepare=true. Добавьте панель инструментов отладки, чтобы отслеживать все запросы, используйте это расширение http://www.yiiframework.com/extension/yii-debug-toolbar