PDO 存储过程调用

Posted

技术标签:

【中文标题】PDO 存储过程调用【英文标题】:PDO stored procedure call 【发布时间】:2014-07-07 12:04:40 【问题描述】:

好的,不太确定我做错了什么,但我在使用 PDO 运行存储过程时遇到了问题。该过程看起来有点像这样,并且可以作为独立的完美运行。

CREATE PROCEDURE [dbo].[user_UserAdd]
            @FirstName      nvarchar(100),
            @Surname        nvarchar(100),
            @EMail          nvarchar(200),
            @Password       nvarchar(16)
AS
BEGIN

DECLARE @UserId     uniqueidentifier
SET     @UserId = NEWID()

INSERT INTO user_Data
VALUES  (@UserId,
         @FirstName,
         @Surname,
         @EMail,
         @Password)

END

我知道数据库连接工作正常,因为选择查询返回了正确的答案。

我的 php 文件包含以下内容:-

$stpro = $conn->prepare('EXECUTE user_UserAdd ?, ?, ?, ?');
$stpro->bindParam(1, $firstname, PDO::PARAM_STR, 100);
$stpro->bindParam(2, $surname, PDO::PARAM_STR, 100);
$stpro->bindParam(3, $email, PDO::PARAM_LOB, 200);
$stpro->bindParam(4, $password, PDO::PARAM_STR, 16);

// call the stored procedure
$returnvalue = $stpro->execute();

if (!$returnvalue)

    return $stpro->errorInfo();

这总是返回相同的错误信息

 ["2"] = "An invalid PHP type was specified as an output parameter. 
 DateTime objects, NULL values, and streams cannot be specified as output parameters."

我已将 EXECUTE 更改为 EXEC 并更改为 CALL 并得到相同的消息。在检查数据库时,它肯定没有插入新的数据行,但同时 php 页面正确加载,并且没有踢出任何关于存储过程未运行的错误消息。

【问题讨论】:

也许是一个愚蠢的问题,但是您是否尝试过使用bindValue 而不是bindParam 我可能一眼就看错了,但看起来您的存储过程实际上并没有返回任何内容 - 因此将返回最后一个查询的结果......但这是一个 INSERT 查询,所以你的“输出参数”为NULL? @hakre,我有,只是返回错误 ["2"] = "[Microsoft][SQL Server Native Client 11.0]COUNT 字段不正确或语法错误" @CD001 我尝试在末尾添加“Return 1”,这没有什么区别。我不愿意这样做,因为所有存储过程都已编写并在 asp.net 中完美运行。将整个站点更改为 PHP 就足够了。大声笑 我不得不承认,这有点太远了——我对 MS SQL Server 程序不太熟悉……令人讨厌的是,我设法用 mysql 和它拼凑出完全相同的东西工作正常。如果 INSERT 成功,则过程中的 INSERT 只会返回 (bool) true。如果我故意通过输入一个不存在的列来破坏过程中的查询,我只会得到(bool) false 以及$stpro->errorInfo() 中的详细信息……恐怕在这里没有多大帮助;从我可以看到你的代码它应该工作:| 【参考方案1】:

听起来像是绑定错误,虽然代码看起来是正确的。

您可以在不指定类型的情况下尝试绑定并将其留给 PDO:

$query = "EXECUTE user_UserAdd :firstname, :surname, :email, :password";
$stpro = $conn->prepare($query);
$stpro->bindParam(':firstname', $firstname);
$stpro->bindParam(':surname', $surname);
$stpro->bindParam(':email', $email);
$stpro->bindParam(':password', $password);

// call the stored procedure
$returnvalue = $stpro->execute();

或者根本不绑定,看看是否有效:

$query = "EXECUTE user_UserAdd :firstname, :surname, :email, :password";
$stpro = $conn->prepare($query);

// call the stored procedure
$returnvalue = $stpro->execute(array(
                                    ':firstname'=> $firstname,
                                    ':surname'=> $surname,
                                    ':email'=> $email,
                                    ':password'=> $password,     
             ));

【讨论】:

致标记此内容的人....为什么?这实际上有效。一旦我也输入了类型,它就起作用了。疯狂和烦人为什么它不起作用,但是@meda,非常感谢你。

以上是关于PDO 存储过程调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 php PDO 调用多个存储过程

从 PHP PDO 调用 SQL 存储过程

使用 PHP PDO 调用 MySQL 存储过程 [重复]

php pdo调用SQLServer存储过程无法获取返回结果

使用 PDO 从 PHP 调用存储过程到使用 INPUT 参数的 MYSQL Server

PHP PDO:存储过程返回空结果