2013-10-21 89 views
0

在使用服務器端處理的Datatables中,指定列時是否可以使用列別名?Datatables服務器端處理和列別名

目前這個工作正常:

$aColumns = array('datetime','username', 'user_ip', 'company', 'action'); 

,但我想改變使用MySQL的日期格式的話,實際上,我想使用的日期格式:

$aColumns = array('DATE_FORMAT(datetime, "%d/%m/%Y - %H:%i:%s") as newdate';'username'; 'user_ip';'company'; 'action'); 

的問題是,該別名具有逗號和aColumns陣列逗號分隔所以它打破時以後,例如,它涉及到:

$sQuery = " 
    SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))." 
    FROM $sTable 
    $sWhere 
    $sOrder 
    $sLimit 
"; 

有沒有一種方法可以使用別名而不是原始值?即使是簡單地改變爲aColumns在整個腳本中使用的SELECT語句不工作,因此它需要一個值正確設置

感謝

回答

2

是。我實際上只是自己就這個問題而努力。因爲JSON輸出是通過計算數組中列的數量來確定的,並且由於imploding數組,所以必須將列別名添加到$ sQuery而不是$ aColumns數組。所以你的$ aColumns數組中實際上只有一列比你需要的少。例如,在我的例子中,我需要一個名爲total的別名,它是乘以價格和數量而創建的。所以我把$ aColumns陣列中的所有我不混疊列,就像這樣:

$aColumns = array('purchaseID', 'dateOfOrder', 'productID', 'price', 'QTY'); 

但隨後,在串接所有必要建立適當的查詢字符串中的東西$ sQuery串,我加之間我列的別名內爆和FROM。不要忘記在implode之後加一個逗號,因爲它不會爲你添加它。原來的$ sQuery字符串如下所示:

$sQuery = " 
    SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))." 
    FROM `$sTable` 
    $sWhere 
    $dateSql 
    $sOrder 
    $sLimit 
"; 

但礦,與列別名增加,看起來是這樣的:

$sQuery = " 
    SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))." 
    , `price` * `QTY` AS `total` FROM `$sTable` 
    $sWhere 
    $dateSql 
    $sOrder 
    $sLimit 
"; 

最後,你必須做的最後一件事是改變實際的JSON輸出,以確保在json_encode之前的末尾的FOR循環中考慮了額外的列,因爲它將項目插入$ row數組,這就是'aaData'(返回的行數據),基於多少您在$ aColumns數組中指定的列,並且因爲您遺漏了任何您已別名的數據,則計數將錯誤,並且您將看到類似於'請求來自數據源行的未知參數「。 FOR循環原來是這樣的:

while ($aRow = mysql_fetch_array($rResult)) 
{ 
    $row = array(); 
    for ($i=0 ; $i<count($aColumns) ; $i++) 
    { 
     if ($aColumns[$i] == "version") 
     { 
      /* Special output formatting for 'version' column */ 
      $row[] = ($aRow[ $aColumns[$i] ]=="0") ? '-' : $aRow[ $aColumns[$i] ]; 
     } 
     else if ($aColumns[$i] != ' ') 
     { 
      /* General output */ 
      $row[] = $aRow[ $aColumns[$i] ]; 
     } 
    } 
    $output['aaData'][] = $row; 
} 

就像我說的,過for循環的作品立足於$ aColumns陣列的COUNT,因爲我已經添加了一個別名,它要砍掉我的成績很短。它不會包含在返回的列數組中返回的最後一個元素,所以我要改變的代碼看起來像這樣:

for ($i=0 ; $i<count($aColumns) + 1; $i++) 
    { 
     if ($i < count($aColumns)){ 
      if ($aColumns[$i] == "version") 
      { 
       /* Special output formatting for 'version' column */ 
       $row[] = ($aRow[ $aColumns[$i] ]=="0") ? '-' : $aRow[ $aColumns[$i] ]; 
      } 
      else if ($aColumns[$i] != ' ') 
      { 
       /* General output */ 
       $row[] = $aRow[ $aColumns[$i] ]; 
      } 
     } 
     else { 
      $row[] = $aRow['total']; 
     } 

    } 
    $output['aaData'][] = $row; 
} 

我所改變的是從$i<count($aColumns)$i<count($aColumns) + 1櫃檯條件,因爲我的別名使列數比數組中的數字更高。我添加了一個if-else的包裝,只是說如果計數器$ i高於我在$ aColumns數組中指定的列數,那麼我們已經將數組中的所有列添加到輸出數據,因爲我只添加了一個額外的別名列,那意味着我可以繼續並將其添加到$ row數組中,該數組包含返回行中的所有輸出數據。

您可以根據需要添加儘可能多的別名列,只需相應地縮放代碼即可。希望這可以幫助!

相關問題