PDO存储过程调用

时间:2014-05-19 13:36:40

标签: php stored-procedures pdo

好的,不太确定我做错了什么,但是我在使用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

我知道数据库连接可以正常工作,因为select查询会返回正确的答案。

我的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页面正确加载,并且不会显示有关未运行的存储过程的任何错误消息。

1 个答案:

答案 0 :(得分:4)

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

您可以尝试绑定而不指定类型,并将其留给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,     
             ));