0

在使用服务器端处理的数据表中,是否可以在指定列时使用列别名?

目前,这适用于:

$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,因此它需要正确设置该值

谢谢

4

1 回答 1

2

是的。实际上,我自己只是在这个问题上苦苦挣扎。因为 JSON 输出是通过计算数组中的列数来确定的,并且由于内爆数组,您必须将列别名添加到 $sQuery 而不是 $aColumns 数组。因此,您的 $aColumns 数组中的列实际上会比您需要的少一列。例如,在我的情况下,我需要一个名为totalcreated 的别名,该别名是通过将价格和数量相乘而创建的。所以我把我所有的非别名列放在 $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 数组中,该数组包含返回行的所有输出数据。

您实际上可以根据需要添加任意数量的别名列,您只需要相应地缩放代码。希望这可以帮助!

于 2014-04-24T06:54:59.220 回答