【问题标题】:Getting value of SQL Server Output parameter using PDO & ODBC使用 PDO 和 ODBC 获取 SQL Server 输出参数的值
【发布时间】:2012-12-11 20:19:33
【问题描述】:

我一直在通过向我公司的一个网页添加一些功能来学习 PHP,以在将新记录插入数据库之前验证 SSN 的用户输入。那部分工作正常。数据库插入涉及调用 SQL Server 存储过程,该存储过程具有一个输出参数,该参数返回新记录的 GUID 以供后续过程使用。数据库插入部分有效,但是当我回显返回参数的值时,它是一个空字符串。

以下是相关细节: SQL Server 2008 在单独的服务器上运行 在 Windows 64 PC 上运行的 WAMP Server 2.2 PHP 5.3.1 阿帕奇 2.2.22

这是我的 PHP 代码:

$conn = new PDO( "odbc:Driver={SQL Server};Server=xxx.xxx.xx.xx;Database=xxxxx;charset=UTF-8'", "uid", "pwd");

if(!$conn) {
    die( "<br />Error connecting to SQL Server");
}

$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$resource_id = "";

$stmt = $conn->prepare("{CALL xxxx.dbo.app_sp_insert_rq(?, ?, ?, ?, ?, ?, ?, ?)}");

$stmt->bindParam(1, $survey_text, PDO::PARAM_STR);
$stmt->bindParam(2, $event_date, PDO::PARAM_STR);
$stmt->bindParam(3, $type_id, PDO::PARAM_STR);
$stmt->bindParam(4, $description, PDO::PARAM_STR);
$stmt->bindParam(5, $folder_id, PDO::PARAM_STR);
$stmt->bindParam(6, $has_details, PDO::PARAM_STR);
$stmt->bindParam(7, $uid, PDO::PARAM_STR);
$stmt->bindParam(8, $resource_id, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 100); 

$stmt->execute();

echo $resource_id;

这里是存储过程的定义:

CREATE PROCEDURE [dbo].[app_sp_insert_rq]
    @survey_text nvarchar(max),
    @event_date nvarchar(20),
    @type_id nvarchar(100),
    @description nvarchar(100),
    @folder_id nvarchar(100),
    @has_details nchar(1),
    @uid nvarchar(100),
    @resource_id nvarchar(100) output

AS

select @resource_id = NEWID()

insert into
    xxxxx.dbo.app_events (
        resource_id,
        event_date, 
        [type_id], 
        [description], 
        folder_id, 
        has_details, 
        [uid], 
        survey_text
    )
    values (
        @resource_id,
        @event_date, 
        @type_id, 
        @description, 
        @folder_id, 
        @has_details, 
        @uid, 
        @survey_text
    )

任何帮助将不胜感激。我只是通过多次搜索才走到这一步,但这是我无法解决的一个障碍。

【问题讨论】:

    标签: php sql parameters pdo output


    【解决方案1】:

    它应该可以工作 - 根据PDO's documentation。 但是,据说PDO::PARAM_INPUT_OUTPUT 代表INOUT 参数,而您使用的是OUT

    您可以尝试这种方式 - 因为显式设置 $length 参数(同时离开 PDO::PARAM_INPUT_OUTPUT)会触发 OUT 模式;

    $stmt->bindParam(8, $resource_id, PDO::PARAM_STR, 100);
    

    但我认为它应该也可以作为INOUT 工作(就像你最初编写代码一样)。

    也许 C 级别的 PDO 驱动程序(或 ODBC 驱动程序)不支持输出参数绑定(如在 PDO-MySQL 中)。

    但如果这是您的过程中唯一的OUT 参数,您可以使用函数:

    SELECT func(?, ?, ..., ?) AS result
    

    +1:可能你对this comment on php.net感兴趣

    【讨论】:

    • SQL Server不认识输入-输出参数的概念,只有输入或输出,当然PHP也没有只有输出,只有输入-输出,不然我没记错的话, 无参数仅用于输入。正如您所说,它确实应该有效,但是当我完成我正在处理的其他几项任务时,我会尝试您的建议。谢谢!
    • 试过但没用。也许我将不得不编写一个函数。希望使用现有的代码。
    • 我采取了简单的方法并从存储过程中删除了输出参数并添加了这个:选择@resource_id到过程的末尾。现在我可以在 PHP 代码中访问我需要的值了。
    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 2014-02-04
    • 1970-01-01
    • 2021-06-25
    • 2015-11-19
    • 2011-03-28
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多