Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP pdo_odbc SQL Server存储过程意外错误_Php_Sql_Sql Server 2005_Stored Procedures_Pdo - Fatal编程技术网

PHP pdo_odbc SQL Server存储过程意外错误

PHP pdo_odbc SQL Server存储过程意外错误,php,sql,sql-server-2005,stored-procedures,pdo,Php,Sql,Sql Server 2005,Stored Procedures,Pdo,我对PHP和SQLServer2005中的存储过程有问题。 我以前没有真正接触过存储过程,也没有在php中使用它们。我无法从我知道肯定存在的表中检索值。我有一个简单的登录表,我希望存储过程做的是将用户名作为输入,然后输出该用户的密码。我希望存储过程使用参数化的值来避免SQL注入。此时发生的情况是,当php页面运行时,不会返回任何内容,SQL Profiler会显示以下错误: User Error Message: Incorrect Syntax near '@Username'. 虽然这个错

我对PHP和SQLServer2005中的存储过程有问题。 我以前没有真正接触过存储过程,也没有在php中使用它们。我无法从我知道肯定存在的表中检索值。我有一个简单的登录表,我希望存储过程做的是将用户名作为输入,然后输出该用户的密码。我希望存储过程使用参数化的值来避免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本机客户端2012,这是不兼容的。无法升级操作系统(服务器不是我的),因此我不能使用任何需要SQL server Native Client 2012的php驱动程序

如果有人能帮助我,我将永远感激

EDIT1:

以下是该错误前后的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

换几行怎么样

$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

$prepusp=$conn->prepare(“执行uspReturnSalt(?)”; 需要更改为: $prepusp=$conn->prepare({调用uspReturnSalt(?)})


他们两个都应该工作。甚至EXEC语句周围的{}也不起作用。只有调用才能工作。

删除输入和输出参数以及对@Username的declare和set进行硬编码会导致语法错误,而不是“@Username”it's”)。仍然是相同的错误。我感觉PHP中出现了错误。如果在SQL Management Studio中执行存储过程并手动添加值,则该过程运行良好。如果我删除所有输入和输出参数,然后从“EXEC uspreurnsalt()”中删除(),则过程运行时不会出错。
ALTER PROCEDURE [dbo].[uspReturnSalt]
    @Username NVARCHAR(100),
    @Usersalt NVARCHAR(450) OUTPUT
AS
ALTER PROCEDURE [dbo].[uspReturnSalt]
(
    @Username NVARCHAR(100),
    @Usersalt NVARCHAR(450) OUTPUT
)
AS