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 ! :arf:
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:
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:
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:
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:
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:
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;
}
} |