是的。实际上,我自己只是在这个问题上苦苦挣扎。因为 JSON 输出是通过计算数组中的列数来确定的,并且由于内爆数组,您必须将列别名添加到 $sQuery 而不是 $aColumns 数组。因此,您的 $aColumns 数组中的列实际上会比您需要的少一列。例如,在我的情况下,我需要一个名为total
created 的别名,该别名是通过将价格和数量相乘而创建的。所以我把我所有的非别名列放在 $aColumns 数组中,如下所示:
$aColumns = array( 'purchaseID', 'dateOfOrder', 'productID', 'price', 'QTY');
但随后,在连接创建正确查询字符串所需的所有内容的 $sQuery 字符串中,我在 implode 和 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;
}
我更改的只是计数器条件 from $i<count($aColumns)
to $i<count($aColumns) + 1
,因为我的别名使列计数比数组中的计数高一。我添加了一个包装 if-else,它只是说如果计数器 $i 高于我在 $aColumns 数组中指定的列数,那么我们已经将数组中的所有列添加到输出数据,所以因为我只添加了一个额外的别名列,所以这意味着我可以继续并将其添加到 $row 数组中,该数组包含返回行的所有输出数据。
您实际上可以根据需要添加任意数量的别名列,您只需要相应地缩放代码。希望这可以帮助!