好的,不太确定我做错了什么,但是我在使用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页面正确加载,并且不会显示有关未运行的存储过程的任何错误消息。
答案 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,
));