2011-10-21 108 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,你需要他們登錄到一個表從存儲過程。看看我最近的編輯如何。 –