2009-10-02 20 views
24

我想在我的第一個嚴肅的CodeIgniter應用程序中調試一些代碼,我似乎無法找到我可以簡單地獲取我的ActiveRecord代碼剛剛生成的原始SQL。在CodeIgniter 1.7中獲取原始SQL查詢

$where = 'DAY(`datetime_start`) = '. date('d',$day) .' AND '; 
    $where .= 'MONTH(`datetime_start`) = '. date('m',$day) .''; 

    $this->db->from('events')->where($where); 
    $result = $this->db->get(); 

感謝您的幫助!

回答

41

之前的查詢運行:

$this->db->_compile_select(); 

它運行後:

$this->db->last_query(); 
+2

_compile_select()在更新版本的CodeIgniter中被標記爲受保護的(它可能僅在PHP4兼容性之前未被聲明保護)。因此,您可以將限制設置爲1以避免執行大查詢,然後調用last_query(),或者可以使用反射,但第一個選項更可取。 – 2013-01-09 04:19:22

+0

另外:它看起來像get_compiled_select()將在未來版本的CodeIgniter中可用;它已經在開發分支(https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/DB_query_builder.php)中。我將該方法複製到DB_active_rec並且它工作正常,即使與此庫結合使用:https://github.com/NTICompass/CodeIgniter-Subqueries – 2013-01-11 00:53:07

8

當然,我發現它發佈後2分鐘,禮貌Phil Sturgeon

echo $this->db->last_query(); 
8

而且,你可以把你的控制器中的以下內容:

$this->output->enable_profiler(TRUE); 

你會得到的查詢和更大量。

+0

對我非常有幫助....感謝:) – 2015-06-20 04:04:20

-2

你可以讓這樣的事情,直到CI的下一個版本發佈

private function get_query_string() 
{ 
    return 'SELECT ' . 
      implode(' , ' , $this->db->ar_select) . 
      ' FROM ' . 
      implode(' , ' , $this->db->ar_from) . 
      (count($this->db->ar_where) ? ' WHERE ' : '') . 
      implode(' ' , $this->db->ar_where); 
} 
+1

這對於實際運行的查詢是否可以產生準確的結果 – Matthew 2013-04-12 08:05:16

0

對於任何人找到這篇舊文章並想知道這是什麼在最新的v3中,函數是$ this-> db-> get_compiled_select()。