Когда вы выводите информацию из базы данных с использованием php и mysql, как бы вы выглядели иначе, чем первая строка? - PullRequest
2 голосов
/ 24 февраля 2009

В основном у меня есть статьи в моей базе данных, и я хочу изменить способ отображения первой записи. Я хочу, чтобы в центре внимания была последняя (опубликованная) статья, а более старая статья просто в списке (см. 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);

Хорошо, я взял код Люка Денниса и попытался его проверить, но я получаю эту ошибку: Предупреждение: указан неверный аргумент для 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, чтобы настроить массив?

Ответы [ 8 ]

8 голосов
/ 24 февраля 2009

Я бы просто перебрал результаты и применил класс css к первой записи:

$first = true;    
while ($row = mysql_fetch_assoc($result)) {
  $cssClass = '';
  if ($first) {
    $cssClass = 'highlight';
  }
  echo '<p class="' . $cssClass . '">' . $row['text'] . '</p>';
  $first = false;
}
5 голосов
/ 24 февраля 2009

Это немного грубо, но я часто жестко кодирую переменную, чтобы обозначить первый запуск цикла. Так что-то вроде:

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

        $first = false;
    }
    else
    {
        // Do some other stuff
    }
}
1 голос
/ 24 февраля 2009

Все вышеперечисленное верно. Пост Люка Денниса, конечно, конкретизирован.

Как сказал Брайан Фишер, добавьте немного CSS-стиля к первой ссылке, когда встретите ее в посте Люка.

Я посмотрел список статей на сайте F1. Довольно хорошо сконструированный сайт - «Можно было ожидать». : -)

В любом случае, списки статей содержатся в двухстрочной таблице (summary = "Последние заголовки") в порядке убывания (сначала самые новые).

Просто поместите класс во второй столбец (

). Затем добавьте имя класса и соответствующие значения стиля в файл css - возможно, ваш 'modules.css. В этом файле уже есть несколько значений класса, связанных со статьями, так что вы можете просто использовать существующее значение.

Это должно быть об этом - кроме как на самом деле!

Кстати, судя по качеству базового html, я предполагаю, что уже есть «источник списка статей». Просто найдите этот эмиттер и поместите соответствующее условие для проверки первой записи.

Даррелл

Я только что заметил добавление вашего кода. Я предполагаю, что вы показывали сайт F1 в качестве примера. В любом случае, я думаю, что вы уже в пути.

1 голос
/ 24 февраля 2009

Простой оператор if при циклическом просмотре ваших результатов, как правило, сработает. Вы можете использовать логическое значение, чтобы указать, выводите ли вы первый ряд результатов или сейчас. Если вы еще этого не сделали, задайте ему определенный стиль, а затем установите для логического значения значение true. Тогда все последующие строки получат другой стиль.

0 голосов
/ 25 февраля 2009

Я не знаю 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...
}

Конечно, вы должны выделять первую строку, используя теги.

0 голосов
/ 25 февраля 2009

Я бы использовал 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>';
}
0 голосов
/ 24 февраля 2009

Лучший способ сделать это - поместить оператор fetch перед циклом while.

Помещение в цикл while теста, который верен только для одной итерации, может быть пустой тратой времени для результата миллионов строк.

0 голосов
/ 24 февраля 2009

Полагаю, у вас есть какой-то код, который перебирает ваш набор результатов и печатает их на странице? Не могли бы вы вставить этот код, и это может дать нам отправную точку, чтобы помочь вам.

...