2011-10-21 50 views
1

我在使用PHP调用它时从我的Sql Server 2008存储过程获取结果集时出现问题。当我在sql中执行存储过程时,我得到结果,所以我知道问题不在于存储过程(如下所示)。 SQL存储过程SQL存储过程/ Php问题

USE [HRAPPS] 
GO 
/****** Object: StoredProcedure [dbo].[sp_GetSecurityAnswer] Script Date: 10/21/2011 08:38:35 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[sp_GetSecurityAnswer] 
(
    @ThisContactId INT, @ThisQuestionId INT, @ThisAnswer varchar(255) 
) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    SELECT 
      a.Cont_id, 
      a.QuestionId 
    FROM dbo.sec_answers a 
    WHERE a.cont_id = @ThisContactId and 
      a.QuestionId = @ThisQuestionId and 
      lower(a.Response) = lower(@ThisAnswer) 

END 

这里是PHP代码调用存储过程。注意:与数据库的连接有效,所以我知道它不是问题。

* PHP代码*

if(!$dbCon=mssql_connect(DBHOST,DBUSER,DBPASS)) 
{ 
    $error = "Unable to Connect to Database. Please Try Again Later."; 
} 
else 
{ 
    $stmt = mssql_init("sp_GetSecurityAnswer", $dbCon); 
    mssql_bind($stmt, "@ThisContactId", $_SESSION['thisContId'], SQLINT4, false, false, 6); 
    mssql_bind($stmt, "@ThisQuestionId", $_SESSION['SecQuestion'], SQLINT4, false, false, 2); 
    mssql_bind($stmt, "@ThisAnswer", $_SESSION['ThisAnswer'], SQLVARCHAR, false, false, 255); 
    $Security_Verification_Result = mssql_execute($stmt, false);  

    IF(!mssql_num_rows($Security_Verification_Result)) 
    { 
    ECHO "You have Incorrectly answered your selected Security Verification Question, Please go back and try again"; 
    EXIT(); 
    } 
    ELSE 
    {   
    header("Location: some_url?userfullname=".$_SESSION['userfullname'] .'&cont_id='.$_SESSION['ThisContId']); 
    } 
} 
exit(); 

PHP代码的结束

所以我缺少什么家伙(和加尔斯呢!)?任何帮助将不胜感激:d 由于事先

+0

你得到了什么输出,你期望什么? – ObscureRobot

+2

小心告诉我们问题是什么?错误消息,意外输出等? – MatBailie

+0

你是否回应出你的'$ _ SESSION ['...']'值,以确保你实际上传递了与你认为相同的值? –

回答

0

代码:

mssql_bind($stmt, "@ThisContactId", $_SESSION['thisContId'], SQLINT4, false, false, 6); 
mssql_bind($stmt, "@ThisQuestionId", $_SESSION['SecQuestion'], SQLINT4, false, false, 2); 
//  scroll right-->>               ^^ 

什么用可选的最大长度参数呢?他们不应该都是-1(最大长度)或只是不通过他们?此可选参数仅对字符串有效,请参见mssql_bind

如果这不起作用,您唯一的其他选项是在PHP中回显参数并将它们记录到过程中的日志表中。通过这种方式,您可以确保您在过程中发送和接收适当的值。

编辑
创造并插入从SQL日志是容易的,这里是如何:

创建一个表:

CREATE TABLE MyLog (LogID int not null identity(1,1) primary key 
        ,LogDate datetime not null default GETDATE() 
        ,LogValue varchar(max) not null 
        ) 

的过程添加此SET NOCOUNT ON;

之后
INSERT INTO MyLog 
    (LogValue) 
    VALUES (ISNULL(OBJECT_NAME(@@PROCID), 'unknown') 
       +', '+ISNULL('"'+CONVERT(varchar(15),@ThisContactId)+'"','NULL') 
       +', '+ISNULL('"'+CONVERT(varchar(15),@ThisQuestionId)+'"','NULL') 
       +', '+ISNULL('"'[email protected]+'"','NULL') 
      ) 

运行您的应用程序后,使用它来看看你在日志中得到什么:

SELECT * FROM MyLog ORDER BY LogID 

这应该让你更好地了解SQL Server在查询中使用的实际参数。

+0

到JRod - 我说get_last_message并返回“更改的数据库上下文为‘HRAPPS’” –

+0

到KM - 我拿出长度参数完全,但wasnt任何帮助...对不起。我会尽量做到如你所说,并将它们记录到表中看到变量的实际值传递,但是有作为存储过程之前呼应他们同样的效果难道不叫?当我回应他们时,他们是正确的。我可以在sql管理工作室中手动使用这些相同的值,并得到结果。 –

+0

@Rick Knierim,你需要他们登录到一个表从存储过程。看看我最近的编辑如何。 –