Procédure Stockée SQL Server Sortie Params en PHP
J'ai besoin d'aide pour l'exécution d'une procédure stockée dans SQL Server en PHP. PHP est exécuté sur un serveur Unix/Linux. Nous ne pouvons pas obtenir des variables de SORTIE pour retourner en PHP. Voici 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 me dire pourquoi $outVar1 et $outVar2 ne sont pas remplies? Merci beaucoup pour toute aide!
- Ne mssql_get_last_message() dire quelque chose d'utile?
- mssql_get_last_message() renvoie " a Modifié la base de données de contexte pour "dbName"'
- Avez-vous essayé avec une chaîne de 36 places?
- Oui, nous avons essayé de spécification de la longueur dans le mssql_bind appel. Toujours pas de chance.
- Non, lui donner une mesure de la chaîne: $outVar2 = ' ...36 places... ';
- Pas de chance avec l'adaptation de la chaîne.
- Je sais. Ce n'est même pas mon projet. J'essaie d'aider un co-travailleur de sortir. Mais maintenant, c'est juste coché moi hors de question que nous n'avons pas pensé à elle.
- Essayez ma réponse, voir ci-dessous.
- J'ai juste couru ce script sur mon windows box via WampServer et devinez quoi. Il a travaillé. Donc, apparemment, Unix/Linux + PHP = Déteste MSSQL sortie params dans stockées procs.
- Comme alternative, vous pouvez toujours SÉLECTIONNER les valeurs que vous voulez sortir de la SP et munissez-vous simplement de l'ensemble de résultats. Accordé, ce n'est pas aussi beau que réel les paramètres de SORTIE.
- la destruction de la fonction mssql_bind Erreur d'affichage
Vous devez vous connecter pour publier un commentaire.
Selon cette page sur PHP bugs, vous avez à (l'emphase est mienne):
Le deuxième paramètre de la méthode execute doit être vrai, plutôt que de conn. Cela devrait fonctionner:
Essayez de spécifier les longueurs spécifiques des champs de sortie
Et voir si cela fait une différence.
Également note de l'explicite & pour passer la sortie de vars par référence, bien que je ne sais pas si c'est toujours nécessaire ou pas.
Je doute que cela soit la cause de votre problème, mais pourquoi êtes-vous à l'aide de
DISTINCT
?C'est juste un codesmell - vous voyez de qui, cela signifie qu'il ya un potentiel pour le retour des doublons qui est "géré" avec DISTINCTES, et pourquoi les doublons seront retournés sans doute besoin d'être regardé.
Pas sûr de la version de PHP que vous utilisez, mais je pense que dans certaines plus anciennes, vous avez besoin pour passer des variables par référence pour obtenir la valeur de sortir de nouveau:
De sorte que vous aurez besoin de mettre le & charcter avant de la variable lors de l'appel de la fonction:
Également selon ce lien certaines versions eu un problème avec la sortie paramétrée
Hm. Quelques commentaires
1) "mssql_execute($procédure,$conn);" qui est mal dans le 2ème paramètre est pas la connexion.
2) Si vous obtenez "exécution de la procédure stockée a échoué", alors j'ai dû créer une base de données de l'hôte dans freetds.conf et de référence.
À ce point, je n'ai pas d'erreurs, mais je n'ai pas la sortie params soit. C'est PHP 5.1 sur RHEL5.
Si j'active freeTDS de journalisation, je vois les données proviennent de retour dans le colis de retour. À ce stade, je ne sais pas pourquoi cela ne fonctionne pas, soit (autre que le support de SQL server pour PHP est un peu défaut!)
Je suis d'avoir les mêmes problèmes.
En supposant que vous utilisez le FreeTDS pilote pour communiquer avec SQL Server il y a un problème connu avec la façon dont le conducteur de travaux. Il est mis en évidence dans la FAQ
http://www.freetds.org/faq.html#ms.output.parameters
L'API docs pour ce qui est suggéré dans la FAQ est ici, mais je ne peux pas trouver un moyen d'accéder à ce avec PHP:
http://www.freetds.org/reference/a00276.html
Je ne peux toujours pas accroché et je suis au point où je vais donner sur les paramètres de sortie tous ensemble.
je l'ai fait par le biais de Bibliothèque Adodb de manière très simple...
$addProduct = $obj->ExecuteQuery("Commencer;DECLARE @ProductCode que varchar (100) ;EXEC CREATEPRODUCT'$pname', '$prix', @ProductCode de SORTIE, '$merchantId';select @ProductCode;End;");
$codeproduit = $addProduct[0][0];
pour plus d'explication, vous pouvez visiter ce site..
http://developer99.blogspot.com/2011/07/calling-ms-sql-sp-from-php.html