我需要帮助从PHP中的SQL Server运行存储过程。 PHP在Unix / Linux服务器上运行。我们无法在PHP中返回OUTPUT变量。以下是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);
存储过程如下所示:
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
有谁能告诉我为什么$ outVar1和$ outVar2没有被填充?非常感谢您的帮助!
答案 0 :(得分:3)
根据this page on PHP bugs,你必须(强调我的):
为每个人致电
mssql_next_result()
SP返回的结果集。这个 你可以处理多种结果的方式。当
mssql_next_result()
返回false时 您将有权访问输出 参数和返回值。
答案 1 :(得分:2)
执行的第二个参数需要是真的,而不是conn。这应该有效:
$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);
答案 2 :(得分:1)
尝试指定输出字段的特定长度
mssql_bind($procedure, "@outVar1", &$outVar1, SQLVARCHAR, true, false, 36);
mssql_bind($procedure, "@outVar2", &$outVar2, SQLVARCHAR, true, false, 36);
看看是否有所作为。
另请注意显式&通过引用传递输出变量,但我不知道它是否仍然需要。
答案 3 :(得分:0)
我怀疑这会导致您的问题,但为什么使用DISTINCT
?
这只是一个代码 - 只要你看到它,就意味着有可能返回正在使用DISTINCT“处理”的重复项,以及为什么要返回重复项可能需要查看。
答案 4 :(得分:0)
不确定您运行的是哪个版本的PHP,但我认为在某些较旧版本的PHP中,您需要通过引用传递变量以获取值再次出现:
所以你需要把&调用函数时变量前的字符:
mssql_bind($procedure, "@outVar1", &$outVar1, SQLVARCHAR, true);
mssql_bind($procedure, "@outVar2", &$outVar2, SQLVARCHAR, true);
同样根据this link,某些版本的输出参数存在问题
答案 5 :(得分:0)
嗯。一些评论
1)“mssql_execute($ procedure,$ conn);”错误的是第二个参数不是连接。
2)如果你得到“存储过程执行失败”,那么我必须在freetds.conf中创建一个数据库主机并引用它。
那时,我没有得到错误,但我也没有得到输出参数。这是RHEL5上的PHP 5.1。
如果我启用freeTDS日志记录,我会看到数据返回到返回数据包中。此时,我不知道为什么它也不起作用(除了PHP的SQL服务器支持有点缺乏!)
答案 6 :(得分:0)
我遇到了同样的问题。
假设您使用FreeTDS驱动程序与SQL Server进行通信,则驱动程序的工作方式存在已知问题。它在FAQ
中突出显示<强> http://www.freetds.org/faq.html#ms.output.parameters 强>
常见问题解答中建议的API文档在这里,但我找不到使用PHP访问它的方法:
http://www.freetds.org/reference/a00276.html
我仍然无法解决这个问题,而且我正处在一起放弃输出参数。
答案 7 :(得分:0)
我通过Adodb Library以非常简单的方式做到了这一点......
$ addProduct = $ obj-&gt; ExecuteQuery(“Begin; DECLARE @ProductCode as varchar(100); EXEC CREATEPRODUCT'$ pname','$ price',@ ProductCode OUTPUT,'$ merchantId'; select @ProductCode;端;“);
$ productCode = $ addProduct [0] [0];
有关更多说明,您可以访问此网站.. http://developer99.blogspot.com/2011/07/calling-ms-sql-sp-from-php.html