【问题标题】:Inserting new password by overriding old password通过覆盖旧密码插入新密码
【发布时间】:2012-11-29 07:33:14
【问题描述】:

在 yii 中我正在创建项目。验证用户输入的电子邮件后,我正在显示 password.php 文件,该文件具有用于输入新密码的文本字段。 密码.php=

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'email-form',
    'enableClientValidation'=>true,
   ));
        echo CHtml::textField('Enter new password');
        echo CHtml::textField('Repeat password');
        echo CHtml::submitButton('Submit');
        $this->endWidget();

当用户输入新密码并点击提交按钮时,我想将此新密码插入到用户表的密码字段中,以覆盖旧密码。

在控制器中我创建了方法-

public function actionCreate(){

if(isset($_POST['email']))
    {

 $record=User2::model()->find(array(
'select'=>'userId, securityQuestionId, primaryEmail',
'condition'=>'primaryEmail=:email',
'params'=>array(':email'=>$_POST['email']))
);

if($record===null) {
                  echo "Email invalid";
                   }

else {
    echo "email exists";


      $this->render('Password');
      if(isset($_POST['Password']))
        {

        $command = Yii::app()->db->createCommand();
        $command->insert('User', array(
                    'password'=>$_POST['password'] ,
                    //'params'=>array(':password'=>$_POST['password'])

        }          



 }

    }
    else{
        $this->render('emailForm'); //show the view with the password field
    }

但它没有插入新密码。那么我该如何实现...请帮助我

【问题讨论】:

    标签: yii passwords


    【解决方案1】:

    首先,您处理表单的方式肯定不是 Yii 式的,这意味着它不是真正要走的路。

    处理这个问题的方法是创建一个从CFormModel 扩展的对象,并将所有逻辑代码放在其中而不是控制器中。

    现在,如果您想继续使用您的代码,那么最好放置以下代码

    $this->render('Password');
    

    下面 if isset 密码的东西。

    对于您的问题,您的密码未更新的原因是您创建的查询未执行。如果我们看一下here,我们可以看到应该添加以下代码:

    $command->execute();
    

    哪个会执行你的 sql。

    【讨论】:

    • 此更改无济于事。因为if(isset($_POST['Password'])) 中的代码永远不会执行,而$command-&gt;insert(... 也不正确
    【解决方案2】:

    这样的……

    $user = User::find('email = :email', ':email' => $_POST['email']);
    
    if( empty($user) )
      return;
    
    $user->password = $_POST['password'];
    $user->save();
    

    【讨论】:

      【解决方案3】:

      你不能得到这样的密码$_POST['Password'],因为你还没有设置这个帖子变量。

      你必须使用:

      echo CHtml::textField('password');
      echo CHtml::textField('repeatPassword');
      echo CHtml::hiddenField('email', $email);
      

      'password' 和 'repeatPassword' 是 POST 变量的名称

      在你的控制器中你有太多错误,试试这个(检查错别字):

      if(isset($_POST['email']))
      {
       $record=User2::model()->find(array(
      'select'=>'userId, securityQuestionId, primaryEmail',
      'condition'=>'primaryEmail=:email',
      'params'=>array(':email'=>$_POST['email']))
      );
      
      if($record===null) {
                        echo "Email invalid";
                         }
      
      else {
          if(isset($_POST['password']) && isset($_POST['repeatPassword']) && ($_POST['password'] === $_POST['repeatPassword']))
          {
              $record->password = $_POST['password'];
              if ($record->save()) {
                   $this->render('saved');
              }
          }          
      
          $this->render('Password' array('email'=>$_POST['email']));
      }
      
       }
      
          }
          else{
              $this->render('emailForm'); //show the view with the password field
          }
      

      在您的代码中if(isset($_POST['Password'])) 永远不会执行,因为在发送密码后您还没有设置email 变量。所以你只需$this-&gt;render('emailForm');。因此我们将其设置为CHtml::hiddenField('email', $email);

      更新。我强烈建议您阅读this guide。这将为您节省大量时间。

      【讨论】:

      • 感谢先生帮助我。我已按照您所说的进行了更改。但它没有将新密码插入表中。
      • 先生,我需要做些什么更改才能将用户输入的新密码插入用户表 passowrd 字段。即通过这个新密码字段覆盖现有的旧密码
      • 调试你的代码,我猜不出哪里出了问题。你需要执行$record-&gt;password = $_POST['password']; if ($record-&gt;save()) { $this-&gt;render('saved'); },所以在var_dump($_POST['password'])之前添加,看看它在发送新密码后是否有效。如果不尝试调试其他变量并找出原因。
      • 先生,它的工作。如果我想将此更改密码功能作为电子邮件地址的链接发送,我应该做什么。
      • 您需要编写其他操作。简而言之:添加安全代码表(user_id,code)。当用户点击“忘记密码”时 - 生成代码,将其保存到数据库并发送到用户链接“/index.php?r=User/changePass&code=yourCode”。在您的 changePass 操作中,使用代码获取 user_id,如果确定 - 显示带有新密码的表单......那么您就知道了
      猜你喜欢
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      相关资源
      最近更新 更多