【发布时间】: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()中的详细信息……恐怕在这里没有多大帮助;从我可以看到你的代码它应该工作:|
标签: php stored-procedures pdo