2011-06-29 54 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