PHP PDO (MSSQL) 无法获取输出参数
PHP PDO (MSSQL) can not get OUPUT parameters
我正在尝试使用 bindParam (PHP PDO) 获取输出。 PHP PDO 库是 FreeTDS for MS SQL 驱动程序。无论我做什么,我似乎都无法按照 php.net 上的建议在绑定参数中获取 "OUTPUT"。我已经验证我可以调用 EXEC 和 return 结果集(使用 select),但 OUTPUT 参数永远不会改变。
PHP代码。 $this->db 是一个 PDO 对象
$stmt = $this->db->prepare("EXEC ".$this->db_schema."[".$this->procedure."] :error_num, :error_msg");
$error_num = 0;
$error_msg = '';
$stmt->bindParam(':error_num', $error_num, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(':error_msg', $error_msg, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 2000);
$stmt->execute();
var_dump($stmt);
echo "\nerror_num: $error_num";
echo "\nerror_msg: $error_msg\n\n";
测试输出的存储过程
USE [NGCustom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [web].[addTest] (
@error_num int OUTPUT,
@error_msg VARCHAR(MAX) OUTPUT
)
AS
BEGIN
SET @error_num = 99
SET @error_msg = 'Error! Oh my gosh!'
END
GO
来自PHP的输出:
object(PDOStatement)#77 (1) {
["queryString"]=>
string(54) "EXEC [NGCustom].[web].[addTest] :error_num, :error_msg"
}
error_num: 0
error_msg:
您的存储过程正在分配参数,但没有返回它们。
BEGIN
SET @error_num = 99
SET @error_msg = 'Error! Oh my gosh!'
SELECT @error_num, @error_msg; --add this line
END
GO
据我所知,FreeTDS 驱动程序不支持输出参数。我记得我的团队在做评估的时候。
这就是它不起作用的原因:
http://www.freetds.org/faq.html#ms.output.parameters
编辑:这是来自 pyodbc 的参考(它也在 FreeTDS 上运行),所以同样适用:https://code.google.com/p/pyodbc/wiki/StoredProcedures
引用:"Results: Since we can't use output parameters at this point, you'll need to return results in a result set. Usually this means just ending your stored procedure with a SELECT statement."
您需要使用 SELECT。
我正在尝试使用 bindParam (PHP PDO) 获取输出。 PHP PDO 库是 FreeTDS for MS SQL 驱动程序。无论我做什么,我似乎都无法按照 php.net 上的建议在绑定参数中获取 "OUTPUT"。我已经验证我可以调用 EXEC 和 return 结果集(使用 select),但 OUTPUT 参数永远不会改变。
PHP代码。 $this->db 是一个 PDO 对象
$stmt = $this->db->prepare("EXEC ".$this->db_schema."[".$this->procedure."] :error_num, :error_msg");
$error_num = 0;
$error_msg = '';
$stmt->bindParam(':error_num', $error_num, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->bindParam(':error_msg', $error_msg, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 2000);
$stmt->execute();
var_dump($stmt);
echo "\nerror_num: $error_num";
echo "\nerror_msg: $error_msg\n\n";
测试输出的存储过程
USE [NGCustom]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [web].[addTest] (
@error_num int OUTPUT,
@error_msg VARCHAR(MAX) OUTPUT
)
AS
BEGIN
SET @error_num = 99
SET @error_msg = 'Error! Oh my gosh!'
END
GO
来自PHP的输出:
object(PDOStatement)#77 (1) {
["queryString"]=>
string(54) "EXEC [NGCustom].[web].[addTest] :error_num, :error_msg"
}
error_num: 0
error_msg:
您的存储过程正在分配参数,但没有返回它们。
BEGIN
SET @error_num = 99
SET @error_msg = 'Error! Oh my gosh!'
SELECT @error_num, @error_msg; --add this line
END
GO
据我所知,FreeTDS 驱动程序不支持输出参数。我记得我的团队在做评估的时候。
这就是它不起作用的原因: http://www.freetds.org/faq.html#ms.output.parameters
编辑:这是来自 pyodbc 的参考(它也在 FreeTDS 上运行),所以同样适用:https://code.google.com/p/pyodbc/wiki/StoredProcedures
引用:"Results: Since we can't use output parameters at this point, you'll need to return results in a result set. Usually this means just ending your stored procedure with a SELECT statement."
您需要使用 SELECT。