php/mysqli中出现错误的验证消息

php/mysqli中出现错误的验证消息,php,mysqli,Php,Mysqli,下面是一段代码,它在验证和成功时执行某些php/mysqli任务。下面代码的问题是,如果用户输入了错误的用户名或电子邮件(由SELECT查询确定),如果没有匹配的用户名和电子邮件,则应显示错误消息您的用户名或电子邮件不正确。但它显示的是此错误消息发生了错误,您的电子邮件未发送包含新密码的邮件 我的问题是,为什么它会显示不正确的错误消息,以及如何让它显示正确的错误消息 if(isset($_POST['resetbtn'])){ //get

下面是一段代码,它在验证和成功时执行某些php/mysqli任务。下面代码的问题是,如果用户输入了错误的用户名或电子邮件(由SELECT查询确定),如果没有匹配的用户名和电子邮件,则应显示错误消息
您的用户名或电子邮件不正确
。但它显示的是此错误消息
发生了错误,您的电子邮件未发送包含新密码的邮件

我的问题是,为什么它会显示不正确的错误消息,以及如何让它显示正确的错误消息

            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";   

               }
           }
if(isset($\u POST['resetbtn'])){
//获取表单数据
$user=$_POST['user'];
$email=$_POST['email'];
$errors=array();
如果(!$errors){
$query=“选择TeacherUsername,TeacherEmail FROM Teacher,其中TeacherUsername=?和TeacherEmail=?”;
//准备查询
$stmt=$mysqli->prepare($query);
//您只需要调用bind_param一次
$stmt->bind_参数(“ss”、$user、$email);
//执行查询
$stmt->execute();
//获取结果并分配变量(前缀为db)
$stmt->bind_result($dbTeacherUsername,$dbTeacherEmail);
//获取行数
$stmt->store_result();
$numrows=$stmt->num_rows();
如果($numrows==1){
$pass=rand();
$teacherpassword=md5($pass);
$teacherpassword=substr($pass,0,15);
$teacherpassword=md5(md5(“g3f”。$pass。“rt4”);
//更新数据库中的密码
$updatesql=“更新教师设置教师密码=?其中教师用户名=?”;
$update=$mysqli->prepare($updatesql);
$update->bind_参数(“ss”、$teacherpassword、$user);
$update->execute();
$query=“从教师中选择教师用户名、教师密码,其中教师用户名=?和教师密码=?”;
//准备查询
$stmt=$mysqli->prepare($query);
//您只需要调用bind_param一次
$stmt->bind_参数(“ss”,$user,$teacherpassword);
//执行查询
$stmt->execute();
//获取结果并分配变量(前缀为db)
$stmt->bind_result($dbTeacherUsername,$dbTeacherPassword);
//获取行数
$stmt->store_result();
$selectnumrows=$stmt->num_rows();
}否则{
如果(!$numrows){
$errormsg=“您的用户名或电子邮件不正确”;
$user=”“;
$email=“”;
}
}
}
if(空($errors)){
如果($selectnumrows==1){
$errormsg=“您的密码已重置。已发送带有新密码的电子邮件”;
否则{
$errormsg=“发生错误,未发送包含新密码的电子邮件”;
}
}
表格如下:

            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>";
echo”
$errormsg
用户名

“$error\u user。” 电子邮件
“$error\u电子邮件。” ";
如果$query不返回任何行,首先您的$errormsg将变为“您的用户名或电子邮件不正确”,然后变为“发生错误,您的电子邮件未发送,其中包含您的新密码”

条件完全相同(相同的查询!),因此如果第一个为真,那么第二个也将为真。我不确定为什么需要两个相同的查询,但如果确实需要,请尝试将最后几行中的$errormsg变量更改为另一个变量(例如$errormsg2),并在表单中分别回显它们

$numrows = $stmt->num_rows();   
应该是

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

应该是

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

@John
提到了一个问题-

$selectnumrows = $stmt->num_rows();
需要采用OOP风格-

$selectnumrows = $stmt->num_rows;
(在您的情况下,
==
vs
==
是可选的,但这是一种良好的做法)


但是您收到的原因-
发生了错误,您的电子邮件未发送包含新密码的电子邮件,而不是
您的用户名或电子邮件不正确的原因是您在第一次检查中设置了
$errormsg
,并在第二次检查中重置了它。我已压缩了您的代码并添加了
//注释de>

$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.
  }
}
$errors=array();
如果(!$errors){//这将返回true
...
如果($numrows==1){//,则返回false
...
}否则{
如果(!$numrows){
$errormsg=“您的用户名或电子邮件不正确”;//所以这是设置
...
}
}
}
if(empty($errors)){//但这也返回true
如果($selectnumrows==1){//,这也返回false
$errormsg=“您的密码已重置。已发送带有新密码的电子邮件”;
}//您发布的代码中缺少此结束“}”!!
否则{
$errormsg=“发生错误,您的电子邮件未发送包含新密码的邮件”;//因此现在$errormsg正在重置。
}
}

-1用于使用从某处获得的代码。学习基本知识。有时,使用从某处获得的代码是在学习基本知识的道路上!好吧,你(OP)至少应该缩进代码并正确匹配括号。tripple=必要吗?num_rows它应该返回一个整数值,对吗?应该,但是如果它返回字符串“zero”或“Erro”呢