3

yii では、セキュリティの質問を使用してパスワード リセット機能を作成しています。まず、ユーザーは自分の電子メール ID を入力する必要があります。views->User1としてemailform.php を作成しました

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

コントローラーでメソッドを次のように作成しました

public function actionPassword() {
    if (isset($_POST['email'])) {
       $email = $_POST['email'];
       //process email....
       //....
    }
    $this->render('_emailForm');
}

ここで、この電子メール ID が User テーブルに存在するかどうかを確認したいと思います。もしそうなら、私は彼に秘密の質問を表示したいと思います. どうすればこれを実装できますか?

4

4 に答える 4

5

これは、開始するのに役立ちます。これと同様のメソッドをコントローラーに配置し、パスワード フィールドを含むビューを作成します。

public function actionPassword() {
  if(isset($_POST['email'])) {
    $record=User::model()->find(array(
      'select'=>'email',
      'condition'=>'email=:email',
      'params'=>array(':email'=>$_POST['email']))
    );

    if($record===null) {
      $error = 'Email invalid';
    } else {
      $newpassword = 'newrandomgeneratedpassword';
      $record->password = $this->hash_password_secure($newpassword);
      $record->save(); //you might have some issues with the user model when the password is protected for security
      //Email new password to user
    }
  } else {
    $this->render('forgetPassword'); //show the view with the password field
  }
}
于 2012-11-27T13:13:04.593 に答える
2

CActiveRecords を使用している場合、レコードが存在するかどうかを確認する適切な方法は、find() 関数ではなく、exists()関数を使用することです。

$condition = 'email_d=:emailId';
$params = array(':emailId' => $emailId);
$emailExists = User::model()->exists($condition,$params);
if( $emailExists) )
{
  //email exists
}
else
{
  // email doesn't exist
}
于 2014-10-27T10:12:00.743 に答える
1

データベースのレコードを確認するには、2 つのオプションを使用できます

$exists = ModelName::find()->where([ 'column_name' => $value])->andWhere(['column_name' => $value])->exists();
//returns true or false

$exists = ModelName::findOne(["column_name" => $value,"column_name"=>$value]);

小切手

if ($exists)
{
// exit
}
else
{
// not exist
}
于 2015-01-06T16:07:05.923 に答える
0
$model = YourModel::model()->find('email = :email', array(':email' => $_POST['email']));

これは PDO のように使用されます:

$query = 'SELECT * etc.. WHERE email = :email';

$stmt = DB::prepare($query);
$stmt->bindParam(':email', $_POST['email'], PDO::PARAM_STR);
$stmt->execute();

etc...

安全じゃない!?

その後..

if( empty($model) )
{
  // exit code
}
else
{
  // success block
}
于 2012-11-27T14:34:26.497 に答える