Sortie de procédure stockée SQL Server Params en PHP

J'ai besoin d'aide pour exécuter une procédure stockée à partir de SQL Server en PHP. PHP fonctionne sur un server Unix / Linux. Nous ne pouvons pas get les variables OUTPUT à returnner en PHP. Ce qui suit est le code PHP:

$conn = mssql_connect('server', 'user', 'pass'); mssql_select_db('db', $conn); $procedure = mssql_init('usp_StoredProc', $conn); $tmpVar1 = 'value'; $tmpVar2 = 'value2'; $outVar1 = ''; $outVar2 = ''; mssql_bind($procedure, "@var1", $tmpVar1, SQLVARCHAR, false, false); mssql_bind($procedure, "@var2", $tmpVar2, SQLVARCHAR, false, false); mssql_bind($procedure, "@outVar1", $outVar1, SQLVARCHAR, true); mssql_bind($procedure, "@outVar2", $outVar2, SQLVARCHAR, true); mssql_execute($procedure,$conn); print($outVar1); print($outVar2); 

La procédure stockée ressemble à ceci:

  SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[usp_StoredProc] ( @var1 as varchar(36), @var2 as varchar(10), @outVar1 varchar(36) OUTPUT, @outVar2 varchar(36) OUTPUT ) as select distinct @outVar1 = row1, @outVar2 = row2 from table1 where column1 = @var1 and column2 = @var2 

Quelqu'un peut-il me dire pourquoi $ outVar1 et $ outVar2 ne sont pas remplis? Merci beaucoup pour toute aide!

D'après cette page sur les bogues PHP , vous devez (mien):

appelez mssql_next_result() pour chaque set de résultats renvoyé par le SP. De cette façon, vous pouvez gérer plusieurs résultats.

Lorsque mssql_next_result() renvoie false, vous aurez access aux parameters de sortie et à la valeur de return.

Le second param de execute doit être vrai, plutôt que conn. Cela devrait fonctionner:

 $conn = mssql_connect('server', 'user', 'pass'); mssql_select_db('db', $conn); $procedure = mssql_init('usp_StoredProc', $conn); $tmpVar1 = 'value'; $tmpVar2 = 'value2'; $outVar1 = ''; $outVar2 = ''; mssql_bind($procedure, "@var1", $tmpVar1, SQLVARCHAR, false, false); mssql_bind($procedure, "@var2", $tmpVar2, SQLVARCHAR, false, false); mssql_bind($procedure, "@outVar1", $outVar1, SQLVARCHAR, true); mssql_bind($procedure, "@outVar2", $outVar2, SQLVARCHAR, true); mssql_execute($procedure,true); print($outVar1); print($outVar2); 

Essayez de spécifier les longueurs spécifiques des champs de sortie

 mssql_bind($procedure, "@outVar1", &$outVar1, SQLVARCHAR, true, false, 36); mssql_bind($procedure, "@outVar2", &$outVar2, SQLVARCHAR, true, false, 36); 

Et voyez si cela fait une différence.

Notez également explicitement & pour passer les variables de sortie par reference, bien que je ne sache pas si c'est encore nécessaire ou non.

Je doute que cela cause votre problème, mais pourquoi utilisez-vous DISTINCT ?

C'est juste un codemell – chaque fois que vous voyez cela, cela signifie qu'il y a un potentiel pour renvoyer des duplicates qui sont "traités" avec DISTINCT, et pourquoi les duplicates devraient être returnnés doivent probablement être examinés.

Vous ne savez pas quelle version de PHP vous utilisez, mais je pense que dans certains des plus anciens, vous avez besoin de passer des variables par reference pour que la valeur ressorte:

Vous devez donc placer le paramètre & charcter avant la variable lors de l'appel de la fonction:

 mssql_bind($procedure, "@outVar1", &$outVar1, SQLVARCHAR, true); mssql_bind($procedure, "@outVar2", &$outVar2, SQLVARCHAR, true); 

Toujours selon ce lien, certaines versions ont eu un problème avec les parameters de sortie

Hm. Quelques commentaires

1) "mssql_execute ($ procedure, $ conn);" est faux en ce que le 2ème paramètre n'est pas la connection.

2) Si l'exécution de la procédure stockée a échoué, j'ai dû créer un hôte DB dans freetds.conf et le referencer.

À ce stade, je n'obtiens pas d'erreurs mais je ne reçois pas les parameters de sortie non plus. C'est PHP 5.1 sur RHEL5.

Si j'active la journalisation freeTDS, je vois que datatables reviennent dans le package de return. À ce stade, je ne sais pas pourquoi cela ne fonctionne pas non plus (à part le support du server SQL pour PHP qui manque un peu!)

J'ai les mêmes problèmes.

En supposant que vous utilisez le pilote FreeTDS pour communiquer avec SQL Server, il existe un problème connu concernant le fonctionnement du pilote. Il est mis en évidence dans la FAQ

http://www.freetds.org/faq.html#ms.output.parameters

Les documents de l'API pour ce qui est suggéré dans la FAQ sont ici mais je ne peux pas find un moyen d'y accéder avec PHP:

http://www.freetds.org/reference/a00276.html

Je n'arrive toujours pas à le faire et je suis au point où je vais abandonner tous les parameters de sortie.

Je l'ai fait par le biais de la bibliothèque Adodb de manière très simple …

$ addProduct = $ obj-> ExecuteQuery ("Début; DECLARE @ProductCode comme varchar (100); EXEC CREATEPRODUCT '$ pname', '$ price', @ProductCode OUTPUT, '$ merchantId'; select @ProductCode; End;") ;

$ productCode = $ addProduct [0] [0];

Pour plus d'explications, vous pouvez visiter ce site. http://developer99.blogspot.com/2011/07/calling-ms-sql-sp-from-php.html