2

基本上我的数据库中有文章,我想改变第一条记录的显示方式。我希望最新(已发布)文章成为焦点,而较旧的文章仅列出,(请参阅F1.com)。我需要知道如何在数组中获取我的第一个值并让它以不同的方式显示,但我不确定如何执行此操作,我可以这样做,以便所有行显示相同,而不是如何更改第一行。我还需要知道如何告诉其余的行在之后显示相同的内容,我猜你在那里使用了 if 语句,并且在此之前对行进行了某种计数。


当前代码:

    $result = mysql_query("SELECT * FROM dbArticle WHERE userID='".$_SESSION["**"]."' ORDER BY timestamp DESC");

while($row = mysql_fetch_array($result))
  {
  echo "<h2 class=\"heading1\">". $row['title'] ."</h2>";
  echo "By:  ".$row['username']."  Type: ".$row['type']."  Posted: ".$row['timestamp']." 
  $body = $row['body'];
  echo "<br/><p>";
  echo substr("$body",0,260);
  echo "...<span class=\"tool\"><a class=\"blue\" href=\"index.php?pageContent=readArticle&id=".$row['id']."\">Read More</a></span></p><hr/>";
  }
mysql_close($con);

好的,我采用了 Luke Dennis 的代码并尝试对其进行测试,但我收到此错误:警告:为 foreach() 提供的参数无效,这是 foreach 语句的行。刚刚想到的是,我只希望显示 5 篇左右的旧文章。这就是我创建错误的原因:

<? $con = mysql_connect("localhost","****","***");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("******", $con);

$result = mysql_query("SELECT * FROM dbArticle ORDER BY timestamp DESC");
$first = true;    
foreach($result as $row){
    if($first)
    {
        echo"".$row['title']."";
        echo"this is the headline";

        $first = false;
    }
    else
    {
        echo"".$row['title']."";
        
    }
}

?>

我需要在某处添加 mysql_fetch_array 来设置数组吗?

4

8 回答 8

8

我将遍历结果并将 css 类应用于第一个条目:

$first = true;    
while ($row = mysql_fetch_assoc($result)) {
  $cssClass = '';
  if ($first) {
    $cssClass = 'highlight';
  }
  echo '<p class="' . $cssClass . '">' . $row['text'] . '</p>';
  $first = false;
}
于 2009-02-23T22:36:48.630 回答
5

这有点粗糙,但我经常硬编码一个变量来指定循环的第一次运行。所以像:

$first = true;
foreach($list_of_items as $item)
{
    if($first)
    {
        // Do some stuff

        $first = false;
    }
    else
    {
        // Do some other stuff
    }
}
于 2009-02-23T22:37:43.950 回答
1

循环遍历结果时的简单 if 语句通常可以解决问题。您可以使用布尔值来指示您是否已输出第一行结果或现在。如果你还没有,那么给它一个特定的样式,然后将布尔值设置为 true。然后所有后续行都会获得不同的样式。

于 2009-02-23T22:37:03.000 回答
1

以上所有内容均正确。卢克丹尼斯的帖子当然更加充实。

正如 Brian Fisher 所说,根据 Luke 的帖子在第一个链接中添加一些 CSS 样式。

我看了看F1网站上的文章列表。建造得很好的网站-“人们会期望的。” :-)

无论如何,文章列表都包含在一个两行表(summary="Latest Headlines")中,按降序排列(最新的在前)。

只需在第二列中放置一个类 (<td class="first-news-article">)。然后在 css 文件中添加类名和适当的样式值 - 可能是你的 modules.css。该文件中已经有很多与文章关联的类值,因此您可以只使用现有值。

这应该是关于它 - 除了实际做它!

顺便说一句,从底层 html 的质量来看,我假设已经有一个“文章列表发射器”。只需找到该发射器并放置适当的条件来测试第一条记录。

达雷尔

我刚刚注意到您的代码添加。我假设您以 F1 站点为例。无论如何,我认为你正在路上。

于 2009-02-23T23:15:27.150 回答
0

我想你有一些代码循环通过你的结果集并将它们打印到页面中?你能把这段代码粘贴进去吗,这可能会给我们一个帮助你的起点。

于 2009-02-23T22:37:28.647 回答
0

我会使用array_shift()

$result = mysql_fetch_assoc($resultFromSql); // <- edit
$first = array_shift($result);
echo '<h1>'.$first['title'].'</h1>';

foreach ($result as $row) {
  echo '<h2>'.$row['title'].'</h2>';
}
于 2009-02-24T21:02:42.983 回答
0

我不懂 PHP,所以我会用 Perl 对其进行伪代码。我不会这样做:

my $row_num = 0;
for my $row ($query->next) {
    $row_num++;

    if( $row_num == 1 ) {
        ...format the first row...
    }
    else {
        ...format everything else...
    }
}

循环内的 if 语句不必要地使循环逻辑混乱。这不是性能问题,而是代码可读性和可维护性问题。这种事情只是在寻找一个错误。利用它是数组中的第一件事这一事实。这是两件不同的事情,用两段不同的代码来做。

my $first = $query->next;
...format $first...

for my $row ($query->next) {
    ...format the row...
}

当然,您必须通过使用标签使第一行脱颖而出。

于 2009-02-24T21:23:56.520 回答
-1

最好的方法是在 while 循环之前放置一个 fetch 语句。

在 while 循环中放置一个仅对一次迭代有效的测试对于数百万行的结果可能是浪费时间。

于 2009-02-24T20:03:25.887 回答