我有一些PHP代码:
然后,在HTML内部,我有一些内联PHP。它:
问题:当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;
知道怎么了? :)
感谢您的帮助!
答案 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
)。这里的问题是您使用$row
从var_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_NUM
或mysql_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
。