2011-10-14 37 views
8

Tôi đang sử dụng trình mã hóa mới nhất và cố gắng gọi thủ tục lưu sẵn từ mô hình của mình. Ngoài ra tôi đang sử dụng mysqli làm trình điều khiển cơ sở dữ liệu. Bây giờ tôi có một lỗi khi tôi gọi hai thủ tục được lưu trữ. Sau đây là lỗi:Gọi thủ tục lưu sẵn trong mã vạch

Error Number: 2014

Commands out of sync; you can't run this command now

call uspTest();

Filename: E:\wamp\www\reonomy-dev\system\database\DB_driver.php

Line Number: 330

Lưu ý rằng khi tôi gọi một quy trình được lưu trữ, nó hoạt động tốt. Đây là mã cho mô hình.

class Menus_model extends CI_Model { 

function __construct() 
{ 
    parent::__construct(); 

} 

public function getMenus() 
{ 
    $query = $this->db->query("call uspGetMenus()"); 

    return $query->result(); 
} 

public function getSubMenus() 
{ 
    $query = $this->db->query("call uspTest()"); 
    return $query->result(); 
} 

} 

Đây là mã từ bộ điều khiển

class MYHQ extends CI_Controller { 

public function __construct() 
{ 
    parent::__construct(); 
    $this->load->model('menus_model'); 
} 

public function index() 
{ 
    $menu = $this->menus_model->getMenus(); 
    $submenu = $this->menus_model->getSubMenus(); 
} 

} 

Có giải pháp nào mà không cần hack cốt lõi của CodeIgniter ??

Trả lời

5

Điều này có vẻ là một lỗi trong CodeIgniter. Làm thế nào đến nó vẫn còn ở đó là ngoài tôi. Tuy nhiên, có một số cách để khắc phục nó.

Kiểm tra tại đây: http://codeigniter.com/forums/viewthread/73714/ Về cơ bản, bạn sửa đổi mysqli_result.php để bao gồm hàm next_result() và đảm bảo gọi nó sau mỗi proc được lưu trữ. gọi điện. Chỉ cần lưu ý rằng nó giả sử bạn đang sử dụng mysqli như trình điều khiển DB của bạn ... nhưng bạn có thể có thể làm một cái gì đó tương tự với bất kỳ khác. Bạn có thể thay đổi trình điều khiển của bạn trong /application/config/database.php Đó là dòng nói rằng

$db['default']['dbdriver'] = 'mysql';

theo mặc định. Thay đổi nó thành:

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

Bạn cũng có thể đóng/mở lại kết nối DB giữa các cuộc gọi, nhưng tôi chắc chắn sẽ khuyên bạn nên tiếp cận phương pháp đó.

+0

Cảm ơn Veggen, Bây giờ có vẻ như không có cách nào để sử dụng nó mà không cần hack cốt lõi của codeigniter? –

+0

Vâng, ngoài việc đóng và mở lại kết nối DB giữa các cuộc gọi, không, dường như không có cách nào. Nhưng, nếu có bất kỳ sự chia buồn nào, sự thay đổi cần thiết là rất nhỏ. Tôi đang sử dụng một hack như vậy trên dự án hiện tại của tôi: ( – kaqqao

+0

O.K. Chỉ muốn xác nhận. Anyways, Thanks and Nice work;) –

7

Có cùng một vấn đề tôi tìm thấy một cách tiếp cận khác không thay đổi lõi, nhưng thay vào đó sử dụng một trợ giúp nhỏ.

Chỉnh sửa: Không tìm thấy nội dung được liên kết dưới đây.

Xem bài đăng CoreyLoose.

https://ellislab.com/forums/viewthread/71141/#663206

tôi đã phải làm một adjusment nhỏ để trợ giúp mình mặc dù. Dòng

if(get_class($result) == 'mysqli_stmt') 

có thể có thể tạo cảnh báo vì đôi khi kết quả $ được chuyển thành boolean. Tôi chỉ cần đặt một kiểm tra trước khi dòng này và bây giờ nó hoạt động hoàn hảo, không có mày mò với cốt lõi!

+0

Điều này có vẻ tốt. Phải thử nó. – kaqqao

+0

Đây là phương pháp xâm nhập ít nhất vì nó không yêu cầu thay đổi đối với lõi CI. Tôi cũng sử dụng nó. –

+0

xin cảm ơn jonas – Drew

17

Tôi làm theo blog của ông Tim Brownlaw:
http://ellislab.com/forums/viewthread/73714/#562711

Thứ nhất, sửa đổi application/config/config.php, dòng 55.

$db['default']['dbdriver'] = 'mysqli'; // USE mysqli 

Sau đó, thêm đoạn mã sau vào mysqli_result. php thiếu lệnh này vì một số lý do lạ (dưới /system/database/drivers/mysqli/mysqli_result.php).

/** 
    * Read the next result 
    * 
    * @return null 
    */ 
function next_result() 
{ 
    if (is_object($this->conn_id)) 
    { 
     return mysqli_next_result($this->conn_id); 
    } 
} 

Sau đó, trong mô hình của bạn, hãy thêm $result->next_result().

Dưới đây là ví dụ của tôi.

function list_sample($str_where, $str_order, $str_limit) 
{ 
    $qry_res = $this->db->query("CALL rt_sample_list('{$str_where}', '{$str_order}', '{$str_limit}');"); 

    $res  = $qry_res->result(); 

    $qry_res->next_result(); // Dump the extra resultset. 
    $qry_res->free_result(); // Does what it says. 

    return $res; 
} 
+0

Có thể mô phỏng cùng với trình điều khiển pdo không? – Dimas

2

thay đổi dbdriver để "mysqli" đặt chức năng này để mô hình của bạn và sử dụng nó để gọi thủ tục lưu trữ

function call($procedure) 
{ 
    $result = @$this->db->conn_id->query($procedure); 

    while ($this->db->conn_id->next_result()) 
    { 
     //free each result. 
     $not_used_result = $this->db->conn_id->use_result(); 

     if ($not_used_result instanceof mysqli_result) 
     { 
      $not_used_result->free(); 
     } 
    } 

    return $result; 

} 
Các vấn đề liên quan