IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

SQLSTATE[HY093]: Invalid parameter number: parameter was not defined


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2019
    Messages : 2
    Par défaut SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
    Bonjour,

    Je me permets de poster sur ce forum pour la première fois, et étant en plein apprentissage du PHP j'ai l'habitude de venir ici chercher des solutions à mes problèmes via les posts existants, où je trouve presque toujours une solution grâce à vous !

    Mais cette fois-ci je n'arrive pas à le résoudre par moi même, le problème me dépasse probablement...
    J'ai souvent lu sur différents forums et même ici, que ce problème provient souvent d'un problème dans la requête SQL, j'ai déjà tenté de modifier cette requête plusieurs fois, vérifié si les intitulés étaient bons mais je continue a avoir cette erreur.

    (Note : Je suis conscient que niveau optimisation ou sécurité c'est pas vraiment ça, mais j'essaye d'améliorer le code bout par bout, en essayant de réparer les erreurs à chaque étape...)

    Je vous remercie beaucoup pour votre temps, et votre aide !


    Contexte : inscription utilisateur, projet construit en POO / MVC => tentative de mise en place des méthodes d'entités/manager


    Voici mes bouts de code utilisés dans mon cas présent :

    Routeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    case 'inscription':
                        $this->ctrlInscription = new ControleurEspaceAdmin();
                        $nomUtilisateur = $this->getParametre($_POST, 'nomUtilisateur');
                        $motDePasse = $this->getParametre($_POST, 'motDePasse');
                        $this->ctrlInscription->inscription($nomUtilisateur, $motDePasse);
                        break;
     
    private function getParametre($tableau, $nom)
        {
            if (isset($tableau[$nom])) {
                return $tableau[$nom];
            } else
                throw new Exception("Paramètre '$nom' absent");
        }

    ControleurEspace Admin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    class ControleurEspaceAdmin {
     
    //private $identifiant;
    private $manager;
     
    public function __construct() {
        $this->manager = new UtilisateurManager();
    }
     
    public function inscription() {
            if (isset($_POST['inscription']) && ($_POST['nomUtilisateur']) && ($_POST['motDePasse'])) {
                $util = new Utilisateur([
                    'nomUtilisateur' => $_POST['nomUtilisateur'],
                    'motDePasse' => $_POST['motDePasse']
                ]);
                $this->manager->add($util);
            }
            header('Location: http://localhost:8888/Projet3OC/index.php');

    Utilisateur (entité) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    <?php
     
    require_once 'Modele/Modele.php';
     
    class Utilisateur extends Modele {
     
        private $id_utilisateur;
        private $nom_utilisateur;
        private $mot_de_passe;
     
     
        public function hydrate(array $donnees) {
            foreach ($donnees as $cle => $valeur) {
                // On récupère le nom du setter correspondant à l'attribut
                $method = 'set'.ucfirst($cle);
                if (method_exists($this, $method)) {
                    // On appelle le setter
                    $this->$method($valeur);
                }
            }
        }
     
        // Liste des getters
        public function id() {
            return $this->id_utilisateur;
        }
     
        public function nomUtilisateur() {
            return $this->nom_utilisateur;
        }
     
        public function motDePasse() {
            return $this->mot_de_passe;
        }
     
     
        // Liste des setters
        public function setId($id) {
            // Les valeurs possibles de l'identifiant sont tous les nombres entiers strictement positifs
            // On convertir l'argument en nombre entier
            // Si c'en était déjà un rien ne changera
            // Sinon, la conversion donnera le nombre 0 (à quelques exceptions près) 
            $id = (int) $id;
     
            // On vérifie ensuite si ce nobmre est bien strictement positif
            if ($id > 0) {
                // Si c'est le cas, c'est parfait, on assigne la valeur à l'attribut correspondant
                $this->id_utilisateur = $id;
            }
        }
     
        public function setNomUtilisateur($nomUtilisateur) {
            // Les valeurs possibles de l'utilisateur sont toutes les chaînes de caractères
            // On vérifie qu'il s'agit bien d'une chaîne de caractères
            if (is_string($nomUtilisateur)) {
                $this->nom_utilisateur = $nomUtilisateur;
            }
        }
     
        public function setMotDePasse($motDePasse) {
            // Les valeurs possibles du mot de passe sont toutes les chaînes de caractères
            // Toujours de la même manière on vérifie qu'il s'agit bien d'une chaîne de caractères
            if (is_string($motDePasse)) {
                $this->mot_de_passe = $motDePasse;
            }
        }
    }
    UtilisateurManager (manager) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?php
     
    require_once 'Modele/Modele.php';
     
    // Quelles seront les caractéristiques de mes objets ?
    // Quelles seront les fonctionnalités de mes objets ?
     
    // De quoi à besoin un manager pour fonctionner = une connexion à la BDD pour pouvoir exécuter des requêtes. En utilisant PDO, la connexion à la BDD est representée par un objet
     
    // Un manager doit pouvoir :
    // enregistrer une nouvelle entité; (C)
    // sélectionner une entité; (R)
    // modifier une entité; (U)
    // supprimer une entité; (D)
     
    class UtilisateurManager extends Modele {
     
        private $_bdd; // Instance de PDO
     
     
        public function __construct() {
            $this->getBdd();
        }
     
        public function add(Utilisateur $util) {
            // Préparation de la requête d'insertion
            $bdd = $this->getBdd();
     
            $add = $bdd->prepare('insert INTO utilisateurs(id_utilisateur, nom_utilisateur, mot_de_passe) VALUES(null, :nom_utilisateur, :mot_de_passe)');
            $add->bindValue($_POST['nomUtilisateur'], $util->nomUtilisateur());
            $add->bindValue($_POST['motDePasse'], $util->motDePasse());
            Debug::printr($_POST);
            $add->execute();
    Modele :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    <?php
     
    abstract class Modele
    {
     
        // Objet PDO pour accèder à la BDD
        private $bdd;
     
        // Execute une requête SQL éventuellement paramètrée
        protected function executerRequete($sql, $params = null) {
            if ($params == null) {
                $resultat = $this->getBdd()->query($sql); // exécution directe
            } else {
                $resultat = $this->getBdd()->prepare($sql); // requête préparée
                Debug::printr($resultat);
                $resultat->execute($params);
            }
            return $resultat;
        }
     
        // Connexion BDD
        // Instancie et renvoi l'objet PDO associé
        protected function getBdd()
        {
            $bdd = new PDO('mysql:host=localhost;dbname=Projet3OC;charset=utf8', 'root', 'root', array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            ));
            return $bdd;
        }
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    On n'a pas besoin de connaitre la couleur de ton slip...

    On n'a juste besoin de :
    • La requête qui pose problème
    • Le message d'erreur complet

    En l'occurrence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public function add(Utilisateur $util) {
            // Préparation de la requête d'insertion
            $bdd = $this->getBdd();
     
            $add = $bdd->prepare('insert INTO utilisateurs(id_utilisateur, nom_utilisateur, mot_de_passe) VALUES(null, :nom_utilisateur, :mot_de_passe)');
            $add->bindValue($_POST['nomUtilisateur'], $util->nomUtilisateur());
            $add->bindValue($_POST['motDePasse'], $util->motDePasse());
            Debug::printr($_POST);
            $add->execute();
    Les bindValue sont faux.

    Si ce sont les $_POST à ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
            $add = $bdd->prepare('insert INTO utilisateurs(id_utilisateur, nom_utilisateur, mot_de_passe) VALUES(null, :nom_utilisateur, :mot_de_passe)');
            $add->bindValue( ':nom_utilisateur', $_POST['nomUtilisateur'] );
            $add->bindValue( ':mot_de_passe', $_POST['motDePasse'] );
    ...

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2019
    Messages : 2
    Par défaut
    Pardon, etant le premier post, je ne savais pas trop


    Effectivement, ça marche tout de suite mieux.... merci !

    Du coup, le paramètre '$util' de la fonction n'a plus besoin d'être utilisé ?

Discussions similaires

  1. [QUOTE]SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
    Par MInfo25 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 01/08/2017, 22h51
  2. Réponses: 2
    Dernier message: 15/01/2017, 01h19
  3. Réponses: 2
    Dernier message: 30/05/2015, 19h47
  4. Réponses: 7
    Dernier message: 08/04/2015, 10h16
  5. Réponses: 6
    Dernier message: 03/06/2010, 10h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo