CodeIgniter存储过程中的多个结果


CodeIgniter multiple results from stored procedure

我在MySQL上有一个存储过程,例如:

CREATE PROCEDURE get_multiple_results()
BEGIN
  SELECT 'A' AS A;
  SELECT 'B' AS B;
  SELECT 'C' AS C;
END

那么,如何使用CodeIgniter的查询方法来获取数据呢?

$this->db->query('CALL get_multiple_results()')->result_array();

谢谢!

只需调用下面写的方法,即可获得查询结果的数组(列表),例如。$resultSet=$this->GetMultipleQuery("CALL my_proc('$input')");

查询字符串也可以是多个选择查询的串联。

     /**
     * To get result(s) of queries that returns multiple result sets...
     *
     * @author Pankaj Garg <garg.pankaj15@gmail.com>
     *
     * @param string $queryString
     *
     * @return bool|array List of result arrays
     */
public function GetMultipleQueryResult($queryString)
{
    if (empty($queryString)) {
                return false;
            }
    $index     = 0;
    $ResultSet = array();
    /* execute multi query */
    if (mysqli_multi_query($this->db->conn_id, $queryString)) {
        do {
            if (false != $result = mysqli_store_result($this->db->conn_id)) {
                $rowID = 0;
                while ($row = $result->fetch_assoc()) {
                    $ResultSet[$index][$rowID] = $row;
                    $rowID++;
                }
            }
            $index++;
        } while (mysqli_next_result($this->db->conn_id));
    }
    return $ResultSet;
}

我希望您使用的是sqlsrv驱动程序。

在这种情况下,包括下面提供的库。

$this->load->library('sqldb');

并运行查询

$this->sqldb->query($querystring);
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 

/**
 * CodeIgniter sqldb Class
 *
 * This library will help get multiple resultsets from SQL stored procedure
 * @author       Saamit Raut
 */
class Sqldb {
    function __construct() {
        //$CI->load->database();
        //$this->load->library('database');
        $this->CI =& get_instance();
        $this->CI->load->database();
    }
    public function query($querystring){
        $query=sqlsrv_query($this->CI->db->conn_id,$querystring);//exit;
        $resultsets=array();
        do{
                $array=array();
                while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
                    $array[]=$row;
                }
                $resultsets[]=$array;
        }while(sqlsrv_next_result($query));
        return $resultsets;
    }   
}

更新

根据PHP手册解决了我的问题http://php.net/manual/en/mysqli.multi-query.php

并且,修改了下一个文件:

  • 系统/数据库/驱动程序/DB_result.PHP

在文件末尾添加函数multi_results。

public function multi_results() { return array(); }
  • system/database/drivers/DB_driver.php

在simple_query()函数之后添加函数multi_query。

function multi_query($sql, $binds = FALSE)
{
    if ( ! $this->conn_id)
    {
        $this->initialize();
    }
    $sql = $this->compile_binds($sql, $binds);
    return $this->_execute_multi_query($sql);
}
  • system/databse/drivers/mysqli_driver.php

在_execute()函数之后添加函数_execute_multi_query()。

/**
 * Execute multi query
 *
 * @access private called by the base class
 * @param  string an SQL query
 * @return resource
 */
function _execute_multi_query($sql)
{
    $sql         = $this->_prep_query($sql);
    $result_sets = array();
    $k           = 0;
    mysqli_multi_query($this->conn_id, $sql);
    do
    {
        $result = mysqli_store_result($this->conn_id);
        if($result)
        {
            $l = 0;
            while($row = mysqli_fetch_assoc($result))
            {
                $result_sets[$k][$l] = $row;
                $l++;
            }
            $k++;
            mysqli_free_result($result);
        }
    }
    while(mysqli_next_result($this->conn_id));
    return $result_sets;
}

如果我遗漏了什么或什么不好,请纠正我。

谢谢!