Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中while和foreach的循环_Php_Mysql_Foreach - Fatal编程技术网

PHP中while和foreach的循环

PHP中while和foreach的循环,php,mysql,foreach,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&g

我似乎不能去上班。也许我没有正确地理解它

这是我的密码:

$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";
}
试试这个

$result = mysql_query($query);
while ($array = mysql_fetch_array($result)) {
...
}
试试这个

$result = mysql_query($query);
while ($array = mysql_fetch_array($result)) {
...
}

首先,只是风格问题。您可以考虑将变量$Quy重命名为$结果。它保存的是查询的结果,而不是查询本身

问题是您没有重置$results。在第一个表之后,您已经遍历了整个数组。当您到达末尾,并且没有更多的行需要迭代时,mysql\u fetch\u 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\u data\u seek粘贴在while行之前。您只需要确保对于foreach循环的每次迭代,在点击while之前都重置了数组指针


编辑:s/reset/mysql\u data\u seek/

首先,只是一个风格点。您可以考虑将变量$Quy重命名为$结果。它保存的是查询的结果,而不是查询本身

问题是您没有重置$results。在第一个表之后,您已经遍历了整个数组。当您到达末尾,并且没有更多的行需要迭代时,mysql\u fetch\u 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\u data\u seek粘贴在while行之前。您只需要确保对于foreach循环的每次迭代,在点击while之前都重置了数组指针

编辑:s/reset/mysql\u data\u seek/

mysql\u fetch\u数组返回按整数索引的数组,如果要更改asoc数组

while ($array = mysql_fetch_array($query))
对此

while ($array = mysql_fetch_assoc($query))
如果要更改asoc数组,请使用mysql\u fetch\u数组返回按整数索引的数组

while ($array = mysql_fetch_array($query))
对此

while ($array = mysql_fetch_assoc($query))

正如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'];
}

正如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'];
}


查看一组样本数据真的很有帮助。这看起来基本上是正确的,虽然我不确定下一个电话是关于什么的。我把它处理掉了。我只是在尝试一些东西…哈哈…一个数据样本…比如数据库里有什么?我看看能不能弄点什么。好吧,我不确定如何提供一些样本数据,但我补充了一些信息。一个是体育,一个是俱乐部,还有一个是普通的这是3个值。但你说过有5个。这就是你的主要问题@Col.Shrapnel-嗯,我无法获得任何超过第一个foreach数组值的值,所以我确实认为这会产生很大影响。查看一组样本数据确实会有帮助。这看起来基本上是正确的,虽然我不确定下一个电话是关于什么的。我把它处理掉了。我只是在尝试一些东西…哈哈…一个数据样本…比如数据库里有什么?我看看能不能弄点什么。好吧,我不确定如何提供一些样本数据,但我补充了一些信息。一个是体育,一个是俱乐部,还有一个是普通的这是3个值。但你说过有5个。这就是你的主要问题@Col.Shrapnel-我无法获得任何超过第一个foreach数组值的值,所以我认为它产生了很大的影响。你正确的部分是,在迭代所有数组项之前,你将耗尽记录,但重置$query;不会有帮助的。@Salman A-你当然是对的$查询是一个结果集,而不是数组。答案更新了,这就成功了。非常感谢。我也在研究这里发布的一些其他方法。你已经搞定了这一部分,它说你将在迭代所有数组项之前耗尽记录,但是重置$query;不会有帮助的。@Salman A-你当然是对的$查询是一个结果集,而不是数组。答案更新了,这就成功了。非常感谢。我也在研究这里发布的一些其他方法。实际上,现在我们总是使用两个循环——一个用于获取数据,一个用于输出。非常方便。解析该注释时遇到问题。当1个循环可以完成时,有2个循环有什么好处?为什么需要一个循环来获取数据?db fetch只是几个语句。实际上,现在我们总是使用两个循环——一个用于获取数据,一个用于输出。非常方便。解析该注释时遇到问题。当1个循环可以完成时,有2个循环有什么好处?为什么需要一个循环来获取数据?db fetch只是几个语句。mysql_fetch_array-将结果行作为关联数组、数字数组、,
或两者[默认情况下]:mysql\u fetch\u array-将结果行作为关联数组、数字数组或两者[默认情况下]: