首页 > 解决方案 > 使用 PDO/PHP 从一个存储过程中获取 2 个不同的结果

问题描述

使用 SQL Server 数据库构建 Symfony 4 API,我遇到了一个问题:我必须从一个存储过程中获取两个不同的结果。

第一个结果是一个数据数组,第二个结果只是一个 int 值。

我正在编写后端分页,这就是为什么我需要获取数据以及表中的总行数。

这是我的存储过程:

ALTER PROCEDURE [SP IDENTIFIER] 

    (
        @Limit INT,
        @Offset INT

    )
AS
BEGIN

    SET NOCOUNT ON; 

    SELECT 
        COUNT(*) AS 'TOTAL'
    FROM DataBaseName

SELECT Field1, Field2, Field3
FROM DataBaseName
ORDER BY Field1 DESC
OFFSET @Offset ROWS
FETCH NEXT @Limit ROW ONLY


END

当我测试我的 API 时,它只返回我的第一个请求的结果(行数值)。

这是我的存储库方法:

  public function getDatas($limit, $offset)
  {
    $request = "EXEC SPName ?, ?";
    $answer = $this->_em->getConnection()->prepare($request);
    $answer->bindParam(1, $limit);
    $answer->bindParam(2, $offset);
    $answer->execute(); 


    return $answer->fetchAll();
  }

你知道有什么方法可以让 PDO 返回他从请求中得到的所有结果吗?也许在 fetch 选项中,或者通过某种方式在 $answer 中执行 fetchAll 循环?

谢谢 !

标签: phpsql-serversymfonypdodoctrine-orm

解决方案


MS SQL Server supports stored procedures that can return more than one result set. With PHP and PDO you can retrieve these result sets with PDOStatement::nextRowset() method. It is important to know, that even if you have output parameters in your stored procedure, you need to fetch all result sets to get output values.

You may try with this:

public function getDatas($limit, $offset)
{
    $request = "EXEC SPName ?, ?";
    $answer = $this->_em->getConnection()->prepare($request);
    $answer->bindParam(1, $limit);
    $answer->bindParam(2, $offset);
    $answer->execute(); 

    do {
        // Fetch records with $answer->fetchAll();
    while ($answer->nextRowset());
}

推荐阅读