2

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

以下是相关细节: SQL Server 2008 在单独的服务器上运行 WAMP Server 2.2 在 Windows 64 PC 上运行 PHP 5.3.1 Apache 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
    )

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

4

1 回答 1

1

它应该可以工作 - 根据PDO 的文档。但是,据说它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:也许你对 php.net 上的这条评论感兴趣

于 2012-12-11T20:56:59.167 回答