0

検証と成功時に特定の php/mysqli タスクを実行するコードを以下に示します。以下のコードで私が抱えている問題は、ユーザーが SELECT クエリによって決定される間違ったユーザー名または電子メールを入力した場合、一致するユーザー名と電子メールがない場合、エラー メッセージが表示されることですYour Username or Email was not Correct。しかし、代わりにこのエラー メッセージが表示されますAn error has occured, your Email was not sent containing your new Password

私の質問は、なぜ間違ったエラー メッセージが表示されるのか、正しいエラー メッセージを表示するにはどうすればよいのかということです。

            if(isset($_POST['resetbtn'])){
                //get form data
                $user = $_POST['user'];
                $email = $_POST['email'];

 $errors = array();


if(!$errors) {

            $query = "SELECT TeacherUsername, TeacherEmail FROM Teacher WHERE TeacherUsername = ? AND TeacherEmail = ?";
            // prepare query
            $stmt=$mysqli->prepare($query);
            // You only need to call bind_param once
            $stmt->bind_param("ss",$user, $email);
            // execute query
            $stmt->execute(); 
            // get result and assign variables (prefix with db)
            $stmt->bind_result($dbTeacherUsername, $dbTeacherEmail);
            //get number of rows
            $stmt->store_result();
            $numrows = $stmt->num_rows();                                  

            if ($numrows == 1){

                   $pass = rand();
                   $teacherpassword = md5($pass);
                   $teacherpassword = substr($pass, 0, 15);
                   $teacherpassword = md5(md5("g3f".$pass."rt4")); 

                //update password in db   
                $updatesql = "UPDATE Teacher SET TeacherPassword = ? WHERE TeacherUsername = ?";                                            
                $update = $mysqli->prepare($updatesql);
                $update->bind_param("ss", $teacherpassword, $user);
                $update->execute();

            $query = "SELECT TeacherUsername, TeacherPassword FROM Teacher WHERE TeacherUsername = ? AND TeacherPassword = ?";
            // prepare query
            $stmt=$mysqli->prepare($query);
            // You only need to call bind_param once
            $stmt->bind_param("ss",$user,$teacherpassword);
            // execute query
            $stmt->execute(); 
            // get result and assign variables (prefix with db)
            $stmt->bind_result($dbTeacherUsername, $dbTeacherPassword);
            //get number of rows
            $stmt->store_result();
            $selectnumrows = $stmt->num_rows();

                            }else{
                        if(!$numrows){
                        $errormsg = "Your Username or Email was not Correct"; 
                        $user = "";
                        $email = "";
                    }
                }
        }


        if(empty($errors)) {
            if ($selectnumrows == 1){


                   $errormsg = "<span style='color: green'>Your Password has been Reset. An Email has been sent with your New Password</span>";


                    else{
                     $errormsg = "An error has occured, your Email was not sent containing your new Password";   

               }
           }

以下はフォームです。

            echo "<form action='./forgotpass.php' method='post'>
            <table>
            <tr>
            <td></td>
            <td id='errormsg'>$errormsg</td>
            </tr>
            <tr>
            <td>Username</td>
            <td><input type='text' name='user' value='$user'/><br/>".$error_user."</td>
            </tr>
            <tr>
            <td>Email</td>
            <td><input type='text' name='email' value='$email'/><br/>".$error_email."</td>
            </tr>
            <tr>
            <td></td>
            <td><input type='submit' name='resetbtn' value='Reset Password' /></td>
            </tr>
            </table>
            </form>";
4

3 に答える 3

1
$numrows = $stmt->num_rows();   

する必要があります

$numrows = $stmt->num_rows;   

if ($numrows == 1){

する必要があります

if ($numrows === 1){
于 2012-12-10T20:52:02.077 に答える
1

$query が行を返さない場合、最初に $errormsg が「あなたのユーザー名または電子メールが正しくありませんでした」になり、その後、「エラーが発生しました。新しいパスワードを含む電子メールが送信されませんでした」に変わります。

条件はまったく同じ (同じクエリ!) であるため、最初の条件が true の場合、2 番目の条件も true になります。2 つの同一のクエリが必要な理由はわかりませんが、本当に必要な場合は、最後の数行の $errormsg 変数を別の変数 (例: $errormsg2) に変更し、フォームに別々にエコーしてみてください。

于 2012-12-10T20:45:50.647 に答える
0

@John1つの問題に言及-

$selectnumrows = $stmt->num_rows();

OOPスタイルである必要があります-

$selectnumrows = $stmt->num_rows;

==vs===は状況によってはオプションですが、良い習慣です)


しかし、あなたが得ている理由An error has occured, your Email was not sent containing your new Passwordは、あなたYour Username or Email was not Correct$errormsg最初のチェックで設定し、2番目のチェックでそれをリセットしているからです。コードを要約して追加しました//Comments

$errors = array();

if(!$errors) {  //This is returning true
  ...
  if ($numrows == 1){ //This is returning false
   ...
  }else{
     if(!$numrows){
         $errormsg = "Your Username or Email was not Correct";  //So this is getting set
         ...
     }
  }
}
if(empty($errors)) {  // But this is also returning true
  if ($selectnumrows == 1){   // And this is also returning false
      $errormsg = "<span style='color: green'>Your Password has been Reset. An Email has been sent with your New Password</span>";
  } //This closing '}' is missing in your posted code!!
  else{
       $errormsg = "An error has occured, your Email was not sent containing your new Password";   //So now $errormsg is being reset.
  }
}
于 2012-12-10T21:37:24.293 に答える