2012-01-28 49 views
3

我這個工作代碼CI:試圖「叫」存儲過程使用CodeIgniter

$this->db->query("call nameOfProcedure('param1', @param2)"); 
$query = $this->db->query('SELECT @param2 as results'); 
$row = $query->row(); 

它的工作原理,但如果我嘗試使用:

$this->db->call_function('nameOfProcedure', 'param1', '@param2'); 

我得到的錯誤:

This feature is not available for the database you are using.

究竟是什麼錯誤?

感謝

回答

4

檢查出call_functiondocs。它用於調用不是CI的數據庫驅動程序本機的函數,也不用於調用您編寫的過程。

你可以在CI 2.1.0上查看/system/database/DB_driver.php Ln 998中的call_function代碼,以清楚地看到它在做什麼。

+0

不確定爲什麼你沒有選擇正確的答案。該文檔清楚地說明它是用於調用** PHP **數據庫函數。它沒有提到存儲過程。 – MikeMurko 2012-02-29 22:37:04

4

以防萬一它幫助任何人。我使用這個庫來處理CI中的存儲過程,它也支持多個結果集。

這裏是代碼

我把它叫做Mydb.php

<?php #if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Mydb 
{ 
    private $CI, $Data, $mysqli, $ResultSet; 

    /** 
    * The constructor 
    */ 

    function __construct() 
    { 
    $this->CI =& get_instance(); 
    $this->Data = ''; 
    $this->ResultSet = array(); 
    $this->mysqli = $this->CI->db->conn_id; 
    } 

    public function GetMultiResults($SqlCommand) 
    { 
    /* execute multi query */ 
    if (mysqli_multi_query($this->mysqli, $SqlCommand)) { 
     $i=0; 
     do 
     { 

      if ($result = $this->mysqli->store_result()) 
      { 
       while ($row = $result->fetch_assoc()) 
       { 
        $this->Data[$i][] = $row; 
       } 
       mysqli_free_result($result); 
      } 
      $i++; 
     } 
     while ($this->mysqli->next_result()); 
    } 
    return $this->Data; 

    } 
} 
?> 

調用它像這樣從控制器

$this->load->library('mydb'); 
$arr = $this->mydb->GetMultiResults("CALL GetReferrals()"); 

此外,請務必設置mysqli司機 在application/config/database.php

$db['default']['dbdriver'] = 'mysqli'; 
+0

庫僅支持返回多個結果集,並且如果某個過程只返回一個結果ret,則會拋出錯誤。爲了還支持返回一個結果返回,必須改變行「while($ this-> mysqli-> next_result());」到「while($ this-> mysqli-> more_results()&& $ this-> mysqli-> next_result());」。 – Stony 2015-11-06 21:36:35

+0

@Stony它是一個do-while循環,你測試它不工作嗎? – Junaid 2015-11-17 13:02:27