【问题标题】:PHP while loop number of rowsPHP while循环行数
【发布时间】:2016-04-29 10:34:59
【问题描述】:

我在 php while 循环中苦苦挣扎。目标是从数据库中获取报价并在每行显示 3 列。现在看起来,while 循环每行显示一列。我应该如何纠正这个问题?

 <?php

$servername = "localhost";
$username = "";
$password = "";
$dbname = "";


$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
} 
$row = $ip['id']; 
$row = $ip['quote'];  
$row = $ip['topic'];
$row = $ip['author'];
$nr = 0;


$sql = "SELECT * FROM quotes ORDER BY date DESC limit 10";
$result = $conn->query($sql);


if ($result->num_rows > 0) {



     while($row = $result->fetch_assoc() ) {
         $nr++;


          echo  
        "<div class='container row'>
          <div class='col s12 m6 l4 z-depth-1'>
          <div class='card-panel grey darken-4 white-text center'><h5>Citat: ". $row["id"] ."</h5></div> <pre class='flow-text black-text' wrap='soft'>" ."<p class=''>Författare: ". $row["author"] ."</p>" 
          . "<p class=''>Citat: ". $row["quote"] ."</p>" .  $row["topic"] ."</pre>

        <div class='content_wrapper'>
    <h4>Vote </h4> 

        <div class='voting_wrapper' id='". $row["id"] ."'>
            <div class='voting_btn'>
                <div class='up_button'>&nbsp;</div><span class='up_votes'>0</span>
            </div>
            <div class='voting_btn'>
                <div class='down_button'>&nbsp;</div><span class='down_votes'>0</span>
            </div>
             <br>
        </div>


        </div>
        </div>
</div>";

}
 }else {
     echo "0 results";
}

$conn->close();
?> 

【问题讨论】:

  • 使用 if($nr%3 == 0) 然后添加下一行,否则创建 3 列。
  • 请使用 PHP html 友好的语法。
  • 提供你想要的html格式

标签: php html css loops


【解决方案1】:

你可以这样做:

<?php

$servername     = "localhost";
$username       = "";
$password       = "";
$dbname         = "";


$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

//DO YOU NEED THESE VARIABLES? I DON'T SEE THEIR USE HERE... BESIDES, $row DOES NOT EXIST YET...
$row    = $ip['id'];
$row    = $ip['quote'];
$row    = $ip['topic'];
$row    = $ip['author'];
$nr     = 0;


$sql = "SELECT * FROM quotes ORDER BY date DESC limit 10";
$result = $conn->query($sql);


if ($result->num_rows > 0) {
    $output     = "";
    while($row  = $result->fetch_assoc() ) {
        $topic   = trim($row["topic"]);
        $quote   = trim($row["quote"]);
        $author  = trim($row["author"]);
        $id      = trim($row["id"]);

        $output .= injectNColumnWrapper(3, $nr, "container row", $nr);
        $output .="<div class='col s12 m6 l4 z-depth-1'>";
        $output .="<div class='card-panel grey darken-4 white-text center'>";
        $output .=" <h5>Citat: {$id}</h5>";
        $output .="</div>";
        $output .="pre class='flow-text black-text' wrap='soft'>";
        $output .="<p class='flow-text-p author'>Författare: {$author}</p>";
        $output .="<p class='flow-text-p citat'>Citat: {$quote}</p>";
        $output .="<p class='flow-text-p topic'>{$topic}</p>";
        $output .="</pre>";
        $output .="<div class='content_wrapper'>";
        $output .="<h4>Vote </h4>";
        $output .="<div class='voting_wrapper' id='vote-{$id}'>";
        $output .="<div class='voting_btn'>";
        $output .="<div class='up_button'>&nbsp;</div>";
        $output .="<span class='up_votes'>0</span>";
        $output .="</div>";
        $output .="<div class='voting_btn'>";
        $output .="<div class='down_button'>&nbsp;</div>";
        $output .="<span class='down_votes'>0</span>";
        $output .="</div>";
        $output .="<br>";
        $output .="</div>";
        $output .="</div>";
        $output .="</div>";
        $nr++;

    }
    $output    .= "</div>";
    echo $output;
}else {
    echo "0 results";
}

$conn->close();


function injectNColumnWrapper($cols_per_row, $closePoint, $cssClass="container row", $nthElem=""){
    $blockDisplay       = "";
    if( ($closePoint == 0) ){
        $blockDisplay   = "<div class='" . $cssClass . " container_nr_" . $nthElem . "'>"  . PHP_EOL;
    }else if( ($closePoint % $cols_per_row) == 0 && ($closePoint != 0) ){
        $blockDisplay   = "</div><div class='" . $cssClass . " container_nr_" . $nthElem . "'>"  . PHP_EOL;
    }
    return $blockDisplay;
}

?>

每行应该有 3 列,如下所示:

<div class="container">
    <div class="col s12 m6 l4 z-depth-1">Column 1</div>
    <div class="col s12 m6 l4 z-depth-1">Column 2</div>
    <div class="col s12 m6 l4 z-depth-1">Column 3</div>
</div>

我希望这会有所帮助...

【讨论】:

  • 谢谢!它帮助很大。
  • @Thun 您能否将问题标记为完整或至少将其标记为有帮助?它可能对其他人有益......
  • 再问一个问题。 is 在 $row["author"] 和 {$row["quote"]} 之间有很多空间。如何让它更紧凑?
  • @Thun 只需将值包装在 PHP 修剪函数中,如下所示:trim({$row["author"]})修剪({$row["quote"]})。 Trim 删除字符串之前和之后的额外空格。因此 "peace " 在运行 trim() 时会变成 "peace"
  • 太棒了!但我如何将它包装在 html 代码部分中。当我编写函数时,它只显示修剪(此处的数据)?我需要包装它 {trim({$row["author"]})} 吗?
【解决方案2】:

试试看:-

<?php

$servername = "localhost";
$username = "";
$password = "";
$dbname = "";


$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
} 
$row = $ip['id']; 
$row = $ip['quote'];  
$row = $ip['topic'];
$row = $ip['author'];
$nr = 0;


$sql = "SELECT * FROM quotes ORDER BY date DESC limit 10";
$result = $conn->query($sql);

$chngrow=0;

if ($result->num_rows > 0) {



     while($row = $result->fetch_assoc() ) {
         $nr++;

   $chngrow = $chngrow + 1;

          echo  
        "<div class='container row'>
          <div class='col s12 m6 l4 z-depth-1'>
          <div class='card-panel grey darken-4 white-text center'><h5>Citat: ". $row["id"] ."</h5></div> <pre class='flow-text black-text' wrap='soft'>" ."<p class=''>Författare: ". $row["author"] ."</p>" 
          . "<p class=''>Citat: ". $row["quote"] ."</p>" .  $row["topic"] ."</pre>

        <div class='content_wrapper'>
    <h4>Vote </h4> 

        <div class='voting_wrapper' id='". $row["id"] ."'>
            <div class='voting_btn'>
                <div class='up_button'>&nbsp;</div><span class='up_votes'>0</span>
            </div>
            <div class='voting_btn'>
                <div class='down_button'>&nbsp;</div><span class='down_votes'>0</span>
            </div>
             <br>
        </div>


        </div>
        </div>
</div>";

          $mod = ($chngrow % 3);
          echo ($mod==0) ? "<br>" : "";

}
 }else {
     echo "0 results";
}

$conn->close();
?> 

【讨论】:

    【解决方案3】:

    详细说明@RuchishParikh 评论,其中已经包含解决方案的核心:

    $nr = 0;
    while ($row = $result->fetch_assoc()) {
      $nr++;
      if ($nr % 3 == 0) {
        echo "<div class='container row'>\n"; # start of row
      }
      echo "<div class='col s4 m6 l4 z-depth-1'>\n"; # start of column
      echo "  ...\n";
      echo "</div>\n"; # end of column
      if ($nr % 3 == 0) {
        echo "</div>\n"; # end of row
      }
    }
    

    【讨论】:

      【解决方案4】:

      这样试试,

      $nr =0;
      while($row = $result->fetch_assoc() ) {
               $nr++;
               if(($count-1)%3==0) echo '<div class="row">';
               //Add your content units here.
               if(($count)%3==0) echo '</div>';
      }
      

      【讨论】:

        【解决方案5】:

        为每个循环增加一个计数器变量。在循环外打开 table 标记和 tr 标记。 while 循环应该只有 td 标记。如果 count%3==0 则关闭 tr 标签并打开一个新的 tr 标签。

        $i=0
        ?><table><tr><?
        while(condition)
        {
            $i++;
            if($i%3==0)
            {
                ?></tr><tr><?
            }
        
            ?><td>your data</td><?
        }
        ?></tr></table><?
        

        【讨论】:

          【解决方案6】:

          你搞砸了变量。 不需要在下面声明$row:

              $row = $ip['id']; 
              $row = $ip['quote'];  
              $row = $ip['topic'];
              $row = $ip['author'];
          

          如此处所述Why shouldn't I use mysql_* functions in PHP? 不要使用 mysql_* 函数。

          您需要获取 3 行并将它们放入一个容器中。

          <?php
          $servername = "localhost";
          $username = "";
          $password = "";
          $dbname = "";
          
          $db = new PDO("mysql:host=$servername;dbname=$dbname;charset=UTF-8", 
                        $username 
                        $password);
          $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
          
          $sql = "SELECT * FROM quotes ORDER BY date DESC limit 10";
          $nr = 0;
          
          $stmt = $db->query('SELECT * FROM table');
          
          while($row1 = $stmt->fetch(PDO::FETCH_ASSOC)) {
             $row2 = $stmt->fetch(PDO::FETCH_ASSOC);
             $row3 = $stmt->fetch(PDO::FETCH_ASSOC);
             $rows[] = $row1;
             if ($row2) $rows[] = $row2;
             if ($row3) $rows[] = $row3;
          
             echo "<div class='container row'>\n"
          
             foreach($rows as $row) {
                $nr++;
                $id_     = $row["id"];
                $author_ = $row["author"];
                $quote_  = $row["quote"];
                $topic_  = $row["topic"];
          
                echo 
                  "<div class='col s12 m6 l4 z-depth-1'>
                   <div class='card-panel grey darken-4 white-text center'><h5>Citat:$id_ </h5></div> 
                     <pre class='flow-text black-text' wrap='soft'>
                        <p class=''>Författare: $author_</p> 
                        <p class=''>Citat: $quote_</p>
                        $topic_
                     </pre>
          
                  <div class='content_wrapper'>
                     <h4>Vote </h4> 
                     <div class='voting_wrapper' id='$id_'>
                      <div class='voting_btn'>
                          <div class='up_button'>&nbsp;</div><span class='up_votes'>0</span>
                      </div>
                      <div class='voting_btn'>
                          <div class='down_button'>&nbsp;</div><span class='down_votes'>0</span>
                      </div>
                      <br />
                  </div>
                  </div>
                  </div>";
              }
          
              echo "</div>\n";
              $rows = null;
          }
          
          if ($nr == 0){
             echo "0 results";
          }
          ?>
          

          【讨论】:

            【解决方案7】:

            试试这个

            $i=0
            ?><table><tr><?
            while(condition)
            {
                $i++;
                if($i%3==0)
                {
                    ?></tr><tr><?
                }
            
                ?><td>your data</td><?
            }
            ?></tr></table><?
            

            【讨论】:

            • 仅代码的答案并不是非常有用,因为它们没有解释问题是什么,以及代码为什么/如何解决它。对此添加解释会有所帮助。
            • 请提供一些解释
            猜你喜欢
            • 2016-11-27
            • 1970-01-01
            • 2012-02-21
            • 1970-01-01
            • 2011-06-02
            • 2017-11-20
            • 2011-08-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多