2012-12-10 2 views
0

J'ai obtenu un code ci-dessous où il effectue certaines tâches php/mysqli sur la validation et le succès. Le problème que j'ai avec le code ci-dessous est que si l'utilisateur entre un nom d'utilisateur ou un email incorrect qui est déterminé par une requête SELECT, s'il n'y a pas de nom d'utilisateur et de courriel, il devrait afficher le message d'erreur Your Username or Email was not Correct. Mais à la place, il affiche ce message d'erreur An error has occured, your Email was not sent containing your new Password.mauvais message de validation apparaissant dans php/mysqli

Ma question est la suivante: pourquoi affiche-t-il le message d'erreur incorrect et comment puis-je l'obtenir pour afficher le message d'erreur correct?

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

       } 
      } 

est inférieure à la forme:

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

-1 pour utiliser un code que vous _got de anywhere_. Apprenez les bases. –

+2

Parfois, en utilisant le code que vous trouvez quelque part apprendre est dans le chemin vers l'apprentissage des bases! – Vasilis

+0

Eh bien, vous (l'OP) devriez au moins indenter le code et faire correspondre les crochets correctement. –

Répondre

1

Ce qui se passe est que si la requête $ retourne aucune ligne, d'abord votre errormsg de $ devient « Nom d'utilisateur ou email n'a pas été correct » et après qu'il change de : "Une erreur est survenue, votre email n'a pas été envoyé contenant votre nouveau mot de passe".

Les conditions sont exactement les mêmes (même requête!), Donc si le premier est vrai alors le second sera également vrai. Je ne sais pas pourquoi vous avez besoin de deux requêtes identiques, mais si vous en avez vraiment besoin, essayez de changer les variables $ errormsg des dernières lignes en une autre variable (par exemple $ errormsg2) et de les répercuter séparément dans le formulaire.

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

Devrait être

$numrows = $stmt->num_rows; 

Et

if ($numrows == 1){ 

devrait être

if ($numrows === 1){ 
+0

est le triplé = nécessaire? num_rows il devrait retourner une valeur entière, non? – Vasilis

+0

Il devrait, mais que faire si elle renvoie la chaîne "zéro" ou "Erreur"? Il va valider de cette façon (chaîne "zéro" == 1). Cela n'arrivera probablement pas dans ce cas, mais c'est une bonne pratique. –

0

@John mentionné un issue-

$selectnumrows = $stmt->num_rows(); 

doit être en POO style-

$selectnumrows = $stmt->num_rows; 

(Le == vs === est en option dans votre situation, mais les bonnes pratiques)


Mais la raison pour laquelle vous obtenez - An error has occured, your Email was not sent containing your new Password à la place de Your Username or Email was not Correct est parce que vous définissez $errormsg dans votre 1er chèque et le réinitialiser avec votre 2ème chèque. Je vous ai condensé le code et ajouté //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. 
    } 
} 
Questions connexes