我似乎无法获得工作。也许我不理解它。
这是我的代码:
$statement = "SELECT * FROM categories ORDER BY name ASC";
$query = mysql_query($statement)
...
...
$cals = array("sports","general","other","clubs");
foreach ($cals as $value)
{
/* echo "<h3>".$value."</h3>";
*/ echo "<table width='100%'>";
while ($array = mysql_fetch_array($query))
{
if ($array['calendar'] == $value)
{?>
<tr>
<td><?php echo $array['name']; ?></td>
<td><a onclick="update_form('<?php echo $array['name']; ?>', '<?php echo $array['calendar']; ?>')" href="#">Edit</a></td>
</tr>
<?php }
}
echo "</table><br />Value: $value";
}
这样做的目的是让foreach改变if语句。我曾计划if语句第一次说if ($array['calendar'] == "sports")
,第二次if ($array['calendar'] == "general")
,依此类推。但是,它显示了所有表(在源代码中),但是在第一个表之后没有为每个数组值创建表行。例如,我正确地看到了体育表,但我没有看到任何一般,其他或俱乐部的表行。该数据库中的记录应出现在每个记录中。这可能是while和if语句的问题吗?如果我手动将if语句中的$值设置为数组中的某个值,则会显示正确的记录。
我错过了什么?
示例数据:
在MySQL数据库中 -
类别表。 字段:
除日历字段外,所有这些字段都包含虚拟数据。
目前,我有5条记录。每个人都有不同的日历值。一个是体育,一个是俱乐部,一个是普通的。根据我在数组中首先放置的值,它只显示一个表,其中包含数组中第一个值的所有值。
以下是结果页面中的源代码:
<table width='100%'><tr>
<td>test4</td>
<td><a onclick="update_form('test4', 'sports')" href="#">Edit</a></td>
</tr>
<tr>
<td>test5</td>
<td><a onclick="update_form('test5', 'sports')" href="#">Edit</a></td>
</tr>
</table><br />Value: sports<table width='100%'></table><br />Value: general<table width='100%'></table><br />Value: other<table width='100%'></table><br />Value: clubs
答案 0 :(得分:2)
正如jcubic和timdev指出的那样,编写的代码存在一些问题。但是,您尝试使用的算法效率非常低,因为它会遍历每个日历类型的整个结果集。相反,您可以在SQL中使用多列排序来一次完成:
$query = "SELECT * FROM categories ORDER BY calendar, name";
$results = mysql_query($results)
...
...
$last_cal = '';
while ($array = mysql_fetch_assoc($query))
{
if (!$last_cal) {
echo '<table>';
}
else if ($array['calendar'] != $last_cal) {
echo '</table>';
echo '<table>';
}
?>
....HTML for table row...
<?php
$last_cal = $array['calendar'];
}
答案 1 :(得分:1)
试试这个......
$result = mysql_query($query);
while ($array = mysql_fetch_array($result)) {
...
}
答案 2 :(得分:1)
首先,只是一种风格。您可以考虑将变量$query
重命名为$results
。它保存查询的结果,而不是查询本身。
问题在于您没有重置$results
。在第一个表之后,您已遍历整个数组。当你到达最后,并且没有更多行要迭代时,mysql_fetch_assoc()
返回false。
所以试试这个:
foreach ($cals as $value)
{
while ($array = mysql_fetch_array($query))
{
if ($array['calendar'] == $value)
{
?>
<tr>
<td><?php echo $array['name']; ?></td>
<td><a onclick="update_form('<?php echo $array['name']; ?>', '<?php echo $array['calendar']; ?>')" href="#">Edit</a></td>
</tr>
<?php
}
}
echo "</table><br />Value: $value";
mysql_data_seek($query,0); // <=== Set the resultsets internal pointer back to zero (the first record).
}
重要的一位是倒数第二行的mysql_data_seek()
。
如果您愿意,也可以将mysql_data_seek()
放在while()
行之前。您只需要确保在foreach循环的每次迭代中,在您点击while()
之前重置数组指针。
编辑:s / reset / mysql_data_seek /
答案 3 :(得分:0)
mysql_fetch_array
返回由整数索引的数组
while ($array = mysql_fetch_array($query))
到这个
while ($array = mysql_fetch_assoc($query))