Php 使用PDO和SQLSRV从SQL存储过程读取输出值

Php 使用PDO和SQLSRV从SQL存储过程读取输出值,php,sql,sql-server,stored-procedures,pdo,Php,Sql,Sql Server,Stored Procedures,Pdo,我正在尝试使用PHP、PDO和MicrosoftSQLServer2008(SQLSRV)从SQL存储过程中读取输出值,但尽管读了几篇关于此主题的文章,但似乎仍然无法使其正常工作。存储过程本质上检查记录是否已经存在,我希望它根据找到的内容向PHP返回1或0。不过,$retval的值从未从最初的初始化值5更改 PHP: SQL: 您的过程中存在一些潜在的逻辑问题。您将@studentID1定义为varchar(100),但将两个50个字符的变量和一个字符串文字中的两个字符串联起来。这里有很多可以改

我正在尝试使用PHP、PDO和MicrosoftSQLServer2008(SQLSRV)从SQL存储过程中读取输出值,但尽管读了几篇关于此主题的文章,但似乎仍然无法使其正常工作。存储过程本质上检查记录是否已经存在,我希望它根据找到的内容向PHP返回1或0。不过,$retval的值从未从最初的初始化值5更改

PHP:

SQL:


您的过程中存在一些潜在的逻辑问题。您将@studentID1定义为varchar(100),但将两个50个字符的变量和一个字符串文字中的两个字符串联起来。这里有很多可以改进的地方。我不懂php,所以我不能谈论这一部分,但我在您的sql中看不到任何可以阻止retval值被更改的内容。在@StudentId中发现了这一点,谢谢。我自己没有编写存储过程,但我正在尝试执行它并将输出返回到我的php。当我使用输出参数时,我必须首先声明一个命名参数对象,以便在执行存储过程后使用它并获取输出值。我不是PHP爱好者,但您是否尝试过编写$stmt->bindParam(':retval',$retval,…。相反?您的过程中存在一些潜在的逻辑问题。您将@studentID1定义为varchar(100)但是您将两个50个字符的变量和一个字符串文本中的2个字符连接起来。您可以在这里进行一些改进。我不懂php,所以我不能谈论这一部分,但我在sql中没有看到任何可以阻止retval值更改的内容。在@studentID1中发现了这一点,谢谢您的帮助帽子。我没有自己编写存储过程,但我正在尝试执行它并将输出返回到我的php。当我使用输出参数时,我必须首先声明一个命名参数对象,以便在执行存储过程后使用它并获取输出值。我不是php爱好者,但你是否尝试编写$stmt->bindParam(“:retval”、$retval,…..而不是?
// Initialise return value variable as an integer type; this should be changed
// by the returned value from SQL

$retval = 5; 

// call the stored procedure
$stmt = $connPDO->prepare('EXEC dbo.EnrollApplicant :applicantID, :retval ');

$stmt->bindParam(':applicantID', $applicantID, SQLSRV_PARAM_IN);
$stmt->bindValue(':retval', $retval, SQLSRV_PARAM_INOUT);
$stmt->execute();

// Return values to AJAX

echo json_encode(array(
    "RowCount" => $stmt->rowCount(),
    "PDOErrors" => $stmt->errorInfo(),
    "InsertID" => $connPDO->lastInsertID(),
    "applicantID" => $applicantID,
    "retval" => $retval
));
USE [MScPublicDev]
GO

/****** Object:  StoredProcedure [dbo].[EnrollApplicant]    Script Date: 11/19/2015 10:31:10 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER Procedure [dbo].[EnrollApplicant]  @APPID INT, @retval int OUTPUT AS

SELECT @APPID

DECLARE @surname AS nvarchar(50)
DECLARE @forename AS nvarchar(50)
DECLARE @studentID AS nvarchar(25)
DECLARE @studentID1 AS nvarchar(100)

SET @surname = (SELECT upper(Surname) FROM Applicant WHERE ID = @APPID )
SET @forename = (SELECT upper(Forename) FROM Applicant WHERE ID = @APPID )
SET @studentID1 = @surname + ', ' + @forename 

SELECT @studentID1
SET @studentID = (SELECT  dbo.GenerateStudentID (@studentID1))
SELECT @studentID AS StudentID

DECLARE @found AS int

SET @found = (SELECT COUNT(*) FROM Student WHERE Surname = @surname and Forename = @forename)

If @found = 0
BEGIN

-- TSQL to Insert Student record from Applicant record details goes here

SELECT * FROM Student WHERE StudentID = @studentID

END

@retval = @found

GO