Добавление данных с помощью 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:

Вы можете получить ошибки проверки, вызвав 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

Другие вопросы по тегам