【问题标题】:CodeIgniter multiple results from stored procedureCodeIgniter 存储过程的多个结果
【发布时间】:2013-08-02 18:26:38
【问题描述】:

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

谢谢!

【问题讨论】:

  • 看起来不错,你是用mysql还是mysqli做db驱动?
  • 嗨,skrilled,我正在使用 mysqli
  • 感谢大家的帮助,通过 Ellislab 上的线程让我了解了 CodeIgniter 的 DB 类。非常感谢。
  • 奥斯卡你应该从你的问题中删除答案并将其写为答案,然后接受它。

标签: php mysql codeigniter


【解决方案1】:

只需调用下面编写的方法并获取查询结果的数组(列表),例如 $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;
}

【讨论】:

  • 是的,这是一个非常好的解决方案
【解决方案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;
    }   
}

【讨论】:

    【解决方案3】:

    更新

    根据 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);
    }
    
    • 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;
    }
    

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

    谢谢!

    【讨论】:

    • 您不应该编辑核心文件,因为每次 CI 更新您都会错过更改。我的建议是使用application/core 文件夹扩展核心文件。也就是说,只是一个建议!
    • @manix 你有时间发表你的建议作为答案吗?我真的很想看。
    • 好吧,今晚我可以创建和示例。明天晚上记得我。
    猜你喜欢
    • 2011-07-14
    • 2014-05-25
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2017-11-08
    相关资源
    最近更新 更多