PHP生成的表列数据不在正确的位置


PHP-generated table column data not in proper spot?

我有一些PHP代码:

  1. 连接到mysql表
  2. 检索结果
  3. 格式化结果以显示为HTML表(添加标记等)
  4. 将格式正确的结果存储到名为$echoResultsFinal的var中

然后,在HTML内部,我有一些内联PHP。it:

  1. 检查$echoResultsFinal是否已设置
  2. 如果是的话,echo的内容就出来了
  3. 如果没有,则回声出一些与问题无关的内容

问题:当PHP生成的表被回显时,表内容的顺序不正确。

生成表格的代码:

$echoResultArray = array();
$i = 0;
while ($row = mysql_fetch_array($result))
{
    $td = '';
    foreach(array('FIRST_NAME', 'LAST_NAME', 'RIT_ACC', 'LINK_1', 'LINK_2', 'LINK_3', 'LINK_4', 'LINK_5', 'LINK_6' ) as $key => $value)
    {
        $td .= "<td>" . $row[$key] . "</td>";
    }
    $echoResultArray[$i] = "<tr>" . $td . "</tr>";
    $i++;
}
//Table closing tag
$echoResultsClosing = "</tbody></table>";
mysql_close();
$echoResultData = '';
foreach($echoResultArray as $var)
{
    $echoResultData .= $var;
    $echoResultData .= PHP_EOL;
}
$echoResultFinal = $echoResult . $echoResultData . $echoResultsClosing;

知道怎么了吗?:)

谢谢你的帮助!

第一个foreach循环中出现问题。你的代码是这样的:

foreach(array('FIRST_NAME', 'LAST_NAME', 'RIT_ACC', 'LINK_1', 'LINK_2', 'LINK_3', 'LINK_4', 'LINK_5', 'LINK_6' ) as $key => $value)
{
    $td .= "<td>" . $row[$key] . "</td>";
}

这里需要注意的重要一点是,foreach在遍历您传递的数组($key => $value)时,将所有键分配给$key,将所有值分配给$value。这里的问题是使用$key$row数组中检索值。但是,传入数组后,键是数字0-8(数组的索引)。您可以通过对传递给foreach的数组执行var_dump来看到这一点:

array(9) {
  [0] => string(10) "FIRST_NAME"
  [1] => string(9) "LAST_NAME"
  [2] => string(7) "RIT_ACC"
  [3] => string(6) "LINK_1"
  [4] => string(6) "LINK_2"
  [5] => string(6) "LINK_3"
  [6] => string(6) "LINK_4"
  [7] => string(6) "LINK_5"
  [8] => string(6) "LINK_6"
}

您正在使用的$key在括号中。因此,您正在$row数组中查找数字索引。由于mysql_fetch_array():的默认行为,这仍然会为您提供输出

返回数组的类型取决于result_type的定义方式通过使用MYSQL_BOTH(默认),您将获得一个同时具有关联索引和数字索引的数组使用MYSQL_ASSOC,您只能获得关联索引(如MYSQL_fetch_ASSOC()所起作用),使用MYSQL_NUM,您只能得到数字索引(如MYSQL _fetch_row()所作用)。

我在这里把重点添加到了文档中的引用中。

因此,对mysql_fetch_array()的调用将返回一个包含列名和值的数组,以及列及其值的数字索引。由于查询的SELECT以与传递给foreach的数组不同的顺序对字段进行排序,因此结果出现了混乱。由于数字索引将与SELECT中字段的顺序相对应,因此您按照数据库给您的顺序而不是您想要的顺序输出它们。

为了避免将来出现此错误,请显式使用mysql_fetch_assoc()mysql_fetch_row(),或者将MYSQL_ASSOCMYSQL_NUM常量传递给mysql_fetch_array()但是,mysql_*函数已被弃用,并将在PHP 5.4中删除。我强烈建议你调查PDO。(PDO有一个类似的返回策略,它返回类似MYSQL_BOTH的列名和索引,所以要小心!)

要解决此问题,您应该使用$value从查询中获取列,因为此变量将包含列的字符串名称。

foreach(array('FIRST_NAME', 'LAST_NAME', 'RIT_ACC', 'LINK_1', 'LINK_2', 'LINK_3', 'LINK_4', 'LINK_5', 'LINK_6' ) as $value)
{
    $td .= "<td>" . $row[$value] . "</td>";
}

另外请注意,我将您的as $key => $value更改为仅as $value,因为如果您不使用密钥,则不需要指定变量来接收它。这是foreach的两种形式。