CodeIgniter存储过程的多个结果

Osc*_*ero 5 php mysql codeigniter

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

CREATE PROCEDURE get_multiple_results()
BEGIN
  SELECT 'A' AS A;
  SELECT 'B' AS B;
  SELECT 'C' AS C;
END
Run Code Online (Sandbox Code Playgroud)

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

$this->db->query('CALL get_multiple_results()')->result_array();
Run Code Online (Sandbox Code Playgroud)

谢谢!

Pan*_*arg 5

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


Osc*_*ero 2

更新

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

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

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

在文件末尾添加函数 multi_results。

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

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

谢谢!