PHP Blog, iyi görünümlü bir arşiv bölümü olmak gerekir

2 Cevap php

Yani! Temelde ben Blog yazılarına bir yük ile bir veritabanı var, bunların hepsi bir UNIX zaman damgası göre sıralanır ve ne ihtiyacım var, bu kod başlıklarını uygun olduğunda tükürmek yapmak için bir yol olduğunu bu nedenle bu sefer olacak gibi bir çıktı üretir:

2008

November

Title 1 - Date Goes Here
Title 2 - Date Goes Here

December

Başlık 3 - Tarihi />

2009

January

Başlık 4 - Tarihi />

ufak tefek şeyler

İşte benim kod şimdiye kadar, öyle yılın karşılaştırılması kadar çalışır, ve Ocak gerçekten Aralık sonra gelir, ve bazı komik değil ki ben hala mantıklı bir biçimde ay karşılaştırmak yapmak için nasıl iyi bir yol ile gelmek gerekir 13. ay.

[Code]

<?php   
   if ($db = new PDO('sqlite:./db/blog.sqlite3')) {
         $stmt = $db->prepare("SELECT * FROM news ORDER BY date DESC");
         if ($stmt->execute()) {
               while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
                     $current_year = date("Y", $row[1]);
                     $current_month = date("m", $row[1]);
                     if ($current_year > $last_year) {
                           echo "<h1>" . $current_year . "</h1>";
                           $last_year = $current_year;
                     }
                     echo "<tr>";
                     echo "<td align='left'><a href='view_post.php?post_id=". $row[1] ."'>" . $row['0'] . " - " . date("Y-m-d, H:i:s", $row[1]) . "</a></td>";
                     echo "</tr>";
               }
         }
   } else {
         die($sqliteerror);
   }
?>

[/ Code]

2 Cevap

Unix zaman damgası ile (tabii ki sahte kod) gibi bir şey yapabileceğini

prev_month = null
prev_year = null
foreach results as r
    new_month = date('F', r[timestamp]);
    new_year = date('Y', r[timestamp]);
    if(prev_month != new_month)
        //display month
    /if

    if(prev_year != new_year)
        //display year
    /if

    // display other info

    prev_month = new_month
    prev_year = new_year
/foreach

Ben örneğin ekran / html mantığı, gelen getiriliyor veritabanını ayıran, iki adımda bunu yapmak için cazip olacaktır:

<?php
//snip

//make big array of archive
$archive = array();
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
    $year = date("Y", $row[1]);
    $month = date("m", $row[1]);

    if (!isset($archive[$year])) {
        $archive[$year] = array();
    }

    if (!isset($archive[$year][$month])) {
        $archive[$year][$month] = array();
    }

    $archive[$year][$month][] = $row;
}
//snip

//loop over array and display items 
?>

<?php foreach ($achive as $year => $months): ?>
    <h1><?php echo $year; ?></h1>

    <?php foreach ($months as $month => $posts): ?>
         <h2><?php echo $month; ?></h2>
         <ul>
         <?php foreach ($posts as $post): ?>
             <li><?php echo $post[0]; ?> etc...</li>
         <?php endforeach; ?>
         </ul>
    <?php endforeach; ?>
<?php endforeach; ?>

Eğer SQL sorgusu göre tersten yıl ve ay almalısınız. Ben bu test değil, ama belli belirsiz doğru olmalıdır.