【问题标题】:Stored Procedures work fine in MSQL Studio, but now in PHP存储过程在 MYSQL Studio 中工作正常,但在 PHP 中不行
【发布时间】:2020-03-06 08:57:29
【问题描述】:

当我从移动应用程序或 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);

【问题讨论】:

    标签: php sql sql-server sqlsrv


    【解决方案1】:

    说明:

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

    如果您无法更改存储过程,请使用sqlsrv_next_result() 激活下一个结果,然后获取数据。

    请注意,始终使用准备好的语句和参数化查询来防止 SQL 注入。使用 PHP Driver for SQL Server,函数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);
    ?>  
    

    【讨论】:

    • 嘿 Zhorov,感谢您的回答,但我仍然从 json_encode 得到空结果
    • @JohnAron 我已经更新了答案,但在大多数情况下使用SET NOCOUNT ON 可以解决这个问题。请检查结果集的计数。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多