我有一些PHP代码:
- 连接到mysql表
- 检索结果
- 格式化结果以显示为HTML表(添加标记等)
- 将格式正确的结果存储到名为$echoResultsFinal的var中
然后,在HTML内部,我有一些内联PHP。it:
- 检查$echoResultsFinal是否已设置
- 如果是的话,echo的内容就出来了
- 如果没有,则回声出一些与问题无关的内容
问题:当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_ASSOC
或MYSQL_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
的两种形式。