1

新来的这个董事会,但到目前为止很喜欢它:)

我目前正在帮助我的一个朋友重做她的个人网站,并且我正在为一张桌子的逻辑撞墙。

该表应该在由 4 个列/单元格/TDs pr 行组成的表中显示最新消息(仅此而已) - 类似于这样的内容: http ://screencast.com/t/Rh39oh6ms0OL

所以基本上我有一个 SQL 查询,它从新闻表中选择日期、缩略图和标题(按 id desc 排序,所以我首先得到最新的)。

我已经做了一些逻辑(如您在下面的代码中所见),但它只会导致表格的第一行显示。有谁能让我回到正确的轨道上吗?将不胜感激。

<table>
  <?php
  //PHP code used for building HTML table showing news-resumes
  //Written by:  Jesper Flindt
  //Date:       2012.07.30
  //Version:   1.0

  //Getting data from MySQL database
  $query  = "select date, thumbnail, headline from news order by id desc";
  $result = mysql_query($query) or die("Connection Error:" . mysql_error());

  //Setting variables
  $i   = 0;
  $p  = 0;

  //Starting row in table
  print('<tr>');

  //Looping through the resultset
  while($row = mysql_fetch_assoc($result))
  {
    //Limit row to 4 cells (TDs)
    if($i < 4)
    {
      //Display the date of the news as well as its thumbnail
      print('<td><div style="padding-left:8px;"><b>Tilf&oslash;jet d. '.$row['date'].'</b></div><div class="news_thumbframe"><img src="./upload/'.$row['thumbnail'].'" alt=""/></div></td>');
      $i++;
      $p++;
    }
    //If row is 4 cells wide, start new row
    else if($i % 4 == 0)
    {
      print('</tr><tr>');
      $i++;
      $p++;
    }
    //Every second row should display the news headline as well as a "Read More" link ("L&aelig;s mere" in danish)
    else if($i % 4 != 0 || $p % 4 == 0)
    {
      print('<td width="215" valign="top"><br /><div style="padding-left:8px;"><h2>'.$row['headline'].'</h2><a href="#">L&aelig;s mere</a></div></td>');
      $i++;
      $p++;
    }
    else
    {
      $i = 0;
      $p = 0;
    }
  }
  ?>
</table>
4

3 回答 3

1

对于每个结果(即一个完整的新闻条目,而不是一列),您只执行一个 if 子句,因为您使用了一个if/elseif/elseif/else构造。它们是相互排斥的。

含义:

这将完全跳过数据库结果的每四行:

else if($i % 4 == 0)
{
  print('</tr><tr>');
  $i++;
  $p++;
}

这将捕获不是 4 的倍数且大于 4 的所有行:

else if($i % 4 != 0 || $p % 4 == 0)
    {
      print('<td width="215" valign="top"><br /><div style="padding-left:8px;"><h2>'.$row['headline'].'</h2><a href="#">L&aelig;s mere</a></div></td>');
      $i++;
      $p++;
    }

这永远不会执行:

else
{
  $i = 0;
  $p = 0;
}

因为你的其他条件已经用尽了所有的可能性。

  • 第一个子句将执行 4 次。
  • 然后第二个子句将执行一次,因为$i == 4.
  • 现在第三个子句将执行$i == 5, 6, 7
  • 第二个子句将执行$i == 8
  • 第三个子句将执行$i == 9, 10, 11

等等等等

为什么你有两个计数器变量?据我所知,您总是在相同的位置增加它们,并在相同的位置将它们设置为零。有什么不同?

更新

为了澄清您在评论中提到的内容:

else if($i % 4 != 0 || $p % 4 == 0)

||表示逻辑或。它将首先检查第一个条件,如果不正确,它将检查第二个条件。如果其中任何一个为真,则整个条件都被认为是真,并且该子句将执行。

然而,$i % 4 != 0只是假的,什么时候$i % 4 == 0才是真的。这意味着,前面的else if子句已执行。支票甚至永远不会到达 $p零件。

于 2012-07-31T11:59:37.893 回答
0

您可以修改代码,因此您可以每 4 组同时生成 [thumbnail,date] 和 [headline]

PHP:

  //Setting variables
  $i   = 1;
  $img_date = '';  
  $headline =''; 

  //Looping through the resultset
  while($row = mysql_fetch_assoc($result))
  {
     //Building both  content for 4 columns
     $img_date .= '<td><div style="padding-left:8px;"><b>Tilf&oslash;jet d. '.$row['date'].'</b></div><div class="news_thumbframe"><img src="./upload/'.$row['thumbnail'].'" alt=""/></div></td>';

    $headline .='<td width="215" valign="top"><br /><div style="padding-left:8px;"><h2>'.$row['headline'].'</h2><a href="#">L&aelig;s mere</a></div></td>';


     if($i == 4) // Time build row
     {  
        // Building both thumbnail and headline row 
        echo "<tr id='thumb_date'>$img_date</tr>";
        echo "<tr id='headline'>$headline </tr>";

         //resetting  
        $i=1; 
        $img_date = '';  
        $headline ='';
      }
      else
        i++;

   }//end while
于 2012-07-31T12:30:00.200 回答
0

可能看起来更好

$result = mysql_query($query) or die("Connection Error:" . mysql_error());

$items = array();

while($row = mysql_fetch_assoc($result)){
   $items[] = array('date'=>$row['data'],
                    'thumbnail'=>$row['thumbnail'],
                    'headline'=>$row['headline'],);
}

$pairs = array_chunk($items,4);

foreach ($pairs as $pair){

  print '<tr>';

  foreach ($pair as $row){
    print('<td><div style="padding-left:8px;"><b>Tilf&oslash;jet d. '.$row['date'].'</b></div><div class="news_thumbframe"><img src="./upload/'.$row['thumbnail'].'" alt=""/></div></td>');
  }

  print '<tr/><tr>';

  foreach ($pair as $row){
    print('<td width="215" valign="top"><br /><div style="padding-left:8px;"><h2>'.$row['headline'].'</h2><a href="#">L&aelig;s mere</a></div></td>');

  }  
  print '<tr/>'; 
}
于 2012-07-31T12:09:42.557 回答