Bonjour,
Je ne trouve pas ce qui cloche !
Soit une fonction Postgresql qui commence ainsi et enregistre un nouvel élève en répartissant les données dans les différentes tables adéquates :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 CREATE OR REPLACE FUNCTION f_creer_eleve ( IN id_civilite integer, IN nom_usuel character varying, IN prenom_usuel character varying, IN login character varying, IN mot_passe character varying, IN date_naissance date, IN adrel character varying, IN type_adrel integer, OUT id_eleve integer ) RETURNS integer AS $BODY$ DECLARE numero_maxi integer; BEGIN
Lorsque je lance la requête suivante dans PGAdmin, ça fonctionne :
Code:
1
2 SELECT * FROM lec.f_creer_eleve(1, 'Nom-Test', 'Prenom-Test', 'test', 'test', '2001-01-01', 'test@domaine.fr', 1);
Je veux maintenant faire la même chose dans mon appli PHP.
J'ai la méthode suivante dans la classe modèle Eleve :
Remarque : La requête est la même que celle qui fonctionne dans PGAdmin mais avec des paramètres nommés et les paramètres sont bien passés dans le même ordre que dans la fonction PostgreSQL.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 function creerEleve($idCivilite, $nomUsuel, $prenomUsuel, $login, $motPasse, $dateNaissance, $adrel, $type_adrel) { $sql = " SELECT * FROM lec.f_creer_eleve(:idCivilite, :nomUsuel, :prenomUsuel, :login, :motPasse, :dateNaissance, :adrel, :typeAdrel) "; try { $prep = self::getBdd()->prepare($sql); $prep->bindParam(':idCivilite', $idCivilite, PDO::PARAM_INT); $prep->bindParam(':nomUsuel', $nomUsuel, PDO::PARAM_STR); $prep->bindParam(':prenomUsuel', $prenomUsuel, PDO::PARAM_STR); $prep->bindParam(':login', $login, PDO::PARAM_STR); $prep->bindParam(':motPasse', $motPasse, PDO::PARAM_STR); $prep->bindParam(':dateNaissance', $motPasse, PDO::PARAM_STR); $prep->bindParam(':adrel', $adrel, PDO::PARAM_STR); $prep->bindParam(':typeAdrel', $type_adrel, PDO::PARAM_INT); $prep->execute(); $retour = $prep->fetch(); $result = $retour->id_eleve; } catch (PDOException $e) { $result = 'ERREUR PDO dans '.$e->getFile(). ' L.'.$e->getLine().' : '.$e->getMessage(); } return $result; }
Mon contrôleur appelle la méthode ainsi :
Vous constaterez que j'ai testé les valeurs des données passées à la méthode et elles sont justes.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 $objDateNaissance = new \DateTime($_POST['date_naissance']); $dateNaissanceFormatee = $objDateNaissance->format('Y-m-d'); $motPasseHash = password_hash($_POST['password'], PASSWORD_DEFAULT); /*echo 'civilite : '.intval($this->getData()['civilite']).'<br />'; echo 'nom : '.$this->getData()['nom'].'<br />'; echo 'prenom : '.$this->getData()['prenom'].'<br />'; echo 'login : '.$this->getData()['login'].'<br/>'; echo 'mot passe crypté : '.$motPasseHash.'<br />'; echo 'date naissance formatée : '.$dateNaissanceFormatee.'<br />'; echo 'adrel : '.$this->getData()['adrel'].'<br />'; echo 'type adrel : '.intval($this->getData()['type_adrel']); exit;*/ $objEleve = new Eleve(); $result = $objEleve->creerEleve( intval($this->getData()['civilite']), $this->getData()['nom'], $this->getData()['prenom'], $this->getData()['login'], $motPasseHash, $dateNaissanceFormatee, $this->getData()['adrel'], intval($this->getData()['type_adrel']) ); echo 'Résultat enregistrement élève : '.$result;
Quand j'exécute, j'obtiens l'erreur suivante : 8O:aie::weird:
On dirait que la date '2001-01-01' est hashée comme le password !Citation:
Résultat enregistrement élève : ERREUR PDO dans /home/philippe/Documents/Logicielem/1-Projets/P007-libre-ecole/2.Developpement/libre-ecole/Application/Model/Eleve.php L.50 : SQLSTATE[22007]: Invalid datetime format: 7 ERROR: invalid input syntax for type date: "$2y$10$BqE.y9G6ouOEiQn8uDYlq.9G5tQMrFFXtpA41EU7978jKiDneg57G"
Quelqu'un a une idée du truc qui ne va pas ?