在php中边做边做
该循环使用do-while,工作正常,但当我将另一个do-while添加到此循环中时,第二个do-while-work但第一个do-while仅显示一行,而不是全部10行。我的代码在下面在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
<?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));
?>