Bonjour,

Cela fait maintenant plusieurs semaines que j'essai de récupréer le résultat d'une procédure stocké sur mon sql Server.
Le code de mon controller pour appeler la procédure stocké est le suivant:

$this->loadModel('DevCondition');
$result = $this->DevCondition->query("Exec [dbo].[cond_docu_log_errors];");
debug($result);

Le debug affiche toujours "Array()". Pourtant ma procédure stocké renvoi 1ou 0 normalement.

Quelqu'un aurait une idée ?

Merci d'avance

The-Devil

11 réponses


The-Devil
Auteur
Réponse acceptée

Bonjour,

J'ai donc trouvé la solution après avoir éssayer différentes syntaxe random.
pour exécuter une procédure stocké, il suffit d'inscrire son nom dans query() comme ceci:

$this->loadModel('DevCondition');
$result = $this->DevCondition->query("[dbo].[cond_docu_log_errors]");
debug($result);

En espérant que cela dépanne quelqu'un ^^

Huggy
Réponse acceptée

Bonjour The-Devil,

de manière générale en PDO et Sql server
voici ce qui fonctionne

$stmt = $pdo->query("maProcedure");

ou encore

$query = $pdo->query("exec maProcedure");

et si on passe des paramètres

$query = $pdo->query("maProcedure 1234");

parfois il faut rajouter le schema dbo (en fonction du user utilisé et des droits)

$query = $pdo->query("exec dbo.maProcedure");

les crochets ne sont utiles que si les noms contiennent des espaces

Merci pour ces clarifications @Huggy !
Cela ne sera plus utilie que de faire une solution que j'ai éssayé en random haha
Je valide ta réponse et te souhaite une bonne journée :)

@Huggy

J'ai une procédure qui doit renvoyé une chaîne de caractères, si j'effectue le code suivant:

$result = $this->DevCondition->query("[dbo].[cond_docu_log_errors]");
debug($result);

le debug affiche true et non pas la valeur de retour.
Saurais-tu comment faire pour afficher la valeur de retour ?
Merci encore

comment retournes-tu ta chaine de caractères ?

si tu fais
SELECT 'coucou' AS result
dans ta PS
il suffit de lire le champ result

Je fais ceci afin de renvoyer un résultat :

if @check_cond = 0 begin select @result = 'False'  print @result end
if @check_cond > 0 begin select @result = 'True'  print @result end

et je'exécute la requête comme ceci:

$result = $this->DevCondition->query("exec test_proc;");
debug($result);

Et cela me donne Array();
Comment lire ce "Array()" ?

fait un SELECT plutot qu'un print
comme je l'ai dit plus haut.

Pour info, les paramètres OUTPUT ne sont pas compatible avec Php PDO car PDO ne connait que les parametres INPUT:OUTPUT mais pas OUTPUT seul.

Je ne comprends pas. Je ne peux pas simplement mettre 0 paramètres et récupérer la réponse de ma procédure ?

Si si
voici une PS

ALTER PROCEDURE [dbo].[pstest]
AS
BEGIN
    select 'coucou' AS result;
END

et en php tu fais

try {
    $pdo = new PDO("sqlsrv:Server=localhost;Database=mabase", "sa", "secret");
}
catch(PDOException $e) {
    $msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
    die($msg);
}

$stmt = $pdo->query("pstest");

while ($row = $stmt->fetch()) {
    echo $row['result'];
}

ici le while ne sert pas puisqu'il n'y a qu'un seul résultat

J'essai de faire cela mais avec cakephp...
Saurais-tu réecrire cela avec la syntaxe de CakePHP ?

Non, je ne touche pas à cakephp
mais d'autres devaient te faire ça les doigts dans le nez