PHP生成的表列数据不在适当的位置?

时间:2012-07-23 20:49:25

标签: php javascript html

我有一些PHP代码:

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

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

    1. 检查是否$ echoResultsFinal isset
    2. 如果是,则回显其内容
    3. 如果没有,回复一些与问题无关的东西
    4. 问题:当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;
      

      知道怎么了? :)

      感谢您的帮助!

1 个答案:

答案 0 :(得分: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 )。这里的问题是您使用$rowvar_dump数组中检索值。但是,在传入数组时,键是数字0-8(数组的索引)。您可以通过执行传递给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

您使用的$row位于括号内。所以你在mysql_fetch_array()数组中寻找数字索引。由于mysql_fetch_array()

的默认行为,这仍然为您提供输出
  

返回数组的类型取决于result_type的定义方式。 通过使用MYSQL_BOTH(默认),您将获得一个包含关联索引和数字索引的数组。使用MYSQL_ASSOC,您只能获得关联索引(如mysql_fetch_assoc()工作),使用MYSQL_NUM,您只能得到数字索引(如mysql_fetch_row()工作)。

我在这里强调了文档的引用。

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

要避免将来出现此错误,请明确使用mysql_fetch_row()MYSQL_ASSOC或将MYSQL_NUMmysql_fetch_array()常量传递给mysql_*但是, MYSQL_BOTH函数已被弃用,将在PHP 5.4中删除。我强烈建议你研究一下PDO。 (PDO有一个类似的返回策略,它返回列名和索引,如$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更改为{{1}},因为如果您不使用该密钥,则无需指定变量来接收它。这些是two forms of foreach