【问题标题】:Adding Data with Yii Framework使用 Yii 框架添加数据
【发布时间】:2011-07-01 18:36:22
【问题描述】:

这是我的用户表结构:

+----------------+------------------+------+-----+---------+----------------+
| 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 。我该如何调试它?

【问题讨论】:

    标签: php yii yii-cmodel


    【解决方案1】:

    Yii 调试工具栏是一个非常好的调试工具 yii-debug-toolbar download page

    【讨论】:

      【解决方案2】:

      为了调试,激活 config/main.php 中的 CWebLogRoute。取消注释:

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

      如果$model->save() 返回 false,那么将数据保存到数据库可能会失败(为此:查看 CWebLogOutput 和/或 MySQL 错误)或者验证可能会失败,因为通常 yii 在保存之前调用 $model->validate .

      为了测试,在$model->save()之前调用$model->validate();并检查返回值。重要的是,所有属性在将它们保存到数据库之前都是“安全的”。如果每个属性都是有效/安全的,那么$model->validate(); 返回true。

      【讨论】:

        【解决方案3】:

        您应该改用$model->save(false);。如果需要验证,这将跳过该验证并成功保存您的数据

        【讨论】:

          【解决方案4】:
          $_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) 覆盖模型验证。

          【讨论】:

            【解决方案5】:

            $model->save(); 在输入验证失败时返回 false。 save() 的第一个参数是布尔值,表示是否对属性进行验证。

            仔细阅读yii权威指南的这两部分:

            您可以通过调用 getErrors() 来获取验证错误:

            $model->getErrors();
            

            【讨论】:

              【解决方案6】:

              要知道什么是工作,简单看看 $model->getErrors();

              【讨论】:

                【解决方案7】:

                我想在视图中使用<?php echo $model->errorSummary();?>。

                【讨论】:

                  【解决方案8】:

                  首先,您的模型应该称为用户而不是用户。以下可能会像我之前尝试过的那样工作。任何不属于表的字段都必须在模型中标记为“安全”用户否则保存将失败:

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

                  假设您需要模型 User 中的一个字段,该字段不属于模型表的一部分。您需要将其标记为安全,否则出于安全原因,如果“uglyName”在 $_POST['U​​ser'] 中,则保存将失败。

                  class User extends CFormModel
                  {
                    private $uglyName;
                  
                    /**
                     * Declares the validation rules.
                     */
                    public function rules()
                    {
                      return array(
                        array('uglyName', 'safe'),
                      );
                    }
                  }
                  

                  【讨论】:

                    【解决方案9】:

                    要调试这种 Yii 活动记录问题(通常是验证问题),我使用:

                    $model->getErrors()
                    

                    但是当事情变得棘手时,Yii::log() 非常有用:

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

                    如果您不想激活 CWebLogRoute,它会在应用程序日志中写入一行(在 /protected/runtime 文件夹内)。添加多个日志行,您可以跟踪正在发生的事情以及发生的位置。

                    Yii-debug-toolbar 也是一个很棒的扩展,但如果你使用 javascript 和 firebug,它也会很重。

                    【讨论】:

                      【解决方案10】:

                      在调试之前,如果您使用 MySQL,请检查您的 db 配置是否设置为 emulatePrepare=true。添加调试工具栏以跟踪所有使用此扩展的查询http://www.yiiframework.com/extension/yii-debug-toolbar

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-05-21
                        • 1970-01-01
                        相关资源
                        最近更新 更多