【问题标题】:sqlsrv_execute returning cursor I cannot return from my methodsqlsrv_execute 返回游标我无法从我的方法返回
【发布时间】:2019-04-04 17:42:44
【问题描述】:

我们最近将 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-server stored-procedures php-7 sqlsrv


    【解决方案1】:

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

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

    【讨论】:

    • 您好,感谢您的回答。我尝试 sqlsrv_query 来执行存储的,但我无法让它工作,认为 sqlsrv_prepare / execute 是要走的路,实际上它有效。想要返回结果时出现了问题。我可以获取光标/将其分配给一个数组并返回它,但是返回光标本身是行不通的。如果我在方法上获取光标然后将其传回并必须再次获取数组,我会做两次相同的事情,这就是为什么我认为最好只返回光标本身。不管怎样,那我再看看 sqlsrv_query..
    猜你喜欢
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多