1

我在使用 SQL Server 2005 中的 PHP 和存储过程时遇到问题。我之前没有真正接触过存储过程,也没有将它们与 php 一起使用。我无法从我知道肯定存在的表中检索值。我有一个简单的登录表,我希望存储过程将用户名作为输入,然后输出该用户的密码 salt。我希望存储过程使用参数化值来避免 SQL 注入。目前发生的情况是当 php 页面运行时,没有返回任何内容,并且 SQL Profiler 显示以下错误:

User Error Message: Incorrect Syntax near '@Username'.

虽然此错误消息应该告诉我出了点问题,但我终生无法看到不正确的语法在哪里。

PHP 副本:

$user = "usercm";
$password ="cmuserpassword";
try{$conn = new PDO("odbc:DRIVER={SQL Server Native Client 10.0};SERVER=TestingServer;DATABASE=TestingDatebase;",$user,$password);}
catch(PDOException $e){echo "oh no";}

$username = "sdct";

$prepusp = $conn->prepare("EXEC uspReturnSalt(?,?)");
$prepusp->bindParam(1, $username, PDO::PARAM_STR);
$prepusp->bindParam(2, $usersalt, PDO::PARAM_STR, 450);
$prepusp->execute();

存储过程的副本:

ALTER PROCEDURE [dbo].[uspReturnSalt]
    @Username NVARCHAR(100),
    @Usersalt NVARCHAR(450) OUTPUT
AS
BEGIN
    DECLARE @sqlcmd NVARCHAR(MAX);
    DECLARE @params NVARCHAR(MAX);
    SET @sqlcmd = N'SELECT @Usersaltone = salt FROM CMUsers WHERE username = @Usernameone';
    SET @params = N'@Usernameone NVARCHAR(100), @Usersaltone NVARCHAR(450) OUTPUT';
    EXECUTE sp_executesql @sqlcmd, @params, @Usernameone = @Username, @Usersaltone = @Usersalt OUTPUT;
END

澄清一下,这台服务器运行 Windows 2003,所以我不能使用 sqlsrv 驱动程序,因为它们需要不兼容的 SQL Server Native Client 2012。无法升级操作系统(服务器不是我的),所以我不能使用任何需要 SQL Server Native Client 2012 的 php 驱动程序。

如果有人可以提供帮助,我将永远感激不尽。

编辑1:

这是该错误之前和之后的 sql 探查器消息:

RPC:Completed      |    exec [sys].sp_sproc_columns_90 N'uspReturnSalt' ,@ODBCVer=3

RPC:Starting       |    declare @p1 int
                      set @p1 =NULL
                      exec sp_prepare @p1 output,N'@Username nvarchar(100),@P2 text OUTPUT' ,N'EXEC uspReturnSalt(@Username,@P2 OUTPUT)' ,1
                      select @p1

Exception          |    Error: 102, Severity: 15, State: 1

User Error Message |    Incorrect syntax near '@Username'.

SP:CacheMiss       |    (@Username nvarchar(100),@P2 text OUTPUT)EXEC uspReturnSalt(@Username,@P2 OUTPUT)

Exception          |    Error: 8180, Severity: 16, State: 1

User Error Message |    Statement(s) could not be prepared

RPC:Completed      |    declare @p1 int
                        set @p1=NULL
                        exec sp_prepare @p1 output, N'@Username nvarchar(100),@P2 text OUTPUT' ,N'EXEC uspReturnSalt(@Username,@P2 OUTPUT)',1
                        select @p1
4

3 回答 3

1

$prepusp = $conn->prepare("执行 uspReturnSalt(?,?)"); 需要改成:$prepusp = $conn->prepare("{CALL uspReturnSalt(?,?)}");

它们实际上都应该工作。甚至 EXEC 语句周围的 {} 也不起作用。只有 CALL 有效。

于 2013-11-11T13:35:27.210 回答
-1

改变这些行怎么样

$prepusp = $conn->prepare("EXEC uspReturnSalt(?,?)");
$prepusp->bindParam(1, $username, PDO::PARAM_STR);
$prepusp->bindParam(2, $usersalt, PDO::PARAM_STR, 450);
$prepusp->execute();

$prepusp = $conn->prepare("EXEC uspReturnSalt(:username,:usersalt)");
$prepusp->bindParam(":username", $username, PDO::PARAM_STR);
$prepusp->bindParam(":usersalt", $usersalt, PDO::PARAM_STR, 450);
$prepusp->execute();

然后尝试

于 2013-11-08T16:50:41.073 回答
-1

远射但值得一试,尝试改变

ALTER PROCEDURE [dbo].[uspReturnSalt]
    @Username NVARCHAR(100),
    @Usersalt NVARCHAR(450) OUTPUT
AS

ALTER PROCEDURE [dbo].[uspReturnSalt]
(
    @Username NVARCHAR(100),
    @Usersalt NVARCHAR(450) OUTPUT
)
AS
于 2013-11-11T11:21:47.560 回答