2013-08-01 4 views
4

я одна хранимая процедура на MySQL, например:CodeIgniter несколько результатов из хранимой процедуры

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

Спасибо!

+0

, который выглядит правильно, вы используете MySQL или MySQLi для драйвера БД? – skrilled

+0

Привет, Skrilled, я использую mysqli –

+0

Документ: http: //ellislab.com/forums/viewthread/73714/ – Bora

ответ

2

UPDATE

решить мою проблему в соответствии с Руководством PHP http://php.net/manual/en/mysqli.multi-query.php

И, Модифицированные следующие файлы:

  • системы/базы данных/драйверы/DB_result.PHP

Добавить функцию multi_results at th конец файла.

public function multi_results() { return array(); } 
  • системы/базы данных/драйвера/DB_driver.php

Добавить функцию multi_query() после того, как функции simple_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_multi_query() после того, как функции _execute().

/** 
* 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; 
} 

Если мне что-то не хватает или что-то не так, пожалуйста, поправьте меня.

Спасибо!

+0

Вы не должны редактировать основные файлы, потому что для каждого обновления CI вам будут упущены изменения. Мое предложение состоит в том, чтобы распространять основные файлы, используя папку «application/core». То есть, просто предложение! – manix

+0

Спасибо, manix, я буду иметь в виду и расширять класс. –

+0

@manix у вас есть время, чтобы опубликовать ваше предложение в качестве ответа? Я ДЕЙСТВИТЕЛЬНО люблю это видеть. –

3

просто вызовите метод, указанный ниже, и получите массив (список) ваших результатов запроса, например. $ resultSet = $ this-> GetMultipleQuery ("CALL my_proc ('$ input')");

Строка запроса также может быть конкатенацией нескольких запросов выбора.

 /** 
    * To get result(s) of queries that returns multiple result sets... 
    * 
    * @author Pankaj Garg <[email protected]> 
    * 
    * @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; 
} 
+0

Life saver .... спасибо! –

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; 
    } 
} 
Смежные вопросы