Добавление данных с помощью Yii Framework - PullRequest
3 голосов
/ 01 июля 2011

Это моя структура таблицы пользователя:

+----------------+------------------+------+-----+---------+----------------+
| 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 ]

5 голосов
/ 02 июля 2011

Панель инструментов отладки Yii - очень хороший инструмент для отладки Страница загрузки панели инструментов yii

4 голосов
/ 02 июля 2011

Для отладки активируйте CWebLogRoute в config / main.php. Раскоментируйте:

                    array(
                            'class'=>'CWebLogRoute',
                    ),

если $model->save() вернуть false, то сохранение данных в базе данных может завершиться неудачей (для этого: посмотрите ошибки CWebLogOutput и / или MySQL) или проверка может завершиться неудачей, потому что в общем случае yii вызывает $ model-> validate перед сохранением .

Для тестирования позвоните $model->validate(); до $model->save() и проверьте возвращаемое значение. Важно, чтобы все атрибуты были «безопасными» перед сохранением их в базе данных. Если каждый атрибут действителен / безопасен, то $model->validate(); возвращает true.

2 голосов
/ 20 декабря 2011

$model->save(); возвращает false, если проверка ввода не удалась.Первый параметр save () является логическим и указывает, следует ли выполнять проверку атрибутов или нет.

Внимательно прочитайте эти два раздела окончательного руководства yii:

Вы можете получить ошибки проверки, вызвав getErrors ():

$model->getErrors();
2 голосов
/ 05 октября 2011
$_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) для отмены проверки модели.

2 голосов
/ 29 июля 2011

вы должны попробовать $model->save(false); вместо этого. Если это требует проверки, это пропустит это и сохранит ваши данные успешно

1 голос
/ 02 июля 2011

Чтобы узнать, что такое работа, просто посмотрите на $ model-> getErrors ();

0 голосов
/ 24 марта 2013

Перед отладкой, если вы используете MySQL, проверьте, что ваша конфигурация БД установлена ​​в emulatePrepare = true. Добавьте панель инструментов отладки для отслеживания всех запросов, используйте это расширение http://www.yiiframework.com/extension/yii-debug-toolbar

0 голосов
/ 22 сентября 2012

Для отладки такого рода проблем с активной записью Yii (обычно проблем с проверкой) я использую:

$model->getErrors()

Но когда все становится сложнее, Yii :: log () очень полезен:

Yii::log($expressionOrVariable,'error');

Он записывает строку в журнал приложения (в папке / protected / runtime), если вы не хотите активировать CWebLogRoute.Добавив несколько строк журнала, вы можете отслеживать, что и где происходит.

Yii-debug-toolbar также является отличным расширением, но также очень тяжелым, если вы работаете с javascript и firebug.

0 голосов
/ 08 января 2012

Во-первых, ваша модель должна называться Пользователь, а не Пользователь.Следующее, вероятно, будет работать, как я пытался это раньше.Любое поле, не являющееся частью таблицы, должно быть помечено как "безопасное" в модели, иначе сохранение пользователя не удастся:

public function actionSaveUser()
{
    $model = new User;
    if(isset($_POST['User']))
    {
      $model->setAttributes( $_POST['User'] );
      if( $model->save() ) {
          // render success
      }
    }
    // render form
}

Допустим, вам нужно поле в модели Пользователь, которое не является частьюмодельный стол.Вы должны пометить его как безопасный, иначе по соображениям безопасности сохранение не удастся, если "uglyName" находится в $ _POST ['User'].

class User extends CFormModel
{
  private $uglyName;

  /**
   * Declares the validation rules.
   */
  public function rules()
  {
    return array(
      array('uglyName', 'safe'),
    );
  }
}
0 голосов
/ 17 декабря 2011

Я хотел бы использовать <?php echo $model->errorSummary();?> в представлении.

...