2010-11-16 140 views
0

我有一個問題。我有一張支持票(wh_task)。每個任務都有一個date_completed(d/m/Y)和has_met_sla字段(0或-1)。我希望允許用戶通過date_completed搜索此表,並根據結果顯示圖表。PHP:幫助這個邏輯

的圖表數據必須是這樣的,所以我可以填充條形圖(融合圖表):

年份:2010 |月:11月| SLA會見:12 | SLA錯過:2

年代2010 |月:10月| SLA遇見:15 | SLA錯過了:1

該圖表中的數字會沿y軸向x軸和「Nov 2010」。沿着y的每個月都有2列,見面並沒有見面。

所以,我可以創建這種圖表沒有問題,但它生成的數據我遇到了麻煩。以下是我的查詢:

 $tsql = "SELECT task_id, has_met_service_level_agreement, date_completed ". 
       "FROM wh_task ". 
       "WHERE (task_status_id = 5) AND (account_id =$atid)"; 

     $stmt = sqlsrv_query($conn, $tsql); 
     if($stmt === false) 
     { 
       echo "Error in query preparation/execution.\n"; 
       die(print_r(sqlsrv_errors(), true)); 
     } 


     //SLA counters 
     $met = 0; 
     $missed = 0; 



     /* Retrieve each row as an associative array and display the results.*/ 
     while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) 
     { 
      $date = $row['date_completed']; 
      $monthnumber = date_format($date, "n"); 
      $year = date_format($date, "Y"); 
      $hasmetsla = $row['has_met_service_level_agreement']; 

     } 


    } 

你能幫我一下這裏的邏輯嗎?我猜我需要將數據存儲在包含月份,年份,會面總數和未滿足總數的數組中。然後爲每個任務檢查數組中是否已存在年份月份組合,如果是這樣,則基於$ hasmetsla的總數是否增加,如果沒有將它添加到數組中?

謝謝大家!

Jonesy

+0

我也正在採取必要的SQL注入預處理.... – iamjonesy 2010-11-16 13:20:29

+0

不,你不是。您不參數化您的查詢。在這種特殊情況下,您可以明確地將$ atid轉換爲整數,但參數化查詢是一個更好的解決方案 - 它們適用於任何數據類型,幾乎適用於所有情況。 – tdammers 2010-11-16 13:25:49

+0

不,我只是沒有把它包含在我的代碼snippit中,但我首先檢查數據並將不需要的東西刪除。 – iamjonesy 2010-11-16 13:33:48

回答

1

這裏,如果我不得不這樣做在PHP中我會做什麼(使用SQL將是更好的選擇,但這裏是這樣做,事實上後一種方法):

首先,我要建立一個多用以下結構維數組:

array(
    'year1' => array(
     'month1' => array(
      'met' => 0, 
      'missed' => 0, 
     ), 
    ), 
), 

然後,我會改變while循環做這樣的事情:

$yearInfo = array(); 
while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
    $date = $row['date_completed']; 
    $monthnumber = date_format($date, "n"); 
    $year = date_format($date, "Y"); 
    $hasmetsla = $row['has_met_service_level_agreement']; 
    if (!isset($yearInfo[$year])) { 
     $yearInfo[$year] = array(
      $monthnumber => array(
       'met' => 0, 
       'missed' => 0 
      ) 
     ); 
    } elseif (!isset($yearInfo[$year][$monthnumber])) { 
     $yearInfo[$year][$monthnumber] = array(
      'met' => 0, 
      'missed' => 0, 
     ); 
    } 
    $key = $hasmetsla ? 'met' : 'missed'; 
    $yearInfo[$year][$monthnumber][$key]++; 
} 

然後,當您顯示:

$data = ''; 
foreach ($yearInfo as $year => $months) { 
    foreach ($months as $month => $status) { 
     $data .= 'Year: '.$year.' | '. 
       'Month: '.$month.' | '. 
       'SLA Met: '.$status['met'].' | '. 
       'SLA Missed: '.$status['missed']."\n"; 
    } 
} 
+0

這是個好東東,非常感謝!工作過一種享受! – iamjonesy 2010-11-16 14:04:53

3

我認爲你最好在SQL中進行這種處理。使用兩步解決方案:首先,找到一個查詢,爲您提供每行的年份,月份和sla_met。把它放在視圖中。然後做一個查詢該視圖上,使用GROUP_BY,SUM(巧妙地結合)和count()來計算期望的結果:

CREATE VIEW vw_sla AS SELECT DATEPART(year, date_completed) AS year, DATEPART(month, date_completed), CASE has_met_service_level_agreement WHEN 0 THEN 0 ELSE 1 END as sla_met 

SELECT year, month, sum(sla_met), count(*) - sum(sla_met) FROM vw_sla GROUP BY year, month ORDER BY year DESC month DESC 

的所有你需要做的是從數據庫中獲取的數據,將其顯示在表格中。