首页 > 解决方案 > sqlsrv_execute 返回游标我无法从我的方法返回

问题描述

我们最近将 PHP 版本从 5 升级到了 7,因此我不得不更改用于访问我们的 MS SQL 数据库的类。

我开始使用 sqlsrv 并且我在一个类中有一个方法来执行存储过程,它几乎可以做到这一点

    <?php
    $stmt = sqlsrv_prepare($db, $sql, $procedure_params);
    if (!sqlsrv_execute($stmt)) { 
          if( ($errors = sqlsrv_errors() ) != null)  
          {  
             foreach( $errors as $error)  
             {  
                echo "SQLSTATE: ".$error[ 'SQLSTATE']."\n";  
                echo "code: ".$error[ 'code']."\n";  
                echo "message: ".$error[ 'message']."\n";  
                die();
             }  
          }  
    }
    // (1) This works, I get all the rows with data, etc... 
    while($row = sqlsrv_fetch_array($stmt)){
        print_r($row);
    }
    // (2) Returning the cursos won't work, I cannot fetch it when I return it as a result
    return $stmt;
    ?>

执行存储过程后,我会得到结果,并且可以毫无问题地获取它 (1)。但是,如果我作为我的方法/函数的结果返回光标,当我因为调用该方法而得到光标时,我无法获取它,就像它是空的一样。(2)

有任何想法吗?如果这是一个愚蠢的问题,我很抱歉,但我一直在谷歌搜索这个问题,我看不到任何谈论类似问题的帖子。

谢谢!

标签: sql-serverstored-proceduresphp-7sqlsrv

解决方案


首先,为什么要返回 SQL 资源?如果您这样做,您将很难关闭连接,因为您需要执行sqlsrv_free_stmt( $stmt); 在您要传回的函数中。

其次,我不是 PHP 专家,但我相信您使用的是sqlsrv_execute,它主要用于带有插入、更新和删除等参数的一次性执行。如果要返回包含行的游标,则需要使用sqlsrv_query


推荐阅读