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

Résolu/Fermé
charles5353 Messages postés 28 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 5 février 2022 - 5 juil. 2021 à 08:17
charles5353 Messages postés 28 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 5 février 2022 - 5 juil. 2021 à 12:35
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

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
5 juil. 2021 à 08:28
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
charles5353 Messages postés 28 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 5 février 2022
5 juil. 2021 à 08:36
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
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
5 juil. 2021 à 09:21
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
charles5353 Messages postés 28 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 5 février 2022
5 juil. 2021 à 09:54
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
Modifié le 5 juil. 2021 à 11:48
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
charles5353 Messages postés 28 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 5 février 2022
5 juil. 2021 à 12:09
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
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
5 juil. 2021 à 12:15

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
charles5353 Messages postés 28 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 5 février 2022
Modifié le 5 juil. 2021 à 12:26
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
charles5353 Messages postés 28 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 5 février 2022
5 juil. 2021 à 12:30
Ah je pense comprendre
La variable n a pas été définie
Donc je dois la crée
0
charles5353 Messages postés 28 Date d'inscription lundi 5 juillet 2021 Statut Membre Dernière intervention 5 février 2022
5 juil. 2021 à 12:35
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