Bonjour,
J'ai une procédure avec un paramètre en sortie (OUT) qui fonctionne lorsque je la lance dans MySQL.
MariaDB me renvoie :
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CALL pi_ajout_diplome ('un-code', 'un nom court', 'un nom qui est plus long', 2, @idDiplome); SELECT @idDiplome;
Quand j'essaie de lancer cette procédure via PHP, le diplôme se crée bien en BDD mais je ne récupère pas l'idDiplome créé.@idDiplome
212
Dans la classe modèle Diplome, j'ai ceci :
Code PHP : 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 public function enregistrerDiplome($code = null, $nomCourt = null, $nomLong = null, $idType = null) { $sql = " CALL pi_ajout_diplome (:code, :nomCourt, :nomLong, :idType, :idDiplome); SELECT :idDiplome; "; $result = self::executerRequete($sql, array( array('param' => ':code', 'value' => trim($code), 'data_type' => PDO::PARAM_STR), array('param' => ':nomCourt', 'value' => trim($nomCourt), 'data_type' => PDO::PARAM_STR), array('param' => ':nomLong', 'value' => trim($nomLong), 'data_type' => PDO::PARAM_STR), array('param' => ':idType', 'value' => $idType, 'data_type' => PDO::PARAM_INT), array('param' => ':idDiplome', 'value' => '@idDiplome', 'data_type' => PDO::PARAM_STR, 'length' => 4000) )); if(!is_null($result)) { return $result['@idDiplome']; } else { return null; } }
Dans la classe Modele dont hérite la classe Diplome, j'ai ceci :
Code PHP : 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 /** * Exécute une requête SQL éventuellement paramétrée * @param string $sql : Requête SQL à exécuter * @param array $params : Tableau de paramètres éventuels (param, value, data_type) * @return mixed */ protected static function executerRequete($sql, $params = null) { // Détermination du type de requête à exécuter $mots = explode(' ', $sql, 2); $typeRequete = trim($mots[0]); try { // Exécution de la requête if ($params == null) { $prep = self::getBdd()->query($sql); // exécution directe } else { $prep = self::getBdd()->prepare($sql); // requête préparée foreach($params as $param) { if(count($param) == 4) { $prep->bindParam($param['param'], $param['value'], $param['data_type'], $param['length']); } else { $prep->bindParam($param['param'], $param['value'], $param['data_type']); } } $prep->execute(); } // Envoi du résultat ou pas selon type de requête switch ($typeRequete) { case "SELECT": case "CALL": // Requête de type SELECT ou appel de procédure (CALL) => envoi de toutes les lignes de résultat sous forme de tableau $resultat = $prep->fetchAll(); break; case 'INSERT': // Requête de type INSERT => envoi de l'identifiant inséré $resultat = $prep->lastInsertId(); break; default: // Autre type => pas de résultat à retourner $resultat = ''; } $prep->closeCursor(); } catch (\PDOException $e) { echo 'Erreur PDO : '.$e->getMessage().' dans le fichier '.$e->getFile().' à la ligne '.$e->getLine(); // TODO : à gérer avec les erreurs de l'application } return $resultat; }
Et j'obtiens ceci :
J'ai essayé diverses choses, sans succès.Erreur PDO : SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 5 for routine pef.pi_ajout_diplome is not a variable or NEW pseudo-variable in BEFORE trigger
Partager