在使用服务器端处理的数据表中,是否可以在指定列时使用列别名?
目前这适用于:
$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
";
有没有办法可以使用别名而不是原始值?即使只是更改select语句也不起作用,因为整个脚本都使用了aColumns,因此需要正确设置该值
由于
答案 0 :(得分:2)
是。我其实只是在努力解决这个问题。因为JSON输出是通过计算数组中的列数来确定的,并且由于内爆数组,您必须将列别名添加到$ sQuery而不是$ aColumns数组。因此,您实际上在$ aColumns数组中的列数少于您需要的列数。例如,在我的作品中,我需要一个名为total
的别名,它是通过乘以price和qty而创建的。所以我将所有未分配的列放在$ aColumns数组中,如下所示:
$aColumns = array( 'purchaseID', 'dateOfOrder', 'productID', 'price', 'QTY');
但是,在$ sQuery字符串中连接创建正确查询字符串所需的所有内容,我在implode和FROM之间添加了列别名。不要忘记在内爆之后加一个逗号,因为它并没有为你添加它。原始的$ 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数组,其中包含返回行的所有输出数据。
您实际上可以根据需要添加任意数量的别名列,只需相应地扩展代码即可。希望这有帮助!