Hent data ud fra databasen sorteret efter tidspunkt. Hent også datoen, fx. som jakobdo foreslår med MONTH(dato). Noget i stil med "SELECT overskrift, dato, MONTH(dato) AS month FROM tabel ORDER BY dato" Løb listen igennem, og læg alle post i et to-dimentionelt array efter dato.
Hvis fx. den aktuelle række fra databasen ligger i $row:
$month = $row['month']; $data[$month][] = $row;
Så indeholder $data[1] en liste med poster for januar, $data[2] februar osv.
De kan så fx. skrives ud sådan her: $months = array( 1=>"Januar", 2=>"Februar", ... 12=>"December" );
foreach($months as $month=>$monthname) { echo '-'.$monthname.'-<br />'; foreach($data[$month] as $item) { echo htmlspecialchars($item['overskrift']).' (Skrevet d. '.$item['dato'].')<br />'; } }
I øvrigt: Jeg giver sjældent færdige løsninger. Jeg vil hellere lade folk lære at lave det selv (og at stille gode spørgsmål). Man lærer meget ved at gøre det forkert, hvis man får det til at virke bagefter. Derfor siger jeg sjældent alt relevant, og giver kun et skub i den rigtige retning.
Det er vist tid til et skub: phpbegynder2004, i den sidste version af koden du viser, er bla. disse to linjer: $month = $row['month']; $oversigt[$month][] = $row; De bliver kun kørt én gang, fordi du intet gør for at køre det flere gange. Men de skal køres én gang for hver række der bliver hentet ud af tabellen. Dette ses især ved at du i begge linjer henter data ud af $row, men den variabel eksisterer slet ikke, du har intet puttet i den.
Og så bruger du i øvrigt variablen $oversigt til to forskellige ting.
Jeg vil kraftigt anbefale at du gennemgår en begynder-tutorial om PHP og MySQL (igen).
De første tre linjer kan fx. rettes til: $oversigt = array(); $result = mysql_query("SELECT MONTH(dato) AS month FROM sider ORDER BY dato") or die(mysql_error()); while ($row = mysql_fetch_assoc($result)) { $month = $row['month']; $oversigt[$month][] = $row; }
Jeg har nu læst taksmgr's artikel om arrays, kigge på google og en masse andre steder, men jeg får stadig fejl. Kan ikke finde ud at det. Undskyld! ed ikke hvad det er jeg gør galt, men der bliver ikke udskrevet værdierne for $item. Den finder fint nok at der er en post fra januar, 6 fra febuar osv.. Den kan dog kun udskrive: (Skrevet d.)
Uden selve værdien for datoen :(
$oversigt = array(); $result = mysql_query("SELECT MONTH(dato) AS month FROM sider ORDER BY dato") or die(mysql_error()); while ($row = mysql_fetch_assoc($result)) { $month = $row['month']; $oversigt[$month][] = $row; } $months = array( 1=>"Januar", 2=>"Februar", 3=>"Marts", 4=>"April", 5=>"Maj", 6=>"Juni", 7=>"Juli", 8=>"August", 9=>"September", 10=>"Oktober", 11=>"November", 12=>"December" ); foreach($months as $month=>$monthname) { echo '-'.$monthname.'-<br />'; foreach($oversigt[$month] as $item) { echo htmlspecialchars($item[title]).'(Skrevet d. '.$item['dato'].')<br />'; } }
Du skal da ikke sige undskyld fordi du ikke kan finde ud af det. :) "dato" og "title" bliver ikke udskrevet, fordi de ikke er der. De bliver aldrig trukket ud af databasen. Du skal lige kigge på din SQL igen, der skal være en liste over hvilke felter du vil have trukket ud.
Mange tak! Nu virker det! Ved godt du sagde at jeg selv skulle prøve at løse problemermene når jeg har dem, men jeg er desværre stødt på et par problemer mere. Først og fremmest laver den fejl hvis den ikke kan finde nogle poster i en måned. F.eks. August har jeg ikke skrevet noget så den laver fejl. Alt virker som det skal, men det ser lidt dumt ud med sådan en fejl på skærmen. Prøve med @, men det vil ikke fjerne det :(
Andet problem er at når jeg udskriver det bliver der ikke taget højde for årstal. Defor er det hele blandet sammen. Prøvede at efterligne din kode med måned, men det virker ikke.
Tusind tak for hjælpen!
$oversigt = array(); $result = mysql_query("SELECT *, MONTH(dato) AS month, YEAR(dato) AS year FROM sider ORDER BY id") or die(mysql_error()); while ($row = mysql_fetch_assoc($result)) { $month = $row['month']; $year = $row['year']; $oversigt[$year][] = $row; $oversigt[$month][] = $row; }
Fejlen kommer nok i denne linje: foreach($oversigt[$month] as $item) { Den forsøger at læse $oversigt[$month], som ikke eksisterer. Det er fordi vi har sjusket, vi burde oprette alle månederne i $oversigt inden vi forsøger at putte titler i den.
Du kan rette denne linje: $oversigt = array(); Til: $oversigt = array(); for ($i=1; $i<=12; $i++) { $oversigt[$i] = array(); }
Og mht. år: Ville du ikke kun vise ét år af gangen, med link til forrige og næste?
myplacedk, er du begyndt at gå efter manden i stedet for bolden? Jeg synes den var under bælte stedet. Og når han selv kommer med noget kode, så kan man jo godt rette noget, uden det er et færdig produkt. (at det så ikke giver det ønskede resultat, er jo bare min mangel på viden og kodefærdigheder)
> myplacedk, er du begyndt at gå efter manden i stedet for bolden? Jeg betragter det slet ikke som en kamp.
> Jeg synes den var under bælte stedet. Huh? Hvilken "den"?
> Og når han selv kommer med noget kode, så kan man jo godt rette noget, uden det er et færdig produkt. Selvfølgelig. Men hvis man bare retter koden, og siger "prøv nu", og det virker, så vil de fleste blot sige "tak" uden at lære noget.
Yep. Det du ikke vil have udført, hvis der ikke er nogen poster, pakker du ind i en "if". Du kan evt. lave en "else"-sektion, hvor du skriver, at der ikke er nogen poster. Du kan se hvor mange poster der er med "count($oversigt[$month])".
foreach($months as $month=>$monthname) { echo '-'.$monthname.'-<br />'; foreach($oversigt[$month] as $item) { echo htmlspecialchars($item[title]).'(Skrevet d. '.$item['dato'].')<br />'; } }
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.