【问题标题】:do while in do while in php在 php 中执行
【发布时间】:2014-03-28 07:25:15
【问题描述】:

该循环使用 do while,它工作正常,但是当我在其中添加另一个 do while 时,第二个 do while 工作但第一个 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)); ?>

我的日期应该连续显示一次,但所有其他 td 将从导航中获取;

这就是我想要的:

   ------------------------
   |2014-02-26|5.5|3.2|3.5|
   ------------------------
   |2014-02-25|3.1|1.2|1.5|

但我目前得到:

------------------------
|2014-02-26|5.5|3.2|3.5|
------------------------

【问题讨论】:

  • 为什么不只有一个do/while 而让do 做两个回声?因为每次你调用fetch_assocmoves the internal data pointer ahead.
  • 为什么不使用 while() 而不使用 do
  • 我可以看出您可能是社区的新手。首先我想说“欢迎来到 StackOverflow 社区!”。其次,我想请您记住为您喜欢的答案投票,然后单击您选择的最佳答案的复选标记(不一定是我的答案)。感谢并享受这个网站! :)

标签: php mysql while-loop do-while


【解决方案1】:

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

接下来,我真的建议您先用数据填充数组,然后再对它进行任何输出操作。将逻辑与输出分开是一个非常好的主意。

您的代码应该看起来更像这样:

<?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>";
}
?>

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

【讨论】:

  • 那里有很好的 SQL 注入。 mysql_* 扩展自 PHP 5.5.0 起已弃用,请使用 mysqli_ 或使用 PDO(这也允许您使用准备好的语句,以防止 SQL 注入)。 php.net/manual/en/mysqlinfo.api.choosing.php
  • 好点,我已经习惯于使用框架来为我处理所有这些,并将我忘记的对象交给我。幸运的是,到目前为止,很少有人升级到 5.5。我会修复我的代码。那并确保它被正确地转义。
  • 至少你需要使用mysql_real_escape_string,虽然很烦人。最好只用 PDO 表示法来表达它,以此作为放弃非常过时的 mysql_query 函数的动力。
  • 是的,正如我所说的那样,我正在努力纠正这个问题。 (其他让我慢下来的干扰因素出现了)。
【解决方案2】:

像这样:

<?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)); ?>

因为每次您使用mysql_fetch_assoc 时,它都会执行以下操作

返回对应于获取行的关联数组,并将内部数据指针向前移动。

【讨论】:

    【解决方案3】:

    首先,不要像那样跳进跳出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_Recordset1?比这段代码更早的地方?您将输出表格单元格 (&lt;td&gt;),直到行数用完。我不认为你想要那个。

    【讨论】:

      【解决方案4】:

      你应该看看http://php.net/mysql_fetch_assoc

      它将内部指针向前移动了一步,因此每次执行 mysql_fetch_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);
      

      【讨论】:

        猜你喜欢
        • 2011-02-11
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2015-09-30
        相关资源
        最近更新 更多