 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
14.08.2004, 17:40
|
#1
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
[MySQL + PHP] Jahres/Monats Archiv realisieren - wie am besten?
Ich erstelle derzeit ein kleines Newssystem, das auch eine Archivfunktion besitzen soll.
Im Moment überlege ich mir, wie ich die dynamische Erzeugung am besten realisiere. Was ich möchte, ist dass das Skript automatisch ermittelt, wieviele News es in der Vergangenheit gab und dementsprechend als Liste anbietet, ungefähr so:
2004: · Jan · Feb · Mär · Apr · Mai · Jun · Jul · Aug · Sep · Okt · Nov · Dez
Wenn es in einem Monat eine oder mehr News gab, soll der Monat nicht als Text dargestellt werden, sondern als Link. Eine Vorschau:
http://web11.p15131386.pureserver.info/archiv/
Vorgehensweise:
Als erstes muss das Script ja ermitteln, wieviele verschiedene "Jahre" enthalten sind.
Dann muss es zu den gefundenen Jahren ermitteln, in welchen der 12 Monaten auch News geschrieben wurden.
Hat ein Monat einen oder mehrere Einträge, wird der Monat markiert (er wird zum Link).
Ich habe im Moment noch überhaupt keinen Ansatz, wie ich das realisieren soll. Das Datum aller News ist im MySQL-Eigenen Format DATE gespeichert (sprich: 2003-04-23).
Sowas ähnliches habe ich hier gesehen:
http://www.waferbaby.com/archives/
Hat jemand einige Tips, Ideen oder Vorschläge?
__________________
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
|
|
|
14.08.2004, 18:40
|
#2
|
|
TP-Urgestein
Registriert seit: Nov 2003
Ort: NRW
|
Vielleicht ein Anfang.
Hier werden die Monate aber als Ziffer dargestellt und es werden auch nur die dargestellt, welche News haben.
Hoffe das ich nun richtig gezählt habe, da ich es mit einem TIMESTAMP arbeite.
Zur Not musst Du halt die substr Werte anpassen.
PHP-Code:
$result = mysql_query("SELECT datum, titel FROM news ORDER BY datum"); $jahr = array(); $monat = array(); while ($smeldung = mysql_fetch_array($result)) { if($smeldung['titel'] != "") { $sjahr= substr($smeldung['datum'],0,4); if(!in_array($sjahr,$jahr)) { array_push($jahr,$sjahr); } $smonat= substr($smeldung['datum'],0,7); if(!in_array($smonat,$monat)) { array_push($monat,$smonat); } } } foreach($jahr as $showjahr){ echo $showjahr.": - "; foreach($monat as $showmonat){ if(substr($showmonat,0,4)==$showjahr){ echo "<a href='#' target='_blank'>".substr($showmonat,5,2)."</a> - "; } } echo "<hr>"; }
|
|
|
15.08.2004, 00:08
|
#3
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
Hab mal eine andere Variante ausprobiert:
PHP-Code:
<?php
require $_SERVER['DOCUMENT_ROOT']."/inc/config.php";
$m2Str=array('','Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez');
$ergebnis=mysql_query("
SELECT
MONTH(datum) AS currMonth,
YEAR(datum) AS currYear,
COUNT(id) AS anzahl
FROM
news
GROUP BY
YEAR(datum),
MONTH(datum)
ORDER BY
YEAR(datum) DESC,
MONTH(datum) ASC");
$currYear=NULL;
$Yearstart=NULL;
while ($daten = mysql_fetch_array($ergebnis))
{
if($currYear!=$daten['currYear'])
{
if($Yearstart>0) echo "\r\n </p><hr />\r\n";
echo " <p class=\"newstext\"><strong>".$daten['currYear']."</strong>\r\n <br />";
$currYear=$daten['currYear'];
$Yearstart++;
}
if($daten['anzahl']>0)
{
echo " · <a title=\"".$daten['anzahl']." News in diesem Monat\" class=\"nonfett\" href=\"/archiv/".$daten['currYear']."/".$daten['currMonth']."/\">";
}
echo $m2Str[$daten['currMonth']]." (".$daten['anzahl'].")";
if($daten['anzahl']>0)
{
echo "</a>";
}
}
?>
Funktioniert soweit tadellos, leider zeigt er so aber auch NUR die Monate an, die auch eine News haben. *grübel*
__________________
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
|
|
|
15.08.2004, 03:42
|
#4
|
|
TP-Supporter
Registriert seit: Feb 2003
Ort: Bremen
|
So klappts bei mir auf jeden Fall (außer einem... nämlich wenn 1 Jahr lang keine News eingetragen wurden...) 
Und da sich die Anzahl der Monate im Jahr wohl so schnell nich ändern wird
kann man die doch einfach per for-Schleife durchgehen
PHP-Code:
$sql = "SELECT DISTINCT(YEAR(`date`)) AS `year` FROM `archiv`;";
$res1 = mysql_query($sql,$connection);
while($line = mysql_fetch_array($res1))
{
echo $line['year']."<br>";
for($i=1;$i<=12;$i++)
{
$sql = 'SELECT `id` FROM `archiv` WHERE MONTH(`date`) = \''.$i.'\' AND YEAR(`date`) = \''.$line['year'].'\';';
$res2 = mysql_query($sql,$connection);
$res3 = mysql_fetch_array($res2);
if (!empty($res3))
{
echo '<a href="#">'.$m2Str["$i"]."</a> ";
} else {
echo $m2Str["$i"];
};
};
echo '<br>';
};
__________________
The truth You hear may not be the truth You think it is
Geändert von H3ck|0 (15.08.2004 um 03:45 Uhr).
|
|
|
15.08.2004, 04:26
|
#5
|
|
TP-Urgestein
Registriert seit: Nov 2003
Ort: NRW
|
Nun erklärt mich für bekloppt, aber es hat mir einfach keine Ruhe gelassen.
Das hier sollte eigentlich immer funktionieren und zeigt auch alle Monate an.
Einmal wird die Summe der Jahresbeiträge angezeigt und dann beim Monat die Monatssumme.
Die Monate mit News fungieren dann auch als Link.
Die Links sind nun immer so aufgebaut, dass die Monate mit führender 0 (also: 01, 02, 03, ...) hinterlegt sind.
Ist das nicht der fall, dann bei der Linkausgabe anstatt
substr($showmonat,5,2)
einfach
$dummy
eintragen, dann ist die führende 0 raus.
PHP-Code:
<? // Include für DB-Connection include("open.inc.php"); $result = mysql_query("SELECT datum FROM new ORDER BY datum"); $jahr = array(); $cjahr = array(); $monat = array(); $m2Str=array('','Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'); while ($smeldung = mysql_fetch_array($result)) { $sjahr= substr($smeldung['datum'],0,4); if(!in_array($sjahr,$jahr)) { array_push($jahr,$sjahr); } array_push($cjahr,$sjahr); $smonat= substr($smeldung['datum'],0,7); array_push($monat,$smonat); } $counterj = array_count_values($cjahr); $counterm = array_count_values($monat); arsort($jahr); foreach($jahr as $showjahr){ echo "<strong>".$showjahr." (".$counterj[$showjahr].") :</strong><br> - "; $container = array(); $container2 =array(); foreach($monat as $showmonat){ if(substr($showmonat,0,4)==$showjahr){ if(substr($showmonat,5,1)==0){ $ausgabe = $m2Str[substr($showmonat,6,1)]; $dummy = substr($showmonat,6,1); array_push($container2,$dummy); } else{ $ausgabe = $m2Str[substr($showmonat,5,2)]; $dummy = substr($showmonat,5,2); array_push($container2,$dummy); } for($k=1;$k<=$dummy;$k++){ if($k!=$dummy){ if(!in_array($k,$container)) { array_push($container,$k); echo $m2Str[$k]." - "; } else{ } } else{ if(!in_array($k,$container)) { array_push($container,$k); echo "<a href='/archiv/".substr($showmonat,0,4)."/".substr($showmonat,5,2)."/' target='_blank'>".$ausgabe."</a> (".$counterm[$showmonat].") - "; } } } } } if($container2[count($container2)-1] != 12){ for($n=$container2[count($container2)-1];$n<=12;$n++){ if(!in_array($n,$container)) { echo $m2Str[$n]." - "; } } } echo "<hr>"; } ?>
|
|
|
15.08.2004, 04:49
|
#6
|
|
TP-Supporter
Registriert seit: Feb 2003
Ort: Bremen
|
ok.. *für bekloppt erklär*
Als Antwort kommt dann aber von mir die Bitte selbiges mit mir zu tun 
Hab mal eben die Zähler ergänzt...
PHP-Code:
$m2Str=array('','Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez');
$connection = @mysql_connect($db_host,$db_user,$db_pw) or die("Datenbankfehler: Keine Verbindung möglich");
mysql_select_db($db_db);
$sql = "SELECT DISTINCT(YEAR(`date`)) AS `year` FROM `archiv` ORDER BY `year`;";
$res1 = mysql_query($sql,$connection);
while($line = mysql_fetch_array($res1))
{
$sql = 'SELECT COUNT(`id`) AS \'count\' FROM `archiv` WHERE YEAR(`date`) = '.$line['year'].';';
$res2 = mysql_query($sql, $connection);
$line2 = mysql_fetch_array($res2);
echo '<div style="font-weight:bold;">'.$line['year'].' ('.$line2['count'].')</div>';
for($i=1;$i<=12;$i++)
{
$sql = 'SELECT COUNT(`id`) AS \'count\' FROM `archiv` WHERE MONTH(`date`) = \''.$i.'\' AND YEAR(`date`) = \''.$line['year'].'\';';
$res3 = mysql_query($sql,$connection);
$line3 = mysql_fetch_array($res3);
if ($line3['count'] != 0)
{
echo '<span style="width:55px;"><a href="#">'.$m2Str["$i"].' ('.$line3['count'].')</a></span>';
} else {
echo '<span style="width:55px;">'.$m2Str["$i"].' (0)</span>';
};
};
echo '<br>';
};
__________________
The truth You hear may not be the truth You think it is
Geändert von H3ck|0 (15.08.2004 um 04:53 Uhr).
|
|
|
15.08.2004, 05:02
|
#7
|
|
TP-Urgestein
Registriert seit: Nov 2003
Ort: NRW
|
H3ck|0 nun versteh ich Dein Anliegen nicht so ganz.
Klar funktioniert Dein Script auch und ist bestimmt kürzer.
Einziger Unterschied ist, ich benötige 1 DB Anfrage Du wiederum 3.
Was nun besser, schneller, effektiver ist, mag wohl jeder selber entscheiden.
Wie immer ist es halt so, dass zig Wege nach Rom führen.
|
|
|
15.08.2004, 05:15
|
#8
|
|
TP-Supporter
Registriert seit: Feb 2003
Ort: Bremen
|
Das "*für bekloppt erklär*  " war einzig und allein auf deinen ersten Satz in Post #5 bezogen
Zitat:
|
Was nun besser, schneller, effektiver ist, mag wohl jeder selber entscheiden.
|
Jep... wobei meiner Meinung nach die Performance bei nur wenigen Datensätzen wohl kaum ein Problem sein wird, sondern eher die Übersichtlichkeit und Wartbarkeit des Scripts...
Außerdem hab ich einfach mal wieder die Lust am Programmieren entdeckt 
__________________
The truth You hear may not be the truth You think it is
|
|
|
15.08.2004, 05:21
|
#9
|
|
TP-Urgestein
Registriert seit: Nov 2003
Ort: NRW
|
Zitat:
|
Zitat von H3ck|0
Außerdem hab ich einfach mal wieder die Lust am Programmieren entdeckt 
|
Dann nimmst Du meines, da ist die Chance größer sich zu verlieren.
Einfach kann ja jeder 
|
|
|
16.08.2004, 01:45
|
| | |