[MariaDB] Procédure stockée avec parmètre en sortie
Bonjour,
J'ai une procédure avec un paramètre en sortie (OUT) qui fonctionne lorsque je la lance dans MySQL.
Code:
1 2
| CALL pi_ajout_diplome ('un-code', 'un nom court', 'un nom qui est plus long', 2, @idDiplome);
SELECT @idDiplome; |
MariaDB me renvoie :
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éé.
Dans la classe modèle Diplome, j'ai ceci :
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
| 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:
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 :
Citation:
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
J'ai essayé diverses choses, sans succès.