在PHP中循环使用while和foreach

时间:2010-09-18 03:44:03

标签: php mysql foreach

我似乎无法获得工作。也许我不理解它。

这是我的代码:

$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数据库中 -

类别表。 字段:

  • ID
  • 名称
  • NUM_EVENTS
  • 日历
  • CALENDAR_URL

除日历字段外,所有这些字段都包含虚拟数据。

目前,我有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

4 个答案:

答案 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)

如果你想要asoc数组更改,

mysql_fetch_array返回由整数索引的数组

while ($array = mysql_fetch_array($query))

到这个

while ($array = mysql_fetch_assoc($query))