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

Résolu
charles5353 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention   -  
charles5353 Messages postés 28 Date d'inscription   Statut Membre Dernière intervention   -
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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   Statut Membre Dernière intervention  
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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   Statut Membre Dernière intervention  
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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   Statut Membre Dernière intervention  
 
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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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