Erreur d'execution

Par beyen, il y a 10 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

j'ai créer une classe user dans laquelle j'ai developper une fonction inscription qui permet a l'utilisateur d'inscrire et dans la page
formulaire.php j'ai créer un instance de la classe et fait appl a inscription
voici la page User.php

<?php class User { public $nom; public $prenom; public $ncin; public $date_nais; public $etablissement; public $specialite; public $sujet_master; public $sujet_these; public $grade; public $tel; public $mail; private $pw; public function __construct($nom, $prenom, $ncin, $date_nais, $etablissement, $specialite, $sujet_master, $sujet_these, $grade, $tel, $mail, $pw) { $this->nom = $nom; $this->prenom = $prenom; $this->ncin = $ncin; $this->date_nais = $date_nais; $this->etablissement = $etablissement; $this->specialite = $specialite; $this->sujet_master = $sujet_master; $this->sujet_these = $sujet_these; $this->grade = $grade; $this->tel = $tel; $this->mail = $mail; $this->pw = $pw; } public function inscription() { $nom = $_POST['nom']; $prenom = $_POST['prenom']; $ncin = $_POST['ncin']; $date_nais = $_POST['date_nais']; $etablissement = $_POST['etablissement']; $specialite = $_POST['specialite']; $sujet_master = $_POST['sujet_master']; $sujet_these = $_POST['sujet_these']; $grade = $_POST['statut']; $tel = $_POST['tel']; $mail = $_POST['mail']; $pw = $_POST['pw']; $confirmation_token = sha1(uniqid(rand())); require_once'Database.php'; require_once 'App.php'; $bd = App::getDatabase(); $req = $bd->query("INSERT INTO user ( ncin, nom, prenom, etablissement, specialite, master, these, tel, mail, pass,naissance,grade) VALUES ( :ncin,:nom, :prenom, :etablissement,:specialite, :sujet_master,:sujet_these, :date_nais, :grade,:tel,:mail,:pw, :statut)", array("ncin"=> $ncin, "nom" => $nom, "prenom" => $prenom, "etablissement" => $etablissement, "specialite" => $specialite, "sujet_master" => $sujet_master, "sujet_these" => $sujet_these, "tel" => $tel, "mail" => $mail, "pw" => $pw, "date_nais" => $date_nais, "statut" => $grade )); $user_id = $bd->LastInsertId(); // On envoit l'email de confirmation mail($_POST['mail'], 'Confirmation de votre compte', "Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://localhost/assos/confirm.php?id=$user_id&token=$confirmation_token"); // On redirige l'utilisateur vers la page de login avec un message flash $_SESSION['flash']['success'] = 'Un email de confirmation vous a été envoyé pour valider votre compte'; //App::redirect('connexion.php'); exit(); if ($req == FALSE) { $errInfos = $bd->errorInfo(); echo '<div class="alert alert-danger"> <h4>Echec</h4> <p>Votre compte n\'a pas �t� cr�e pour les raison suivantes: </p> </div>' . $errInfos[2]; } } } ?>

formulaire.php

<?php
require 'inc/header.php';
include_once('class/User.php');
require_once 'class/Database.php';
require_once 'class/App.php';
if(!empty($_POST)){

$errors=array();
if(empty($_POST['nom']) || !preg_match('/^[a-zA-Z]+$/', $_POST['nom'])){
    $errors['nom'] = "Vous devez entrer votre nom";
}
if(empty($_POST['prenom']) || !preg_match('/^[a-zA-Z]+$/', $_POST['prenom'])){
    $errors['prenom'] = "Vous devez entrer votre prenom";
}
if(empty($_POST['ncin'])){
    $errors['ncin'] = "Vous devez entrer le numéro de votre cart d'identité";
}
if(empty($_POST['etablissement'])){
    $errors['etablissement'] = "Vous devez entrer le nom d'établissement";
}
if(empty($_POST['specialite'])){
    $errors['specialite'] = "Vous devez entrer votre spécialté";
}

if(empty($_POST['sujet_master'])){
    $errors['sujet_master'] = "Vous devez entrer votre sujet de mastère";
}
if(empty($_POST['sujet_these'])){
    $errors['sujet_these'] = "Vous devez entrer votre sujet de thèse";
}

if(empty($_POST['tel'])  ){
    $errors['tel'] = "Vous devez entrer votre numéro de téléphone";
}
if (empty($_POST['mail']) || !filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL)) {
    $errors['mail'] = "Vérifier votre email";
}elseif(!empty($_POST['mail']) && filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL)) {
   include_once 'class/Database.php';
    include_once 'class/App.php';
    $bd=App::getDatabase();
    $user =$bd->query('select mail from user WHERE mail=?',[$_POST['mail']])->fetch();
    if($user){
        $errors['mail'] = 'Cette adresse mail est déjà utilisé';
    }
}
if ((empty($_POST['pw']) ||empty($_POST['pw1']) )){
    $errors['pw'] = "Vous devez entrer votre mot de pass et sa confirmation";
    if( $_POST['pw']!= $_POST['pw1'] ){
        $errors['pw'] = "Vous devez retaper le même mot de pass";
    }
    if(strlen($_POST['pw'])<=6){
        $errors['pw']="mot de passe doit contenir au moins 6 caractere ";
    }
}

if(empty($errors)){
    $adherent =new User($_POST['ncin'],$_POST['nom'],$_POST['prenom'], $_POST['etablissement'],$_POST['specialite'],$_POST['sujet_master'],
        $_POST['sujet_these'],$_POST['tel'],$_POST['mail'],$_POST['pw'],$_POST['date_nais'],$_POST['statut']);
    $adherent->inscription();

}

}
?>
<div class="container-fluid" style="margin-top: 100px">
<div class="col-md-offset-3 col-md-6">
<h1><i> Inscription</i></h1>
<br>
<?php
if(!empty($errors)):
?>
<div class="alert alert-danger">
<h4>Vous n'avez pas rempli le formulaire correctement </h4>
<ul>
<?php foreach($errors as $error): ?>
<li> <?= $error; ?></li>
<?php endforeach ; ?>
</ul>
</div>
<?php elseif(empty($errors) && !empty($_POST)): ?>
<div class="alert alert-success">
<h4>Félicitation!</h4>
<p>Votre compte a été crée avec succès.</p>
</div>
<?php endif; ?>

    <form  role="form" method="POST" action="formulaire.php" >
        <div class="form-group col-sm-6">
            <label> Nom :</label>
            <input type="text" class="form-control" name="nom">
        </div>

        <div class="form-group col-sm-6">
            <label>Prénom :</label>
            <input type="text" class="form-control" name="prenom">
        </div>
        <div class="form-group col-sm-6">
            <label >Numéro de la cart d'identité :</label>
            <input type="text" class="form-control" name="ncin">
        </div>
        <div class="form-group col-sm-6">
            <label class="oblig">Date de naissance :</label>
            <input type="date" class="form-control" name="date_nais">
        </div>

        <div class="form-group col-sm-12">
            <label class="oblig">Etablissement :</label>
            <input type="text" class="form-control" name="etablissement">
        </div>

        <div class="form-group col-sm-6">
            <label class="oblig"><b> Grade:</b></label>
            <select class="form-control" name="grade" size="1">
                <option>Mastère</option>
                <option>Enseigant</option>
                <option>Doctorant</option>
                <option>Docteur</option>
            </select>
        </div>

        <div class="form-group col-sm-6">
            <label class="oblig">Spécialité: </label>
            <input type="text" name="specialite" class="form-control"/><span class="error"></span>
        </div>
        <div class="form-group col-sm-12">
            <label class="oblig">Sujet master: </label>
            <input type="text" name="sujet_master" class="form-control" /><span class="error"></span>
        </div>
        <div class="form-group col-sm-12">
            <label  class="oblig">Sujet these: </label>
            <input type="text" name="sujet_these" class="form-control" /><span class="error"></span>
        </div>

        <div class="form-group col-sm-6">
            <label  class="oblig">statut: </label>
            <select class="form-control" name="statut" size="1">
                <option>Adhérent</option>
                <option>Membre</option>
                <option>Trésorier</option>
                <option>Administrateur</option>
                <option>Président</option>
            </select>

        </div>

        <div class="form-group col-sm-6">
            <label class="oblig">Tél: </label>
            <input type="text" name="tel" class="form-control" /><span class="error"></span>
        </div>
        <div class="form-group  col-sm-12">
            <label class="oblig">E-mail :</label>
            <input type="email" class="form-control" name="mail">
        </div>
        <div class="form-group col-sm-6">
            <label class="oblig">Mot de pass :</label>
            <input type="password" class="form-control" name="pw">
        </div>
        <div class="form-group col-sm-6">
            <label class="oblig">Confirmer votre mot de pass :</label>
            <input type="password" class="form-control" name="pw1">
        </div>
        <div class="form-group col-sm-6">
            <input type="submit" value="envoyer" class="btn btn-default btn-ms" name="envoyer">
        </div>
    </form>
</div>

</div>
<?php include'footer.html';?>

Database.php <?php class Database { public $pdo; public function __construct(){ $this->pdo = new PDO("mysql:dbname=chercheur;host=localhost", 'root', ''); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); } public function query($query,$params){ if($params) { $req = $this->pdo->prepare($query); $req->execute($params); } else{ $req=$this->pdo->query($query); } return $req; } public function LastInsertID(){ return $this->pdo->LastInsertId(); } }

je serai trés reconnaissante si quelqu'un peut m'aider de resoudre l'erreur . Merci

Ce que j'obtiens

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in C:\wamp\www\assos\class\Database.php on line 14
PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\assos\class\Database.php on line 14

6 réponses

Arnaud Mcho Scott, il y a 10 ans

Hello,

$req = $bd->query("INSERT INTO user ( ncin, nom, prenom, etablissement, specialite, master, these, tel, mail, pass,naissance,grade) VALUES ( :ncin,:nom, :prenom, :etablissement,:specialite, :sujet_master,:sujet_these, :date_nais, :grade,:tel,:mail,:pw, :statut)", array("ncin"=> $ncin, "nom" => $nom, "prenom" => $prenom, "etablissement" => $etablissement, "specialite" => $specialite, "sujet_master" => $sujet_master, "sujet_these" => $sujet_these, "tel" => $tel, "mail" => $mail, "pw" => $pw, "date_nais" => $date_nais, "statut" => $grade ));

Ton tableau de paramètre, il manque les ':' devant les noms de tes paramètres =>

$req = $bd->query("INSERT INTO user ( ncin, nom, prenom, etablissement, specialite, master, these, tel, mail, pass,naissance,grade) VALUES ( :ncin,:nom, :prenom, :etablissement,:specialite, :sujet_master,:sujet_these, :date_nais, :grade,:tel,:mail,:pw, :statut)", array(":ncin"=> $ncin, ":nom" => $nom, ":prenom" => $prenom, ":etablissement" => $etablissement, ":specialite" => $specialite, ":sujet_master" => $sujet_master, ":sujet_these" => $sujet_these, ":tel" => $tel, ":mail" => $mail, ":pw" => $pw, ":date_nais" => $date_nais, ":statut" => $grade ));

Pour plus d'informations => http://php.net/manual/fr/pdostatement.execute.php

beyen, il y a 10 ans

Mrc bcp Arnaud :)

Carouge10, il y a 10 ans

oui il y a cela mais l'erreur dit que le nombre de paramètre demander et celui envoyer est différent. Il manque le grade dans le execute.

Huggy, il y a 10 ans

A quand les messages d'erreurs en français ... merde alors

Carouge10, il y a 10 ans

lol Huggy.
[Hors Sujet On] Et tant qu'on y est, on pourrais mettre tous le codage en français (^_^) [Hors Sujet Off]

Lartak, il y a 10 ans

Bonjour.
Il te faut également faire attention à l'ordre que tu donnes au champs et aux valeurs, car si je prends l'exemple du champ tel, en correspondance de la liste des champs, il équivaut à la valeur de date_nais qui à mon avis à un format de date qui ne correspond pas au champ tel en base de données.
Je te conseille donc de faire attention à l'ordre que tu donnes dans tes requêtes SQL.
La notation avec les : peut avoir un avantage contrairement à la notation en ? dans la méthode execute d'une requête préparée, mais ça ne veut pas dire que tu ne dois pas faire attention à l'ordre que tu donnes dans la liste des champs et des valeurs.