需要一些关于PHP+mysql和HTML表中不合逻辑逻辑的帮助


Need some help for illogical logic in PHP + mysql and HTML tables

这个板的新手,但到目前为止很喜欢它:)

我目前正在帮助我的一个朋友重做她的个人网站,我正在为一张桌子的逻辑上碰壁。

假设该表显示了由4列/单元格/TD组成的表中的最新消息(仅此而已),大致如下: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>

对于每个结果(即一个整个新闻条目,而不是一个的一列),您只执行一个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)

CCD_ 6表示逻辑或。它将首先检查第一个条件,如果不是这样,它将检查第二个条件。如果其中任何一个为真,则整个条件被视为真,并且该子句将执行。

然而,当$i % 4 == 0为真时,$i % 4 != 0仅为假。这意味着,执行了以前的else if子句。检查甚至从未到达$p部分。

可能看起来更好

$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/>'; 
}

您可以修改代码,这样您就可以生成[缩略图,日期]&[标题]每4套

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