【问题标题】:WHILE loops can't be used twice? PHPWHILE 循环不能使用两次? PHP
【发布时间】:2011-09-29 11:17:07
【问题描述】:

我是 PHP 新手,希望有人能帮助我。我在 mysql 数据库中有一个包含 "id" 、 "img" 、 "link" 和 "desc" 的表。我希望它完全回响成这样的东西:

    <div id="featured">
    <a target='_blank' href='link'><img src='image link1' title='description'/></a>
    <a target='_blank' href='link'><img src='image link2' title='description'/></a>
    <a target='_blank' href='link'><img src='image link3' title='description'/></a>
    <a target='_blank' href='link'><img src='image link4' title='description'/></a>
    </div>
    <div id="cap">
    <span class='desc' id='idnumber'>Description1</span>
    <span class='desc' id='idnumber'>Description2</span>
    <span class='desc' id='idnumber'>Description3</span>
    <span class='desc' id='idnumber'>Description4</span>
    </div>

PHP 代码:

<?php
  require_once "./dbconfig.php";
  opendb();
  $sql = "SELECT * FROM images ORDER BY id DESC"; 
  $query = querydb($sql);
?>
<div id="featured"> 
<?php
  while($row = mysql_fetch_array( $query )){
    echo "<a target='_blank' href='$row[link]'><img src='$row[img]' title='$row[desc]'/></a>";
  }
?>
</div>
<div id="cap">
<?php
  while($row = mysql_fetch_array( $query )){
    echo "<span class='desc' id='$row[id]'>$row[desc]</span>";
  }
closedb();
?>
</div>

WHILE 可以使用两次还是我错了?当我运行此代码时,第二个 while 循环不起作用,跨度根本没有显示。

请帮忙。

【问题讨论】:

  • 请正确缩进您的源代码。
  • 对不起,请把 html 代码和下面的 php 代码分开,我不能编辑它。 :(
  • @edward:是的,您可以看到问题下方的“编辑”链接?

标签: php html loops


【解决方案1】:

来自mysql_fetch_array的文档

返回一个与获取的行对应的数组,并将内部数据指针向前移动。

当您尝试使用第二个 while 循环时,内部数据点仍在末尾​​strong>。你没有做任何重置它。

你可以用mysql_data_seek把它移回到开头

【讨论】:

    【解决方案2】:

    在第二个 while 循环之前使用它

    mysql_data_seek($query,0);
    

    【讨论】:

      【解决方案3】:

      mysql_fetch_array 将为空,因为您已经从数据库中获取了所有行。您需要使用mysql_data_seek 重置指针。

      <?php
      mysql_data_seek( $query, 0 );
      while($row = mysql_fetch_array( $query )){
      echo "<span class='desc' id='$row[id]'>$row[desc]</span>";
      }
      ... rest of code
      

      【讨论】:

        【解决方案4】:

        DB 引用 ($query) 充当指向下一条未读记录的指针;当您调用mysql_fetch_array() 时,它会获取指向的记录,并将指针移动到下一个位置。

        因此,在遍历它们之后,指针将指向记录集的末尾,因此当您请求下一条记录时它返回false。结束循环不会对指针做任何其他事情;它仍然指向记录集的末尾。

        所以你需要做的是将指针重置到数据集的开头,然后才能第二次循环遍历它。

        执行此操作的函数是mysql_data_seek();

        因此,您需要在第二个循环之前立即使用以下代码行:

        mysql_data_seek($query, 0);
        

        希望对您有所帮助。

        【讨论】:

          【解决方案5】:

          使用mysql_fetch_array(),您将逐步查看结果,直到最后。或者正如 PHP 文档所说:

          返回一个对应的数组 获取的行并移动内部 前面的数据指针。

          这意味着,您需要从新开始。所以,在你第二次之前使用这个:

          mysql_data_seek($query,0);
          

          【讨论】:

            【解决方案6】:

            您可以使用两次while,但请参阅what it does

            它告诉 PHP 重复执行嵌套语句,只要 while 表达式的计算结果为 TRUE。

            一旦 mysql_fetch_array 没有更多行要获取,它会在每次后续调用中返回 false - 所以你的第一个 while 循环将停止循环,因为表达式 mysql_fetch_array( $query ) 是 false;并且由于第二个 while 中的表达式相同,因此该循环将永远不会执行(因为表达式的计算结果为 false)。

            怎么做:如果你想多次循环遍历结果,我建议先将结果行存储到一个数组中,然后循环遍历它们。简化示例:

            $results = Array();
            while ($row = mysql_fetch_rows($query)) {
              $results[] = $row;
            }
            
            foreach ($results as $row) {
              echo $row['something'];
            }
            

            【讨论】:

              【解决方案7】:

              第一个循环已经消耗了 mysql 中的所有数据,所以第二个循环中没有任何内容。但是,您可以同时存储行数据,然后重新使用该存储。

              <div id="featured"> 
              <?php
              $rows = array();
              while($row = mysql_fetch_array( $query )){
                $rows[] = $row;
                echo "<a target='_blank' href='$row[link]'><img src='$row[img]' title='$row[desc]'/></a>";
              }
              ?>
              </div>
              <div id="cap">
              <?php
              foreach($rows as $row){
                echo "<span class='desc' id='$row[id]'>$row[desc]</span>";
              }
              closedb();
              ?>
              </div>
              

              【讨论】:

              • 是的,这就是答案,谢谢你,感谢那些回答的人。祝大家有美好的一天。
              • 这似乎是在浪费内存。
              • @edward:不要忘记正确编码您输出的 HTML。
              • @JLevett:问题:PHP 是写时复制,那么这会浪费多少内存?
              【解决方案8】:

              试试这个

                      <?php
                       require_once "./dbconfig.php";
                        opendb();
                        $sql = "SELECT * FROM images ORDER BY id DESC"; 
                        $query = querydb($sql);
                         $query2 = querydb($sql);
                       ?>
                       <div id="featured"> 
                       <?php
                       while($row = mysql_fetch_array( $query )){
                        echo "<a target='_blank' href='$row[link]'><img src='$row[img]'
               title='$row[desc]'/>     </a>";
                        }
                        ?>
                     </div>
                      <div id="cap">
                       <?php
                       while($row2 = mysql_fetch_array( $query2 )){
                       echo "<span class='desc' id='$row2[id]'>$row2[desc]</span>";
                       }
                       closedb(); 
                       ?>
              

              【讨论】:

                【解决方案9】:

                $str_res1 =''; $str_res2 =''; 而($row = mysql_fetch_array($query)){ $str_res1 .= " 目标='_blank' href='$row[link]' img src='$row[img]' title='$row[desc]' a"; $str_res2 .= "span class='desc' id='$row[id]'> $row[desc] span>"; }

                对不起,我无法在我的答案中完成 html 标签,因为如果我写“”,它会从帖子中消失

                通过这个你可以获取 php 字符串中的所有值,你可以在任何你想要的地方回显它。

                【讨论】:

                  【解决方案10】:
                  $stuff = mysql_query("SELECT * FROM tbl");
                  
                  while($s = mysql_fetch_array($stuff)){
                  //ur code
                  }
                  // add this line
                  mysql_data_seek( $stuff, 0 );
                  
                  while($r = mysql_fetch_array($stuff)){
                  //ur code
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2018-05-18
                    • 2014-08-16
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-04-10
                    • 2012-04-01
                    • 2021-07-18
                    相关资源
                    最近更新 更多