requête SQL en php

requête SQL en php - PHP - Programmation

Marsh Posté le 07-04-2020 à 15:57:22    

Bonjour j'ai réussi à faire une requête INSERT pour s'inscrire mais j'essaie de faire un système de changement de mdp et je n'y arrive pas j'aimerais votre aide merci.
Ma BDD appelée users est sur phpmyadmin et comporte plusieurs colonnes dont id pseudo email et password.
Le problème vient de ma requête SQL

Code :
  1. $q= $db->prepare("UPDATE users SET password = :new_password WHERE email = :email" );


Dans ce code ci-dessous

Code :
  1. <?php session_start(); //ouverture de la session
  2.     //Récuperation du pseudo
  3.     $pseudo=$_SESSION["pseudo"];
  4.     $email=$_SESSION["lemail"];
  5.     $password=$_SESSION["lpassword"];
  6.     //Récuperation du dossier usilisateur correspondant au pseudo
  7. ?>
  8. <!DOCTYPE html>
  9. <html>
  10.     <head>
  11.         <meta charset='uft-8'>
  12.         <title>Paramètres</title>
  13.         <link rel='stylesheet' href='css/main.css'>
  14.         <link rel='stylesheet' href='css/index.css'>
  15.     </head>
  16.     <nav>
  17.         <img src=/images/cloud.png title='icone' id='icone'>
  18.     </nav>
  19.     <body>
  20.         <div id="wrapper">
  21.             <form method="post">
  22.                     <input type="password" name="new_password" id="new_password" placeholder="Votre Nouveau Mot de Passe"><br/>
  23.                     <input type="password" name="newc_password" id="newc_password" placeholder="Confirmer Votre Nouveau Mot de Passe"><br/>
  24.                     <input type="submit" name="formsend" id="formsend" value="Envoyer"><br/>
  25.             </form>
  26.            
  27.              <?php
  28.           if(isset($_POST['formsend'])){
  29.               extract($_POST);
  30.               if(!empty($new_password) && !empty($newc_password)){
  31.                   if($new_password == $newc_password){
  32.                    include 'database.php';
  33.           global $db;
  34.                    $q= $db->prepare("UPDATE users SET password = :new_password WHERE email = :email" );
  35.                          $q->execute([
  36.                             'password'=> $new_password
  37.                          ]);
  38.                          echo "<font style=\"font family: courrier new;\"><strong>Le mdp a été changé merci de vous reconnecter</strong></font>";
  39.                 }else{
  40.                     echo "<font style=\"font family: courrier new;\"><strong>Les mot de passes ne correspondent pas</strong></font>";
  41.                 }
  42.             }else{
  43.                 echo "<font style=\"font family: courrier new;\"><strong>Les champs ne sont pas tous remplis</strong></font>";
  44.             }
  45.         }
  46.         ?>
  47.     </div>
  48.     </body>
  49. </html>


 
J'ai cette erreur :

Code :
  1. Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in

Reply

Marsh Posté le 07-04-2020 à 15:57:22   

Reply

Marsh Posté le 07-04-2020 à 16:12:20    

Code :
  1. $q= $db->prepare("UPDATE users SET password = :new_password WHERE email = :email" );
  2.                    $q->execute([
  3.                          'password'=> $new_password
  4.                    ]);


Tu ne crois pas qu'il te manque un paramètre quelque part ?

Spoiler :

A moins que le but soit d'appliquer le nouveau mot de passe à tous les utilisateurs mais alors c'est ta requête qui n'est pas bonne... :o


---------------
D3
Reply

Marsh Posté le 07-04-2020 à 16:24:00    

problème résolu :

Code :
  1. $q= $db->prepare("UPDATE users SET password = :password WHERE pseudo = '$pseudo' " );
  2.                          $q->execute([
  3.                             'password'=> $new_password
  4.                          ]);


 
J'ai un nouveau problème est qu'avec le nouveau mot de passe il est impossible de me connecter avec le nouveau mdp pourtant changé dans la BDD
C'est surement du à ma page de connexion :  

Code :
  1. <?php session_start(); //ouverture de la session
  2.     if (isset($_SESSION["pseudo"])){
  3.         header('Location: dashboard.php');
  4.     }
  5. ?>
  6. <?php
  7.             if(isset($_POST['formlogin'])){
  8.                 extract($_POST);
  9.                 if(!empty($lemail) && !empty($lpassword)){
  10.                     $q = $db->prepare("SELECT * FROM users WHERE email = :email" );
  11.                     $q->execute(['email' => $lemail]);
  12.                     $result = $q->fetch();
  13.                     if($result == true){
  14.                         //le compte existe bien
  15.                         if(password_verify($lpassword, $result['password'])){
  16.                             echo "Le mot de passe est bon , connexion";
  17.                             $_SESSION["pseudo"]=$result['pseudo'];
  18.                             $_SESSION["lemail"]=$result['email'];
  19.                             $_SESSION["lpassword"]=$result['password'];
  20.                             $_SESSION['fileUpload']=False;
  21.                             header('Location: dashboard.php');
  22.                             exit();
  23.                         }else{
  24.                             echo "Le mot de passe est incorrect";
  25.                         }
  26.                     }
  27.                     else{
  28.                         echo "Le compte portant l'email " . $lemail . "n'existe pas";
  29.                     }
  30.                 }
  31.                 else{
  32.                     echo "Veuillez completer l'ensemble des champs";
  33.                 }
  34.             }
  35.         ?>
  36.         <script type="text/javascript" src="js/index.js"></script>
  37.     </body>
  38. </html>


 
Pour raccourcir le code j'ai enlevé la partie avec la déclaration des boutons


Message édité par Nestati le 07-04-2020 à 16:25:00
Reply

Marsh Posté le 07-04-2020 à 17:17:25    

Lu,
 
à quel moment tu haches ce nouveau mot de passe avec password_hash ?
 

Code :
  1. $q= $db->prepare("UPDATE users SET password = :password WHERE pseudo = '$pseudo' " );


Et te voilà avec une injection SQL via $pseudo ! Pourquoi n'en as-tu pas fait un paramètre/marqueur comme tu l'as fait pour le (hash du) mot de passe ?!?
 

Code :
  1. if($result == true){


La comparaison (non stricte) à true est inutile car implicite avec une condition (if/else if/for/while/etc)


Message édité par pluj le 07-04-2020 à 17:19:41
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed