使用Yii框架添加数据


Adding Data with 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');                  
        }

但它并没有保存数据。CCD_ 1。我如何调试它?

Yii调试工具栏是一个非常好的调试工具yii调试工具栏下载页面

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

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

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

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

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

$_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() returning FALSE0在输入验证失败时返回false。save((的第一个参数是布尔值,表示是否对属性运行验证。

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

  • http://www.yiiframework.com/doc/guide/1.1/en/database.ar#data-验证
  • http://www.yiiframework.com/doc/guide/1.1/en/form.model#declaring-验证规则

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

$model->getErrors();

要知道什么是有效的,只需查看$model->getErrors((;

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

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

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

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

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');

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

Yii调试工具栏也是一个很好的扩展,但如果你使用javascript和firebug,它也很重。

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