是。我實際上只是自己就這個問題而努力。因爲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數組中,該數組包含返回行中的所有輸出數據。
您可以根據需要添加儘可能多的別名列,只需相應地縮放代碼即可。希望這可以幫助!