2013-07-01 105 views
1

我正在根據用戶選擇的日期從數據庫中提取數字數據。出於某種原因,當我選擇我的函數來提取今天的所有數據(沒有)時,它仍然會形成一個空值數組。使用CodeIgniter向數組返回空值的數據庫查詢?

我在考慮問題在於select_sum()或where()函數。這裏是我的CI查詢:

$this->db 
      ->select_sum('column1') 
      ->select_sum('column2') 
      ->select_sum('column3') 
       ->where('created_at >=', date('Y-m-d')); 
      $query = $this->db->get('table_name'); 

,這裏是整個頁面中使用我的foreach循環拉所有選定的數據到一個數組:

$popular_items_array = array(); 
     foreach ($query->result() as $key => $row) 
     { 
      if ($row == NULL) { 
       echo "Error populating table."; 
      } else { 
      $popular_items_array = $row; 
      } 
     } 

要看看數據,然後我做:

echo json_encode($popular_items_array); 

果然出這一點:

{"column1":null,"column2":null,"column3":null} 

如果我選擇不同的時間範圍(數據實際存在於設定的日期),則相同的JSON回顯將顯示現有數據。我不理解的是,爲什麼查詢返回任何東西?爲什麼它不是失敗?我怎樣才能運行一個能夠解決這個問題的檢查/循環,並顯示一條錯誤消息,讓用戶知道該日期沒有數據?

+0

什麼是$ this-> db-> last_query();在$ query = $ this-> db-> get('table_name');之後返回線?看看實際的查詢是什麼樣的,我會很有興趣。 –

+0

@DazzKnowles查詢看起來像這樣 SUM('column1')AS column1,SUM('column2')AS column2,SUM('column3')AS column3 FROM('table_name')WHERE'created_at'> ='2013 -07-01' – Spookytheboy

回答

3

如果您更願意獲得根本沒有記錄,你可以修改你的代碼:

$this->db 
    ->select_sum('column1') 
    ->select_sum('column2') 
    ->select_sum('column3') 
     ->where('created_at >=', date('Y-m-d')) 
     ->having('count(*) > 0'); 
$query = $this->db->get('table_name'); 
+0

嗯,所以添加「有()」將停止查詢,但我怎麼能夠檢查它失敗?這是真正的問題 - 顯示這些總和查詢是否確實在做相關的事情。 – Spookytheboy

+0

修正了這個問題,我添加了一個if語句,說if(empty($ popular_items_array) – Spookytheboy

1

這就是聚合函數(如sum(),avg(),max()等)的工作方式,它們將返回結果集合中的值。如果結果集是空的,他們會聚合。這造成很多confusionbugreports但是這是這應該是如何工作的,更詳細的解釋can be found at dba.stackexchange.com

您可以使用COALESCENULL值替換到更有用的東西,或者你可以添加一個count()這樣你就可以告訴你怎麼許多行被用於生成sum()

奇怪的是,如果添加了一組由它的工作如你所願(至少與MySQL):

SELECT sum(id) sum_id FROM `users` WHERE 0 # => array(array('sum_id' => null)) 

但是:

SELECT sum(id) FROM `users` WHERE 0 GROUP BY null # => array()