【问题标题】:PHP PDO (MSSQL) can not get OUPUT parametersPHP PDO (MSSQL) 无法获取 OUTPUT 参数
【发布时间】:2016-02-10 14:36:24
【问题描述】:

我正在尝试使用 bindParam (PHP PDO) 获取 OUTPUT。 PHP PDO 库是用于 MS SQL 驱动程序的 FreeTDS。无论我做什么,我似乎都无法按照 php.net 上的建议在绑定参数中获得“输出”。我已经验证我可以调用 EXEC 并返回一个结果集(使用选择),但 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: 

【问题讨论】:

    标签: php sql-server pdo freetds


    【解决方案1】:

    AFAIK,FreeTDS 驱动程序不支持 OUTPUT 参数。我记得我的团队进行评估时的情况。

    这就是它不起作用的原因: http://www.freetds.org/faq.html#ms.output.parameters

    编辑:这是来自 pyodbc 的参考(它也在 FreeTDS 上运行),所以同样适用:https://code.google.com/p/pyodbc/wiki/StoredProcedures

    引用:“结果:由于此时我们不能使用输出参数,因此您需要在结果集中返回结果。通常这意味着只需使用 SELECT 语句结束您的存储过程。”

    您需要改用 SELECT。

    【讨论】:

      【解决方案2】:

      您的存储过程正在分配参数,但没有返回它们。

      BEGIN 
       SET @error_num = 99
       SET @error_msg = 'Error! Oh my gosh!'
       SELECT @error_num, @error_msg;  --add this line
      END
      GO
      

      【讨论】:

      • 该选择将产生一个我可以获取的结果集,但它似乎并没有改变绑定参数的值。
      猜你喜欢
      • 2011-09-19
      • 2021-04-03
      • 1970-01-01
      • 2011-07-26
      • 2015-09-23
      • 2019-01-11
      • 2013-12-27
      • 2012-03-31
      • 1970-01-01
      相关资源
      最近更新 更多