Php $model-validation()在yii中是否始终返回false?

Php $model-validation()在yii中是否始终返回false?,php,validation,yii,Php,Validation,Yii,我是YII框架的新手。我正在编写一个简单的方法来更改密码,我想验证控件,如如果为空,则显示错误消息,或者如果密码和重新键入的密码不匹配,则显示错误。我已使用以下代码执行此操作: public function actionChange() { $model=new Users; $model->scenario='change'; if (isset($_POST['Users'])) { $model->setAttributes($_POS

我是YII框架的新手。我正在编写一个简单的方法来更改密码,我想验证控件,如如果为空,则显示错误消息,或者如果密码和重新键入的密码不匹配,则显示错误。我已使用以下代码执行此操作:

public function actionChange()
{
    $model=new Users;
    $model->scenario='change';
    if (isset($_POST['Users'])) {
        $model->setAttributes($_POST['Users']);                     

        if($model->validate())
            {
                print "true";   
            }
        else{

                print "false";  
            }   

        if($model->validate())
            {       
                $pass = md5($_POST['Users']['newPassword']);            
                $userModel = Users::model()->findByPk(Yii::app()->user->id);
                $userModel->password = $pass; 
                $data = $userModel->update();
            }

            if(isset($data))
            {
                Yii::app()->user->setFlash('success',"Password changed successfully!");
                $this->redirect(array('Users/change'), true);
            }
        }


$this->render('change_password', array('model'=>$model,true));
}
但是,
**$model->validate()**
无论我是否填写字段,都会向我返回false

更新:

以下是规则函数:

public function rules()
{
    return array(
        array('is_active', 'numerical', 'integerOnly'=>true),
        array('first_name, joining_date,last_name, employee_code, username, password, role', 'required'),       
        array('employee_code', 'numerical', 'integerOnly'=>true),
        array('username','email'),      
        array('username','valid_username','on'=>array('create')),

        //array('username', 'contraints', 'readOnly'=>true, 'on'=>'update'),

        array('currentPassword, newPassword, newPasswordRepeat', 'required','on'=>array('change')),
        //array('newPassword', 'length', 'min' => 6, 'max'=>20, 'message'=>Yii::t("translation", "{attribute} is too short.")),
        //array('newPassword','ext.SPasswordValidator.SPasswordValidator', 'preset' => 'strong', 'max' => 41),
        array('newPassword', 'compare', 'compareAttribute'=>'newPasswordRepeat','on'=>array('change')),
        array('currentPassword', 'equalPasswords','on'=>array('change')),
        array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements(),'on'=>array('forgotPassword')),
        array('joining_date', 'safe'),
        array('user_id, first_name, last_name, employee_code, username, password, role, joining_date, pending_regular_leave, pending_medical_leave, allocated_regular_leave, allocated_medical_leave, is_active', 'safe', 'on'=>'search'),
    );
}


public function equalPasswords($attribute, $params)
{
    $user = Users::findByPk(Yii::app()->user->id);
    if ($user->password != md5($this->currentPassword))
        $this->addError($attribute, 'Old password is incorrect.');
}

请帮助我。

由于某些原因,您的验证失败。尝试在else块中显示验证错误(验证失败时)


另一件事是,如果没有帮助,您可以尝试对规则中的一些验证规则进行注释,并查看哪些规则失败。

由于某些原因,您的验证失败。尝试在else块中显示验证错误(验证失败时)


另一件事是,如果没有帮助,您可以尝试对规则中的一些验证规则进行注释,并查看哪些规则失败。

尝试使用正确的方法设置场景。您有两个选项:

$model=new Users('change');

另外一个问题是,您没有从DB加载模型,除非您允许他们输入其用户id或表单上的主键。您很可能需要添加以下内容:

$model = Users::model()->findByPk(Yii::app()->user->id);
//$model=new Users; //Should be removed
否则,它甚至不知道应该在数据库中更新哪个记录,加上所有其他字段将完全为空

此外,如果您使用的是CActiveForm之类的表单小部件,也可以将其添加到视图中,它将显示来自失败验证的消息:

echo $form->errorSummary($model);

尝试使用正确的方法设置场景。您有两个选项:

$model=new Users('change');

另外一个问题是,您没有从DB加载模型,除非您允许他们输入其用户id或表单上的主键。您很可能需要添加以下内容:

$model = Users::model()->findByPk(Yii::app()->user->id);
//$model=new Users; //Should be removed
否则,它甚至不知道应该在数据库中更新哪个记录,加上所有其他字段将完全为空

此外,如果您使用的是CActiveForm之类的表单小部件,也可以将其添加到视图中,它将显示来自失败验证的消息:

echo $form->errorSummary($model);

从模型中显示您的验证函数(正如Jon在下面指出的-它不是验证,而是规则函数)。它应该包含可能失败的验证规则,而不是validate函数——显示定义验证规则的
rules()
函数。您还可以
print\r($model->getErrors())
查看哪些内容无法验证以及原因。可能您的规则比必需的多,比如整数类型。。。表演规则plz@Jon... 是的,当然。@Jon请检查我的规则从模型中显示验证函数(正如Jon在下面指出的-它不是验证,而是规则函数)。它应该包含可能失败的验证规则,而不是validate函数——显示定义验证规则的
rules()
函数。您还可以
print\r($model->getErrors())
查看哪些内容无法验证以及原因。可能您的规则比必需的多,比如整数类型。。。表演规则plz@Jon... “是的,当然。”乔恩·普莱塞检查我的规则