Comment remplacer if(mysqli_num_rows($req)!=1) en pdo

Résolu
charles5353 Messages postés 28 Statut Membre -  
charles5353 Messages postés 28 Statut Membre -
Bonjour,

j essaye de convertir mon code mysqli en pdo mais je bloque la dessus

if(mysqli_num_rows($req)!=1)

merci

9 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    Tout dépend de comment tu as créé $req

    Si tu as fait un fetchAll (comme c'est recommandé..) .. dans ce cas il te suffit de faire un COUNT

    0
  2. charles5353 Messages postés 28 Statut Membre
     
    merci pour la réponse

    la variable
    $req
    est crée a ce stade

    $req = $bdd->exec("SELECT * FROM utilisateurs WHERE pseudo='$Pseudo' AND password='$password'");


    le code en mysqli etait

    $req=mysqli_query($mysqli,"SELECT * FROM membres WHERE pseudo='$Pseudo' AND mdp='$Mdp'");
    0
  3. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Alors... vu que tu as commencé ( dans ta précédente question) à faire les choses bien ( c'est à dire utiliser les requêtes préparées..), ton code devient :
    $sql = "SELECT * FROM utilisateurs WHERE pseudo=:pseudo AND password= :password";
    
     $datas = [ ':pseudo'=> $Pseudo, ':password'=>$Mdp ];
    
    //Execution de la requete
    try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute($datas) ;
      
      //on stocke le résultat de la requête SELECT dans un array
      $resultat = $requete->fetchAll();
      $nbResult = !empty($resultat) ? count($resultat) : 0; // on compte le nombre de résultats retournés par la requête select
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();
       echo " Les datas : " ;
      print_r($datas);
    }
    	
    if($nbResult !=1 ) {
     //...
     
     
    

    A noter que ton code, actuellement, monre un jolie faille de sécurité....
    on ne stocke JAMAIS le mot de passe en clair dans la bdd !!!

    Il faudrait le hasher ( voir la fonction password_hash )
    0
  4. charles5353 Messages postés 28 Statut Membre
     
    merci pour la correction et le code
    mais malheureusement le reste de mon code apparemment pose des problèmes
    c est un code que j'ai pris comme exemple
    car je ne suis pas du tout familier au php ni a sa documentation que je trouve pas très bien expliquée
    pour le hash du password
    j aurais souhaiter si je pouvais m inspirer de ce tuto
    https://www.it-swarm-fr.com/fr/php/comment-utiliser-password-hash/1053934485/

    voici l extrait de code qui permet de modifier le mot de passe

    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', true);
    ini_set('display_startup_errors', true);
    echo "<p>Renseignez le formulaire ci-dessous pour modifier vos informations:</p>";
    //si le formulaire est envoyé ("envoyé" signifie que le bouton submit est cliqué)
    if (isset($_POST['valider']))
    {
        //vérifie si tous les champs sont bien pris en compte:
        if (!isset($_POST['nouveau_mdp'], $_POST['confirmer_mdp'], $_POST['password"']))
        {
            echo "Un des champs n'est pas reconnu.";
        }
        else
        {
            if ($_POST['nouveau_mdp'] != $_POST['confirmer_mdp'])
            {
                echo "Les mots de passe ne correspondent pas.";
            }
            else
            {
                $password = md5($_POST['password']);
                $NouveauMdp = md5($_POST['nouveau_mdp']);
                //$req=mysqli_query($mysqli,"SELECT * FROM membres WHERE pseudo='$Pseudo' AND mdp='$Mdp'");
                $sql = "SELECT * FROM utilisateurs WHERE pseudo=:pseudo AND password= :password";
    
                $datas = [':pseudo' => $Pseudo, ':password' => $Mdp];
    
                //Execution de la requete
                try
                {
                    $requete = $bdd->prepare($sql);
                    $requete->execute($datas);
    
                    //on stocke le résultat de la requête SELECT dans un array
                    $resultat = $requete->fetchAll();
                    $nbResult = !empty($resultat) ? count($resultat) : 0; // on compte le nombre de résultats retournés par la requête select
                    
                }
                catch(Exception $e)
                {
                    // en cas d'erreur :
                    echo " Erreur ! " . $e->getMessage();
                    echo " Les datas : ";
                    print_r($datas);
                }
    
                if ($nbResult != 1)
                {
    
                    echo "Mot de passe actuel incorrect.";
                }
                else
                {
                    //tout est OK, on met à jours son compte dans la base de données:
                    // if(mysqli_query($mysqli,"UPDATE membres SET mdp='$NouveauMdp' WHERE pseudo='$Pseudo'"))
                    
    
                    //préparation de la requête et des variables
                    $sql = "UPDATE utilisateurs SET password='$NouveauMdp' WHERE pseudo=?";
                    $datas = [$Pseudo];
                    //Execution de la requete
                    try
                    {
                        $requete = $bdd->prepare($sql);
                        $requete->execute($datas);
                    }
                    catch(Exception $e)
                    {
                        // en cas d'erreur :
                        echo " Erreur ! " . $e->getMessage();
                        echo " Les datas : ";
                        print_r($datas);
                    }
    
                    if ($requete)
    
                    // if ($req = $bdd->exec("UPDATE utilisateurs SET password='$NouveauMdp' WHERE pseudo='$Pseudo'"))
                    
                    {
                        echo "Mot de passe modifié avec succès!";
                        $TraitementFini = true; //pour cacher le formulaire
                        
                    }
                    else
                    {
                        echo "Une erreur est survenue, merci de réessayer ou contactez-nous si le problème persiste.";
                        //echo "<br>Erreur retournée: ".mysqli_error($mysqli);
                        
                    }
                }
            }
        }
    }
    if (!isset($TraitementFini))
    {
    ?>
                        <br>
                        <form method="post" action="espace-membre.php?modifier=mdp">
                            <input type="password" name="nouveau_mdp" placeholder="Nouveau mot de passe..." required><!-- required permet d'empêcher l'envoi du formulaire si le champ est vide -->
                            <input type="password" name="confirmer_mdp" placeholder="Confirmer nouveau passe..." required>
                            <input type="password" name="mdp" placeholder="Votre mot de passe actuel..." required>
                            <input type="submit" name="valider" value="Valider la modification">
                        </form>
    
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Ca devrait donner un truc du genre :

    <?php
    //---------------------------------
    //Affichage des erreurs PHP
    //---------------------------------
    error_reporting(E_ALL);
    ini_set('display_errors', true);
    ini_set('display_startup_errors', true);
    
    //---------------------------------
    //connexion à la bdd ??
    // require_once 'tonfichierdeconnexion.php' ??
    //---------------------------------
    
    
    
    //-------------------------------------
    // Découpage du code en Fonctions..
    // C'est plus facile à maintenir et plus "propre"
    //--------------------------------------
    /**
     * Récupère un user via son Pseudo
     * @global type $bdd
     * @param type $pseudo
     * @return boolean
     */
    function getUserByPseudo($pseudo) {
      global $bdd;
      $sql = "SELECT * FROM utilisateurs WHERE pseudo=:pseudo";
      $datas = [":pseudo" => $pseudo];
      try {
        $requete = $bdd->prepare($sql);
        $requete->execute($datas);
        //on stocke le résultat de la requête SELECT dans un array
        return $requete->fetchAll();
      } catch (Exception $e) {
        // en cas d'erreur :
        echo " Erreur ! " . $e->getMessage();
        echo " Les datas : ";
        print_r($datas);
        return false;
      }
    }
    
    /**
     * Authentification de l'utilisateur
     * @param type $pseudo
     * @param type $password
     * @return string
     */
    function authUser($pseudo, $password) {
      $result = [];
      $user = getUserByPseudo($pseudo);
      $nbResult = !empty($user) ? count($user) : 0; // on compte le nombre de résultats retournés par la requête select
      if ($nbResult != 1) {
        $result['ERROR'] = "Utilisateur inconnu";
      } else {
        $user_pass_bdd = $user[0]['password'];
        if (password_verify($password, $user_pass_bdd)) {
          $result['SUCCESS'] = $user[0];
        } else {
          $result['ERROR'] = " Mot de passe actuel incorrect !";
        }
      }
      return $result;
    }
    
    /**
     * Mise à jour du password en BDD
     * @global type $bdd
     * @param type $pseudo
     * @param type $NouveauMdp
     * @return boolean
     */
    function updatePassword($pseudo, $NouveauMdp) {
      global $bdd;
      $pwd = password_hash($NouveauMdp, PASSWORD_DEFAULT);
      $sql = "UPDATE utilisateurs SET password= :pwd WHERE pseudo= :pseudo ";
      $datas = [':pseudo' => $pseudo, ':pwd' => $pwd];
      //Execution de la requete
      try {
        $requete = $bdd->prepare($sql);
        return $requete->execute($datas);
      } catch (Exception $e) {
        // en cas d'erreur :
        echo " Erreur ! " . $e->getMessage();
        echo " Les datas : ";
        print_r($datas);
        return false;
      }
    }
    
    //---------------------------------
    // Récupération PROPRE des variables AVANT de les utiliser
    //---------------------------------
    $password = !empty($_POST['password']) ? $_POST['password'] : NULL;
    $nouveau_mdp = !empty($_POST['nouveau_mdp']) ? $_POST['nouveau_mdp'] : NULL;
    $confirmer_mdp = !empty($_POST['confirmer_mdp']) ? $_POST['confirmer_mdp'] : NULL;
    
    $TraitementFini = false;
    
    //---------------------------------
    // Traitemetn du formulaire
    //---------------------------------
    //si le formulaire est envoyé ("envoyé" signifie que le bouton submit est cliqué)
    if (isset($_POST['valider'])) {
    
      if (!$password || !$nouveau_mdp || !$confirmer_mdp) {
        $msg = "Un des champs n'est pas reconnu.";
      } elseif ($nouveau_mdp != $confirmer_mdp) {
        $msg = "Les mots de passe ne correspondent pas.";
      } else {
        $user = authUser($pseudo, $password);
        if (empty($user['ERROR'])) {
          if (updatePassword($pseudo, $nouveau_mdp)) {
            $msg = "Mot de passe modifié avec succès!";
            $TraitementFini = true;
          } else {
            $msg = "Une erreur est survenue, merci de réessayer ou contactez-nous si le problème persiste.";
          }
        }
      }
    }
    
    if (!empty($msg)) {
      echo "<div class='alert'>$msg</div>";
    }
    
    if (!$TraitementFini) {
      echo "<p>Renseignez le formulaire ci-dessous pour modifier vos informations:</p>";
      ?>
      <br>
      <form method="post" action="espace-membre.php?modifier=mdp">
        <input type="password" name="nouveau_mdp" placeholder="Nouveau mot de passe..." required><!-- required permet d'empêcher l'envoi du formulaire si le champ est vide -->
        <input type="password" name="confirmer_mdp" placeholder="Confirmer nouveau passe..." required>
        <input type="password" name="mdp" placeholder="Votre mot de passe actuel..." required>
        <input type="submit" name="valider" value="Valider la modification">
      </form>
      <?php
    }
    ?>
    


    0
  7. charles5353 Messages postés 28 Statut Membre
     
    Merci pour ce code complètement remis a neuf

    J'aurais une question pour le password_hash
    Je n'ai besoin que de cette ligne

    $pwd = password_hash($NouveauMdp, PASSWORD_DEFAULT);


    Après l'exécution du code
    Je reçois ce message d erreur

    Un des champs n'est pas reconnu
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       

      Après l'exécution du code
      Je reçois ce message d erreur

      Un des champs n'est pas reconnu

      Ah oui, ton input se nomme "mdp"
      il faut donc modifier la ligne
      $password = !empty($_POST['password']) ? $_POST['password'] : NULL;
      

      par
      $password = !empty($_POST['mdp']) ? $_POST['mdp'] : NULL;
      
      0
  8. charles5353 Messages postés 28 Statut Membre
     
    Merci pour la correction
    Pour plus de facilité et de compréhension j'ai modifie le input

    Apparemment j ai une erreur de variable dans cette ligne a présent

    Notice: Undefined variable: pseudo

     $user = authUser($pseudo, $password);


    Je ne vois pas du tout ce qui coince
    0
  9. charles5353 Messages postés 28 Statut Membre
     
    Ah je pense comprendre
    La variable n a pas été définie
    Donc je dois la crée
    0
  10. charles5353 Messages postés 28 Statut Membre
     
    Super encore une fois un bon travail
    J'ai juste récupérer la variable global pseudo de la connexion

    Merci et bonne journée
    0