1

我有一些 PHP 代码:

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

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

  1. 检查是否 $echoResultsFinal isset
  2. 如果是,则回显其内容
  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;

知道怎么了?:)

谢谢你的帮助!

4

1 回答 1

4

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(数组的索引)。您可以通过执行var_dump传递给 foreach 的数组来看到这一点:

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您正在使用的s 在括号中。所以你正在寻找$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()ormysql_fetch_row()或将MYSQL_ASSOCorMYSQL_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

于 2012-07-23T20:55:04.737 回答