6

我在 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();

谢谢!

4

3 回答 3

4

只需调用下面编写的方法并获取查询结果的数组(列表),例如 $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;
}
于 2014-04-10T08:43:22.700 回答
4

我希望您使用的是 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;
    }   
}
于 2017-07-27T11:53:04.807 回答
2

更新

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

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

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

在文件末尾添加函数 multi_results。

public function multi_results() { return array(); }
  • 系统/数据库/驱动程序/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);
}
  • 系统/数据库/驱动程序/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;
}

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

谢谢!

于 2013-10-21T17:11:14.757 回答