PHP: количество параметров и количество аргументов не совпадают - PullRequest
0 голосов
/ 30 июня 2011

Мое php-приложение использует драйвер MS SQLSrv.При выполнении вызова хранимой процедуры в моей базе данных после запуска sqlsrv_execute () я получаю следующую ошибку: количество параметров и количество аргументов не совпадают .Мой код выглядит следующим образом:

    $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 и Microsoft.Кто-нибудь еще сталкивался с подобной ошибкой?Любая помощь приветствуется.

И да, я проверил количество параметров, моя хранимая процедура принимает 6 параметров.

ОБНОВЛЕНИЕ:

Фрагмент хранимой процедуры:

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

1 Ответ

1 голос
/ 24 сентября 2011

Вы используете SQLSRV_EXECUTE неправильно. Ошибка, которую вы получаете, на самом деле является ошибкой PHP, которая говорит вам, что вы передаете неправильные параметры SQLSRV_EXECUTE.

Определяется как: sqlsrv_execute (ресурс $ 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 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...