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 -
charles5353 Messages postés 28 Statut Membre -
Bonjour,
j essaye de convertir mon code mysqli en pdo mais je bloque la dessus
merci
j essaye de convertir mon code mysqli en pdo mais je bloque la dessus
if(mysqli_num_rows($req)!=1)
merci
9 réponses
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
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
merci pour la réponse
la variable
$req
est crée a ce stade
le code en mysqli etait
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'");
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 :
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 )
$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 )
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
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>
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
}
?>
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
Après l'exécution du code
Je reçois ce message d erreur
Un des champs n'est pas reconnu
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
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
Je ne vois pas du tout ce qui coince
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