存储过程在MSQL Studio中运行良好,但现在在PHP中运行良好

存储过程在MSQL Studio中运行良好,但现在在PHP中运行良好,php,sql,sql-server,sqlsrv,Php,Sql,Sql Server,Sqlsrv,当我从移动应用程序或web浏览器调用SQL存储过程时,该过程返回NULL,但当使用SQLPro for MSSQL软件调用时,该过程返回必须返回的值 if( $conn == FALSE ) { echo "Connection failed."; die( print_r( sqlsrv_errors(), true)); } $query = "EXEC dbo.sp_Pok_Details @oe=17,@code='590776

当我从移动应用程序或web浏览器调用SQL存储过程时,该过程返回NULL,但当使用SQLPro for MSSQL软件调用时,该过程返回必须返回的值

    if( $conn == FALSE ) {
        echo "Connection failed.";
        die( print_r( sqlsrv_errors(), true));
    }


    $query = "EXEC dbo.sp_Pok_Details @oe=17,@code='5907769000409'";

    $getProducts = sqlsrv_query($conn, $query);  


    if ($getProducts == FALSE) 
    {
        die(FormatErrors(sqlsrv_errors()));  
    } 


    while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC))  
    {  
        $returnArray[] = $row;
    }  

    echo json_encode($returnArray);

解释:

您需要将
SET NOCOUNT放在
上作为存储过程的第一行,以防止返回受T-SQL语句影响的行数作为结果集的一部分。这就是导致结果为空的原因

如果无法更改存储过程,请使用
sqlsrv\u next\u result()
激活下一个结果,然后获取数据

请注意,始终使用准备好的语句和参数化查询来防止SQL注入。使用用于SQL Server的PHP驱动程序,函数
sqlsrv_query()
同时执行语句准备和语句执行,并可用于执行参数化查询

示例(基于您的代码)

<?php

    if( $conn === false ) {
        echo "Connection failed.";
        die( print_r( sqlsrv_errors(), true));
    }

    $query = "EXEC dbo.sp_Pok_Details @oe = ?, @code = ?";
    $params = array(17, '5907769000409');
    $getProducts = sqlsrv_query($conn, $query, $params);  
    if ($getProducts === false) {
        die( print_r( sqlsrv_errors(), true));  
    } 

    // Just for test - make additional call(s) to get the count of the active result sets
    do {
       while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) {  
          echo 'Current rowset'.'<br>';
       }  
    } while (sqlsrv_next_result($getProducts));
    // Or if you have only one result set
    //while ($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) {  
    //  $returnArray[] = $row;
    //}

    echo json_encode($returnArray);
?>  


Hey Zhorov,谢谢你的回答,但我仍然从json得到空结果_encode@JohnAron我已经更新了答案,但在大多数情况下,使用
SET NOCOUNT ON
解决了这个问题。请检查结果集的计数。谢谢