在php中边做边做

在php中边做边做,php,mysql,while-loop,do-while,Php,Mysql,While Loop,Do While,该循环使用do-while,工作正常,但当我将另一个do-while添加到此循环中时,第二个do-while-work但第一个do-while仅显示一行,而不是全部10行。我的代码在下面 <?php do { ?> <tr> <td><?php echo $row_Recordset1['date']; ?></td> <?php do { ?> <td><?php echo $row_Recordse

该循环使用do-while,工作正常,但当我将另一个do-while添加到此循环中时,第二个do-while-work但第一个do-while仅显示一行,而不是全部10行。我的代码在下面

<?php do { ?>
<tr>
<td><?php echo $row_Recordset1['date']; ?></td>
<?php do { ?>
  <td><?php echo $row_Recordset1['nav']; ?></td>
  <?php } while ($row_Recordset1= mysql_fetch_assoc($Recordset1)); ?>
</tr>
<?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>
但我现在得到:

------------------------
|2014-02-26|5.5|3.2|3.5|
------------------------
你应该看看

它将内部指针向前移动一步,因此每次执行mysql\u fetch\u assoc()时,都会得到下一个值,因此只会执行enternal do while。也就是说,只输出第一行的日期,所有其他值在第二行输出

尝试以下练习:

$q = mysql_query("SOME MYSQL QUERY WITH MINIMUM THREE ROWS");
$f = mysql_fetch_assoc($q);
$f = mysql_fetch_assoc($q);
$f = mysql_fetch_assoc($q);

print_r($f);
像这样:

<?php do { ?>
<tr>
    <td><?php echo $row_Recordset1['date']; ?></td>
    <td><?php echo $row_Recordset1['nav']; ?></td>
</tr>
<?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>

因为每次使用它都会执行以下操作

返回与提取的行相对应的关联数组,并将内部数据指针向前移动


这不起作用的部分原因是因为您正在重新分配同一变量的值。如果你不想失去它,那么你不能这样做。如果你打算用代码做任何新的事情,至少这是个坏主意

接下来,我真的建议您在输出数据之前先用数据填充数组。将逻辑与输出分离是一个非常好的主意

您的代码应该更像这样:

<?php
//Assumes you have already connected to a mysqli resource
$conditional_data_filtered = $mysqli->real_escape_string($conditional_data);
$sql = "SELECT date, nav FROM some_table WHERE some_column = '" . $conditional_data_filtered . "'";

if ($result = $mysqli->query($sql)) {
    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
        $data = array(); //Make sure we start with a fresh array each time.
        $data['date'] = $row['date'];

        //Now I think you have a bunch of data in the nav you need to loop through
        $nav_filtered = $mysqli->real_escape_string($row['nav']);
        $subSql = "SELECT some_data FROM navigation WHERE some_identifier = '" . $nav_filtered . "'";

        if ($subResult = $mysqli->query($subSql)) {
            while ($subRow = $subResult->fetch_assoc()) {
                $data['nav'][] = $subRow;
            }
        }

        $rowList[] = $data;
    }

    /* free result set */
    $result->free();
}

foreach ($rowList as $rowData) {
    echo "<tr>";
    echo "<td>" . $rowData['date'] . "</td>";

    foreach ($rowData['nav'] as $navData) {
        echo "<td>" . $navData['some_info'] . "</td>";
    }

    echo "</tr>";
}
?>

请注意:如果您确实没有子数据,只想输出下一列,则不需要子循环。您只需要像处理第一个专栏一样回显该专栏的内容。然后你可以去掉我上面显示的子循环,把它放在第一个循环中。

首先,请不要像那样跳进跳出PHP

<?php 
do { 
  echo '<tr>
  <td>';
  echo $row_Recordset1['date']; 
  echo '</td>';
  do { 
    echo '<td>';
    echo $row_Recordset1['nav']; 
    echo '</td>';
  } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));
  echo '</tr>';
} while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));
?>


您在哪里获取第一个$row_记录集1?早于此代码的某个地方?您将输出表格单元格(
),直到行数用完为止。我想你不想那样。

为什么不在的同时只做一个/
,让
做两个回声?因为每次调用
fetch\u assoc
时,它
都会将内部数据指针向前移动。
为什么不使用
while()
而不使用
do
?我可以看出您可能是该社区的新手。首先我想说“欢迎来到StackOverflow社区!”。第二,我想请你记住对你喜欢的答案进行投票,然后单击复选标记,选择你认为最好的答案(不一定是我的答案)。感谢并享受这个网站!:)很好的SQL注入。从PHP5.5.0开始,mysql_*扩展已被弃用,请使用mysqli_*或使用PDO(它还允许您使用准备好的语句,防止SQL注入)。很好的一点是,我已经习惯于使用框架来为我处理所有这些,并将我忘记的对象交给我。幸运的是,到目前为止,很少有人升级到5.5。不过我会修改我的代码。至少你需要使用
mysql\u real\u escape\u string
,尽管这很烦人。最好用PDO表示法来表达它,以此作为抛弃过时的mysql_query函数的激励。是的,正如我所说的,我已经纠正了这个问题。(其他的干扰让我慢了下来)。
<?php 
do { 
  echo '<tr>
  <td>';
  echo $row_Recordset1['date']; 
  echo '</td>';
  do { 
    echo '<td>';
    echo $row_Recordset1['nav']; 
    echo '</td>';
  } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));
  echo '</tr>';
} while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));
?>