dtpyvb1873 2012-07-23 20:49
浏览 15
已采纳

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

I have some PHP code which:

  1. connects to mysql table
  2. retrieves results
  3. formats results for display as HTML table (add tags, etc)
  4. stores the properly formatted results into a var named $echoResultsFinal

Then, inside of the HTML, I have some inline PHP. it:

  1. checks to see if $echoResultsFinal isset
  2. if it is, echo's out its contents
  3. if not, echos out some stuff unrelated to the question

The problem: When the PHP generated table is echoed out, the table contents are not in the proper order.

The code which generates the table:

$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;

Any idea what's up? :)

Thanks for any help!

  • 写回答

1条回答 默认 最新

  • dsc7188 2012-07-23 20:55
    关注

    There is a problem in your first foreach loop. The code you have is this:

    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>";
    }
    

    The important thing to note here is that your foreach is assigning all the keys to $key and all of the values to $value as it iterates through the array you passed it ($key => $value). The problem here is you are using the $key to retrieve values from the $row array. However, with the array passed in, the keys are the numbers 0-8 (the indices of the array). You can see this by doing a var_dump of the array you pass to 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"
    }
    

    The $keys that you are using are in brackets. So you are looking for numeric indexes in the $row array. This still gives you output because of the default behavior of mysql_fetch_array():

    The type of returned array depends on how result_type is defined. By using MYSQL_BOTH (default), you'll get an array with both associative and number indices. Using MYSQL_ASSOC, you only get associative indices (as mysql_fetch_assoc() works), using MYSQL_NUM, you only get number indices (as mysql_fetch_row() works).

    I've added the emphasis here to the quote from the docs.

    So your call to mysql_fetch_array() returns an array with column names and values as well as a numeric index of the columns and their values. Your results were out of order because your query's SELECT ordered the fields in a different order than in the array you passed to foreach. Since the numeric index would correspond to the order of the fields in the SELECT, you were outputting them in the order the database gave them to you rather than the order you wanted.

    To avoid this bug in the future, explicitly use mysql_fetch_assoc() or mysql_fetch_row() or pass the MYSQL_ASSOC or MYSQL_NUM constants to mysql_fetch_array(). However, the mysql_* functions have been deprecated and will be removed in PHP 5.4. I highly suggest you look into PDO. (PDO has a similar return strategy which returns the column names and indices like MYSQL_BOTH so be careful!)

    To fix this, you should be using the $value to get the column from the query because this variable will contain the string name of the columns.

    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>";
    }
    

    Also note that I changed your as $key => $value to just as $value because if you don't use the key, you don't need to specify a variable to receive it. Those are the two forms of foreach.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 个人网站被恶意大量访问,怎么办
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制