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


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
Auteur

Mrc bcp Arnaud :)

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.

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

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

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.