Warning: PDOStatement::execute(): SQLSTATE[HY093]:

Fermé
yves_2021 Messages postés 6 Date d'inscription mardi 29 juin 2021 Statut Membre Dernière intervention 2 juillet 2021 - 29 juin 2021 à 16:26
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 2 juil. 2021 à 18:02
J'essaye de contruire un code mot de passe oublié, j'ai des erreurs

1)Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\wamp\www\ndameyong\Classes\Db.php on line 68
2) Fatal error: Uncaught Error: Call to a member function rowCount() on int in C:\wamp\www\ndameyong\forgot.php on line 31
( ! ) Error: Call to a member function rowCount() on int in C:\wamp\www\ndameyong\forgot.php on line 31
voilà mon code
forgot.php

<?php require 'includes/includes.php';
if(!empty($_SESSION['user'])){
  header('location:profil.php');
} 
?>
<?php 
$titrepage="Mot de passe oublié || Ndameyong - L'Ecole des Langues Camerounaises" ;
require 'includes/header.php'; 
?>

<?php
$title = 'Mot de passe oublié';

if(!empty($_POST))
{
    $post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
    extract($post);

    $errors = [];


    if(empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)){
      array_push($errors, 'Cette email est invalide.');
    }
    else{
      $sql = "SELECT * FROM users WHERE email=:email";
     $data = [':email']; 
$req = $DB->exec($sql , $data) ;


      if(!$req->rowCount()){
        array_push($errors, 'Cet email ne correspond à aucun membre du site.');
      }
      else{
        $user = $req->fetch();
      }

      if(empty($errors))
      {
        $token = uniqid();

        $req = $db->prepare('INSERT INTO password_resets (email, token, created_at) VALUES (:email, :token, NOW())');


        $sql = 'DELETE FROM users WHERE id=:id';
        $data = [':id'=>$user['id']]; 
        $del = $DB->exec($sql , $data) ;

        $req->bindValue(':email', $email, PDO::PARAM_STR);
        $req->bindValue(':token', $token, PDO::PARAM_STR);
        $req->execute();

        $link = 'Bonjour, veuillez cliquer sur <a href="https://membres.test/reset.php?token='.$token.'">ce lien</a> pour réinitialiser votre mote de passe.';

        // Create the Transport
        $transport = (new Swift_SmtpTransport('smtp.mailtrap.io', 465))
          ->setUsername('fae489573327ac')
          ->setPassword('eed3d4ab64b373')
        ;

        // Create the Mailer using your created Transport
        $mailer = new Swift_Mailer($transport);

        // Create a message
        $message = (new Swift_Message('Mot de passe oublié'))
          ->setFrom(['lcorrefabien@gmail.com' => 'John Doe'])
          ->setTo([$email => $user->name])
          ->addPart($link, 'text/html');
          ;

        // Send the message
        $result = $mailer->send($message);

        if($result){
          $success = 'Un email vous a été envoyé avec des instructions.';
          unset($email);
        }
      }
    }
}

?>
    <h2>Récupérez votre mot de passe</h2>

    <?php include('messages.php');?>

    <form action="forgot.php" method="post">
      <div class="form-group">
        <label for="email">Email</label>
        <input type="email" name="email" class="form-control" placeholder="Email" value="<?= $email ?? '';?>">
      </div>
      <button type="submit" class="btn btn-primary">Envoyer</button>
    </form>
    <br>

    <p><a href="login.php">Je m'en souviens en fait.</a></p>

<?php require 'includes/footer2.php'; ?>


Db.php
<?php
 
/**
* Gestion de la base de données
*/
class Db{
     
    private $host=HOST;
    private $name=DBNAME;
    private $user=USER;
    private $pass=PWD;
 
    private $connexion;
 
    function __construct($host=null,$name=null,$user=null,$pass=null){
         
        if($host != null){
            $this->host = $host;
            $this->name = $name;
            $this->user = $user;
            $this->pass = $pass;
        }
 
        try{
 
            $this->connexion = new PDO('mysql:host='.$this->host.';dbname='.$this->name,
                $this->user,$this->pass,array(
                    1002 =>'SET NAMES UTF8',
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING

                    ));
            $this->connexion->exec('SET NAMES utf8');
//PDO::MYSQL_ATTR_INIT_COMMAND
        }catch (PDOException $e){
            //echo 'Erreur : Impossible de se connecter  à la BD !';die();
            echo $e->getMessage();
        }

 

    }

    /* requete */
 
    public function query($sql , $data=array()){
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->fetchAll(PDO::FETCH_OBJ);
    }
 
    public function tquery($sql , $data=array()){
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->fetchAll(PDO::FETCH_ASSOC);
    }
 
 
    public function insert($sql , $data=array()){
        $req = $this->connexion->prepare($sql);
        $nb=$req->execute($data);
        return $nb;
    }
    
	
	public function exec($sql , $data=array()){
      try{
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->rowCount(); // Retourne le nombre de lignes impactées par la reuqête
      }catch(Exception $e){
        echo 'Erreur : ' . $e->getMessage(); // en cas d'erreur dans la requête !
      }
    }

    public function deleteuser($id){
       $sql = 'DELETE FROM users WHERE id=:id';
       $data = [':id'=>$id]; 
       return  $DB->exec($sql , $data) ;
    }

  public function uniqueEmail($email){
        $req = $this->connexion->prepare('SELECT count(*) as nbre from users WHERE email=:email limit 1');
        $req->execute(array('email'=>$email));
 
        $reponse = $req->fetchAll(PDO::FETCH_ASSOC);
        return $reponse[0]['nbre'];
 
    }

}



Merci d'avance

6 réponses

yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
29 juin 2021 à 16:28
bonjour,
inutile de créer une nouvelle discussion, il suffit de continuer la discussion précédente.
peux-tu fermer une des deux discussions?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
29 juin 2021 à 17:44
Déjà... BONJOUR .. ( si si .. ici on commence par ça !! )

Ensuite,
$req = $DB->exec($sql , $data) ;


Tu utilises la fonction exec de ta class DB ... fonction qui retourne le nombre de lignes impactées par ta requête...

public function exec($sql , $data=array()){
      try{
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->rowCount(); // Retourne le nombre de lignes impactées par la reuqête
      }catch(Exception $e){
        echo 'Erreur : ' . $e->getMessage(); // en cas d'erreur dans la requête !
      }
    }


Donc...

      if(!$req->rowCount()){

Est à remplacer par :
  if(!$req){


Pour ton autre message d'erreur.. il faudrait savoir quelle requête est concernée.....
Je t'invite à mettre systématiquement CHAQUE requête dans un bloc TRY/CATCH afin d'affiner l'affichage des messages d'erreur.
Prends exemple ici :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

0
yves_2021 Messages postés 6 Date d'inscription mardi 29 juin 2021 Statut Membre Dernière intervention 2 juillet 2021
1 juil. 2021 à 13:00
Bonjour,
Mercie de votre réponse
je me rends compte que je suis trompé de code du coup les erreurs que ne sont pas celles que j'avais envoyé dernièrement, je vous renvoi le code ainsi que les trois erreurs qui apparaissent

NB: permettre à un utilisateur de retrouver son mot de passe

1) Notice: Undefined variable: Db in C:\wamp\www\ndameyong\forgot.php on line 23
2) Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\wamp\www\ndameyong\forgot.php on line 23
3) Error: Call to a member function prepare() on null in C:\wamp\www\ndameyong\forgot.php on line 23
Voilà la code forgot.php
<?php require 'includes/includes.php';
if(!empty($_SESSION['user'])){
  header('Location:profil.php');
} 
?>



<?php

if(!empty($_POST))
{
    $post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
    extract($post);

    $errors = [];


    if(empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)){
      array_push($errors, 'Cette email est invalide.');
    }
    else{
      $req = $Db->prepare('SELECT * FROM users WHERE email=:email');
      $req->bindValue(':email', $email, PDO::PARAM_STR);
      $req->execute();


       if(!$req){
        array_push($errors, 'Cet email ne correspond à aucun membre du site.');
      }
      else{
        $user = $req->fetch();
      }

      if(empty($errors))
      {
        $token = uniqid();

        $req = $db->prepare('INSERT INTO password_resets (email, token, created_at) VALUES (:email, :token, NOW())');
        $req->bindValue(':email', $email, PDO::PARAM_STR);
        $req->bindValue(':token', $token, PDO::PARAM_STR);
        $req->execute();

        $link = 'Bonjour, veuillez cliquer sur <a href="https://membres.test/reset.php?token='.$token.'">ce lien</a> pour réinitialiser votre mote de passe.';

        // Create the Transport
        $transport = (new Swift_SmtpTransport('smtp.mailtrap.io', 465))
          ->setUsername('fae489573327ac')
          ->setPassword('eed3d4ab64b373')
        ;

        // Create the Mailer using your created Transport
        $mailer = new Swift_Mailer($transport);

        // Create a message
        $message = (new Swift_Message('Mot de passe oublié'))
          ->setFrom(['lcorrefabien@gmail.com' => 'John Doe'])
          ->setTo([$email => $user->name])
          ->addPart($link, 'text/html');
          ;

        // Send the message
        $result = $mailer->send($message);

        if($result){
          $success = 'Un email vous a été envoyé avec des instructions.';
          unset($email);
        }
      }
    }
}

?>


  <?php 
$titrepage="Mot de passe oublié || Ndameyong - L'Ecole des Langues Camerounaises" ;
require 'includes/header.php'; 
?>

    <?php include('messages.php');?>

    <form action="forgot.php" method="post">
      <div class="form-group">
        <label for="email">Email</label>
        <input type="email" name="email" class="form-control" placeholder="Email" value="<?= $email ?? '';?>">
      </div>
      <button type="submit" class="btn btn-primary">Envoyer</button>
    </form>
    <br>

    <p><a href="login.php">Je m'en souviens en fait.</a></p>

<?php require 'includes/footer2.php'; ?>


Db.php
<?php
 
/**
* Gestion de la base de données
*/
class Db{
     
    private $host=HOST;
    private $name=DBNAME;
    private $user=USER;
    private $pass=PWD;
 
    private $connexion;
 
    function __construct($host=null,$name=null,$user=null,$pass=null){
         
        if($host != null){
            $this->host = $host;
            $this->name = $name;
            $this->user = $user;
            $this->pass = $pass;
        }
 
        try{
 
            $this->connexion = new PDO('mysql:host='.$this->host.';dbname='.$this->name,
                $this->user,$this->pass,array(
                    1002 =>'SET NAMES UTF8',
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING

                    ));
            $this->connexion->exec('SET NAMES utf8');
//PDO::MYSQL_ATTR_INIT_COMMAND
        }catch (PDOException $e){
            //echo 'Erreur : Impossible de se connecter  à la BD !';die();
            echo $e->getMessage();
        }

    }

    /* requete */
 
    public function query($sql , $data=array()){
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->fetchAll(PDO::FETCH_OBJ);
    }
 
    public function tquery($sql , $data=array()){
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->fetchAll(PDO::FETCH_ASSOC);
    }
 
 
    public function insert($sql , $data=array()){
        $req = $this->connexion->prepare($sql);
        $nb=$req->execute($data);
        return $nb;
    }
    
	
	public function exec($sql , $data=array()){
      try{
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->rowCount(); // Retourne le nombre de lignes impactées par la reuqête
      }catch(Exception $e){
        echo 'Erreur : ' . $e->getMessage(); // en cas d'erreur dans la requête !
      }
    }

    public function deleteuser($id){
       $sql = 'DELETE FROM users WHERE id=:id';
       $data = [':id'=>$id]; 
       return  $DB->exec($sql , $data) ;
    }

  public function uniqueEmail($email){
        $req = $this->connexion->prepare('SELECT count(*) as nbre from users WHERE email=:email limit 1');
        $req->execute(array('email'=>$email));
 
        $reponse = $req->fetchAll(PDO::FETCH_ASSOC);
        return $reponse[0]['nbre'];
 
    }

}

auth.php
<?php 

/**
* Auth
*/
class Auth{
	
	public static function islog($db){
		if(isset($_SESSION['user']) && isset($_SESSION['user']['email'])  && isset($_SESSION['user']['password'])){

			$data =array(
				'email'=>$_SESSION['user']['email'],
				'password'=>$_SESSION['user']['password']
				
				);
			
			$sql = 'SELECT * FROM users WHERE email=:email AND password=:password limit 1';
			$req = $db->tquery($sql,$data);

			if(!empty($req)){
				return true;
			}
		}
		return false;
	}


	public static function hashPassword($pass){

		return sha1(SALT.md5($pass.SALT).sha1(SALT));
	}


	public static function isadmin($db){
		if(isset($_SESSION['user']['role']) && (Auth::hashPassword('admin')  == $_SESSION['user']['role'])){
			return true;
		}
		return false;
	}

 
	public function deleteuser($id){
	   $sql = 'DELETE FROM users WHERE id=:id';
	   $data = [':id'=>$id]; 
	   return  $DB->exec($sql , $data) ;
	}
	
}


Merci d'avance
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
1 juil. 2021 à 13:19
Tu as instancie la classe ?
Je ne le vois pas dans le code que tu nous montres...
N'aurais-tu pas oublié d'inclure le fichier de connexion à la base ?
0
yves_2021 Messages postés 6 Date d'inscription mardi 29 juin 2021 Statut Membre Dernière intervention 2 juillet 2021
2 juil. 2021 à 01:55
Bsr cher monsieur,
j'ai utiliser la class Db (dans le fichier Db.php).
Le fichier de connexion à la bdd se trouve dans un fichier include.php
<?php 
require 'config.php'; 
require_once 'Classes/Db.php';
require_once 'Classes/auth.php';
$DB = new Db();

// cacher les erreurs pour la production
ini_set('error_reporting',E_ALL);
// afficher les érreurs lors du developpement 
//ini_set('error_reporting', E_ALL);
 ?>
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 juil. 2021 à 07:06
Alors.. ta variable se nomme $DB
et toi, ligne 23, tu as utilisé $Db
0

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

Posez votre question
yves_2021 Messages postés 6 Date d'inscription mardi 29 juin 2021 Statut Membre Dernière intervention 2 juillet 2021
2 juil. 2021 à 14:30
bonjour cher monsieur,
merci pour votre aide, j'ai rectifier l'ecriture de ma variable $Db par $DB ce qui a fait disparaitre
l'erreur de variable inconnu. Cependant pourquoi j'ai toujours ces erreurs ?
1)) Fatal error: Uncaught Error: Call to undefined method Db::prepare() in C:\wamp\www\ndameyong\forgot.php on line 23
2) ) Error: Call to undefined method Db::prepare() in C:\wamp\www\ndameyong\forgot.php on line 23
voilà forgot.php (modifiié)
<?php require 'includes/includes.php';
if(!empty($_SESSION['user'])){
  header('Location:profil.php');
} 
?>



<?php

if(!empty($_POST))
{
    $post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
    extract($post);

    $errors = [];


    if(empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)){
      array_push($errors, 'Cette email est invalide.');
    }
    else{
      $req = $DB->prepare('SELECT * FROM users WHERE email=:email');
      $req->bindValue(':email', $email, PDO::PARAM_STR);
      $req->execute();


       if(!$req){
        array_push($errors, 'Cet email ne correspond à aucun membre du site.');
      }
      else{
        $user = $req->fetch();
      }

      if(empty($errors))
      {
        $token = uniqid();

        $req = $DB->prepare('INSERT INTO password_resets (email, token, created_at) VALUES (:email, :token, NOW())');
        $req->bindValue(':email', $email, PDO::PARAM_STR);
        $req->bindValue(':token', $token, PDO::PARAM_STR);
        $req->execute();

        $link = 'Bonjour, veuillez cliquer sur <a href="https://membres.test/reset.php?token='.$token.'">ce lien</a> pour réinitialiser votre mote de passe.';

        // Create the Transport
        $transport = (new Swift_SmtpTransport('smtp.mailtrap.io', 465))
          ->setUsername('fae489573327ac')
          ->setPassword('eed3d4ab64b373')
        ;

        // Create the Mailer using your created Transport
        $mailer = new Swift_Mailer($transport);

        // Create a message
        $message = (new Swift_Message('Mot de passe oublié'))
          ->setFrom(['lcorrefabien@gmail.com' => 'John Doe'])
          ->setTo([$email => $user->name])
          ->addPart($link, 'text/html');
          ;

        // Send the message
        $result = $mailer->send($message);

        if($result){
          $success = 'Un email vous a été envoyé avec des instructions.';
          unset($email);
        }
      }
    }
}

?>


  <?php 
$titrepage="Mot de passe oublié || Ndameyong - L'Ecole des Langues Camerounaises" ;
require 'includes/header.php'; 
?>

    <?php include('messages.php');?>

    <form action="forgot.php" method="post">
      <div class="form-group">
        <label for="email">Email</label>
        <input type="email" name="email" class="form-control" placeholder="Email" value="<?= $email ?? '';?>">
      </div>
      <button type="submit" class="btn btn-primary">Envoyer</button>
    </form>
    <br>

    <p><a href="login.php">Je m'en souviens en fait.</a></p>

<?php require 'includes/footer2.php'; ?>


Db.php
<?php
 
/**
* Gestion de la base de données
*/
class Db{
     
    private $host=HOST;
    private $name=DBNAME;
    private $user=USER;
    private $pass=PWD;
 
    private $connexion;
 
    function __construct($host=null,$name=null,$user=null,$pass=null){
         
        if($host != null){
            $this->host = $host;
            $this->name = $name;
            $this->user = $user;
            $this->pass = $pass;
        }
 
        try{
 
            $this->connexion = new PDO('mysql:host='.$this->host.';dbname='.$this->name,
                $this->user,$this->pass,array(
                    1002 =>'SET NAMES UTF8',
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING

                    ));
            $this->connexion->exec('SET NAMES utf8');
//PDO::MYSQL_ATTR_INIT_COMMAND
        }catch (PDOException $e){
            //echo 'Erreur : Impossible de se connecter  à la BD !';die();
            echo $e->getMessage();
        }

    }

    /* requete */
 
    public function query($sql , $data=array()){
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->fetchAll(PDO::FETCH_OBJ);
    }
 
    public function tquery($sql , $data=array()){
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->fetchAll(PDO::FETCH_ASSOC);
    }
 
 
    public function insert($sql , $data=array()){
        $req = $this->connexion->prepare($sql);
        $nb=$req->execute($data);
        return $nb;
    }
    
	
	public function exec($sql , $data=array()){
      try{
        $req = $this->connexion->prepare($sql);
        $req->execute($data);
        return $req->rowCount(); // Retourne le nombre de lignes impactées par la reuqête
      }catch(Exception $e){
        echo 'Erreur : ' . $e->getMessage(); // en cas d'erreur dans la requête !
      }
    }

    public function deleteuser($id){
       $sql = 'DELETE FROM users WHERE id=:id';
       $data = [':id'=>$id]; 
       return  $DB->exec($sql , $data) ;
    }

  public function uniqueEmail($email){
        $req = $this->connexion->prepare('SELECT count(*) as nbre from users WHERE email=:email limit 1');
        $req->execute(array('email'=>$email));
 
        $reponse = $req->fetchAll(PDO::FETCH_ASSOC);
        return $reponse[0]['nbre'];
 
    }

}


Merci!
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
2 juil. 2021 à 14:58
comprends-tu le message d'erreur:
Call to undefined method Db::prepare()
?
je pense qu'il t'indique que tu prepare() n'existe pas dans la classe Db.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 juil. 2021 à 18:02
A la place de tes lignes 23 24, 25
Utilises la méthode tquery de ta class Db.
0
yves_2021 Messages postés 6 Date d'inscription mardi 29 juin 2021 Statut Membre Dernière intervention 2 juillet 2021
2 juil. 2021 à 14:55
salut,
ligne 42 de forgot.php j'avais écris ($req->execute();) mais ça n'a rien donné voilà pourquoi j'ai essayé celle-ci ($req = $DB->exec($sql , $data) ;). Je suis nouveau dans php j'ai travaillé dans un fichier avec la methode utilisant bindValue() ce code fonctionne bien labas. je voudrais maitraiser la methode utilisant les classes voilà pourquoi je m'en mêle les pédales
0