CodeIgniter存储过程的多个结果

时间:2013-08-01 17:27:54

标签: php mysql codeigniter

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

谢谢!

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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);
}
  • 系统/ DATABSE /驱动器/ 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;
}

如果我遗漏某些东西或某些东西是坏的,请纠正我。

谢谢!

答案 2 :(得分:2)

我希望您使用的是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;
    }   
}