2016-01-20 23 views
5

我正在運行查詢,其中$sale_ids可能包含100個到幾千個sale_id。我正在尋找一種方法來修正正則表達式錯誤,而無需修改CI 3的核心。CI 3.0.4 large where_in查詢導致原因消息:preg_match():編譯失敗:正常表達式在偏移處太大)

這在版本2中沒有發生,並且不被認爲是CI 3中的一個錯誤(我之前提到過這個問題)。

有沒有辦法讓我這個工作?我可以改變應用程序的邏輯,但這需要幾天的工作。

我正在尋找一種方法來擴展/重寫一個類,以便我可以允許此查詢工作如果沒有辦法通過重寫來做到這一點,我將不得不破解核心(我不知道怎麼樣)。

$this->db->select('sales_payments.*, sales.sale_time'); 
$this->db->from('sales_payments'); 
$this->db->join('sales', 'sales.sale_id=sales_payments.sale_id'); 
$this->db->where_in('sales_payments.sale_id', $sale_ids); 
$this->db->order_by('payment_date'); 

錯誤是:

Severity: Warning 

Message: preg_match(): Compilation failed: regular expression is too large at offset 53249 

Filename: database/DB_query_builder.php 

Line Number: 2354 

Backtrace: 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/application/models/Sale.php 
Line: 123 
Function: get 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/application/models/Sale.php 
Line: 48 
Function: _get_all_sale_payments 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/application/models/reports/Summary_payments.php 
Line: 60 
Function: get_payment_data 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/application/controllers/Reports.php 
Line: 1887 
Function: getData 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/index.php 
Line: 323 
Function: require_once 

回答

11

有沒有修改的核心的好辦法,所以我想出了我與大where_in的代碼做了小改動。創建一個組並創建where_in的更小塊的位置

$this->db->group_start(); 
$sale_ids_chunk = array_chunk($sale_ids,25); 
foreach($sale_ids_chunk as $sale_ids) 
{ 
    $this->db->or_where_in('sales_payments.sale_id', $sale_ids); 
} 
$this->db->group_end(); 
+0

天才!正是我在找的! – rAjA

+0

你先生是非常天才的。謝謝! – Charas

+0

非常感謝。做得好! – imilah

相關問題