这是我的用户表结构:
+----------------+------------------+------+-----+---------+----------------+
| 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
。我该怎么调试呢?
答案 0 :(得分:5)
Yii调试工具栏是一个非常好的调试工具 yii-debug-toolbar download page
答案 1 :(得分:4)
对于调试,请激活config / main.php中的CWebLogRoute。取消注释:
array(
'class'=>'CWebLogRoute',
),
如果$model->save()
返回false,那么将数据保存到数据库可能会失败(为此:看看CWebLogOutput和/或MySQL错误)或验证可能失败,因为通常yii调用$ model->保存前验证。
要进行测试,请在$model->validate();
之前调用$model->save()
并检查返回值。重要的是,在将它们保存到数据库之前,所有属性都是“安全的”。如果每个属性都有效/安全,那么$model->validate();
会返回true
。
答案 2 :(得分:2)
您应该尝试使用$model->save(false);
。如果需要验证,则会跳过该操作并成功保存数据
答案 3 :(得分:2)
$_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)
覆盖模型验证。
答案 4 :(得分:2)
$model->save();
返回false。
save()的第一个参数是boolean,表示是否对属性运行验证。
仔细阅读yii权威指南的这两部分:
您可以通过调用getErrors()来获取验证错误:
$model->getErrors();
答案 5 :(得分:1)
要知道什么是工作,只需看看$ model-> getErrors();
答案 6 :(得分:0)
我想在视图中使用<?php echo $model->errorSummary();?>
。
答案 7 :(得分:0)
首先,您的模型应该称为User not Users。以下可能会像我之前尝试过的那样工作。任何不属于表格的字段必须在模型中标记为“安全”用户保存将失败:
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'),
);
}
}
答案 8 :(得分:0)
为了调试这种Yii活动记录问题(通常是验证问题)我使用:
$model->getErrors()
但是当事情变得棘手时,Yii :: log()非常有用:
Yii::log($expressionOrVariable,'error');
如果您不想激活CWebLogRoute,它会在应用程序日志中写入一行(在/ protected / runtime文件夹中)。添加几个日志行,您可以跟踪正在发生的事情以及在哪里。
Yii-debug-toolbar也是一个很棒的扩展,如果你使用javascript和firebug也很重。
答案 9 :(得分:0)
在调试之前,如果您使用MySQL检查,则db配置已设置为emulatePrepare = true。添加调试工具栏以跟踪使用此扩展名http://www.yiiframework.com/extension/yii-debug-toolbar
的所有查询