2011-06-29 57 views
0

我的php應用程序正在使用MS SQLSrv驅動程序。在對數據庫中的存儲過程進行調用時,在運行sqlsrv_execute()後出現以下錯誤:參數計數和參數計數不匹配。我的代碼如下:PHP:參數計數和參數計數不匹配

$sql = "{call myStoredProcedure(?, ?, ?, ?, ?, ?)}"; 

    //Passing by reference instead of value, otherwise sqlsrv_prepare is not happy 
    $params = array(array(&$param1, SQLSRV_PARAM_IN), 
        array(&$param2, SQLSRV_PARAM_IN), 
        array(&$param3, SQLSRV_PARAM_IN), 
        array(&$param4, SQLSRV_PARAM_IN), 
        array(&$param5, SQLSRV_PARAM_IN), 
        array(&$param6, SQLSRV_PARAM_OUT) 
        ); 

    /* Create the statement. */ 
    $stmt = sqlsrv_prepare($conn, $sql, $params); 
    if($stmt) 
    { 
     echo "Statement prepared.\n"; 
    } 
    else 
    { 
     echo "Error in preparing statement.\n"; 
     die(print_r(sqlsrv_errors(), true)); 
    } 

    //TODO: Resolve error, "param count and argument count don't match" 
    $stmt = sqlsrv_execute($conn, $sql, $params); 

    //This statement will run, but no rows are returned and rowCount is false. 
    //$stmt = sqlsrv_query($conn, $sql, $params); 

    $rowCount = sqlsrv_num_rows($stmt); 
    $numFields = sqlsrv_num_fields($stmt); 

    //Rest of code... 

我已經花了一個小時了,並通過PHP.Net和微軟文檔進行了梳理。有沒有其他人遇到類似的錯誤?任何幫助表示讚賞。

是的,我檢查了我的參數計數,我的存儲過程需要6個參數。

UPDATE:

存儲過程的代碼片段:

ALTER PROCEDURE [dbo].[myStoredProcedure] 
    @param1 VARCHAR(64), 
    @param2 VARCHAR(64), 
    @param3 DATETIME, 
    @param4 DATETIME, 
    @param5 INT = 9, 
    @param6 INT OUTPUT 
AS 
BEGIN 

//Do stuff 

END 
+0

你能發佈一些關於實際存儲過程的信息嗎? – MoarCodePlz

+0

瘋狂的猜測,因爲我遠不是專家,但由於最後一個參數是一個輸出參數,我不明白爲什麼它應該被綁定:存儲過程不會對給定值做任何事情。 –

+0

不幸的是,從我讀過的微軟文檔中,您必須提供所有參數,輸入,輸出和雙向輸入/輸出。 – kingrichard2005

回答

0

您正在使用SQLSRV_EXECUTE incorrectely。你得到的錯誤實際上是一個PHP錯誤,告訴你,你正在傳遞錯誤的參數到SQLSRV_EXECUTE

定義爲: sqlsrv_execute(resource $stmt)
但你在呼喚:sqlsrv_execute($conn, $sql, $params)

我下面固定起來的代碼,假設該存儲過程是正確安裝。讓我知道它是否有效。

$sql = "{call myStoredProcedure(?, ?, ?, ?, ?, ?)}"; 

//Passing by reference instead of value, otherwise sqlsrv_prepare is not happy 
$params = array(array(&$param1, SQLSRV_PARAM_IN), 
       array(&$param2, SQLSRV_PARAM_IN), 
       array(&$param3, SQLSRV_PARAM_IN), 
       array(&$param4, SQLSRV_PARAM_IN), 
       array(&$param5, SQLSRV_PARAM_IN), 
       array(&$param6, SQLSRV_PARAM_OUT) 
       ); 

/* Create the statement. */ 
$stmt = sqlsrv_prepare($conn, $sql, $params); 
if($stmt) 
{ 
    echo "Statement prepared.\n"; 
} 
else 
{ 
    echo "Error in preparing statement.\n"; 
    die(print_r(sqlsrv_errors(), true)); 
} 

//Shouldn't assign this to $stmt, $stmt can be reused for multiple sqlsrv_execute() calls 
$result = sqlsrv_execute($stmt); 

if($result === false) 
{ 
    //Error handling 
} 
else 
{ 
    $rowCount = sqlsrv_num_rows($result); 
    $numFields = sqlsrv_num_fields($result); 
} 
+0

另請注意,更改「$ result = sqlsrv_execute($ stmt);」這裏準備/執行策略的一部分內容是,您可以更改上面分配的變量,然後再次執行以獲得新結果。 – Chris