Avatar billede phpbegynder2004 Nybegynder
09. august 2005 - 23:55 Der er 16 kommentarer og
6 løsninger

Sorter i måneder

Hej,

Jeg har nogle poster liggende i en database.
Nu vil jeg så gerne hente dem ud så de bliver sorteret efter måneder.

Så det ser sådan ud:
-Januar-
Post 1 (Skrevet d. 15/1-05)
Post 2 (Skrevet d. 25/1-05)

Februar:
Post 3 (Skrevet d. 15/2-05)

Og så frem deles. Er det muligt?
Er det desuden muligt at lave sideskifte for hvert år?

På forhånd mange tak!
Avatar billede jakobdo Ekspert
10. august 2005 - 08:16 #1
I mysql har du funktionen: MONTH(dato) den giver den måneden for en given dato.
Så hvis du laver noget i stil med:
ORDER BY YEAR(dato), MONTH(dato)
Avatar billede jakobdo Ekspert
10. august 2005 - 08:17 #2
Det med at få det vist måned for måned, det skal du så også kode i php.
Avatar billede myplacedk Nybegynder
10. august 2005 - 08:38 #3
Den mest overskuelige måde er nok denne:

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 />';
  }
}
Avatar billede myplacedk Nybegynder
10. august 2005 - 08:44 #4
En simpel måde at lave det med år:

$year = (int)@$_GET['year'];
if ($year==0) {
  $year = date('Y'); // Sæt til nuværende år
}

Brug $year når du henter data fra databasen. Links kan så laves sådan her:

echo '<a href="?year='.($year-1).'">'.($year-1).'</a> - '.$year.' - <a href="?year='.($year+1).'">'.($year+1).'</a>';
Avatar billede phpbegynder2004 Nybegynder
11. august 2005 - 23:03 #5
Får den ikke helt rigtig...

$oversigt=mysql_query("SELECT MONTH(dato) AS month FROM sider ORDER BY dato")or die(mysql_error());
$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['overskrift']).' (Skrevet d. '.$item['dato'].')<br />';
  }
};
?>
Avatar billede myplacedk Nybegynder
12. august 2005 - 06:21 #6
Hvad er problemet?
Avatar billede myplacedk Nybegynder
12. august 2005 - 06:23 #7
...ud over at din første linje ikke giver mening. Prøv i stedet med: $oversigt = array();
Avatar billede jakobdo Ekspert
12. august 2005 - 07:56 #8
Test lige denne:

$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"
  );

$oversigt=mysql_query("SELECT MONTH(dato) AS month, overskrift, dato FROM sider ORDER BY dato")or die(mysql_error());
if(mysql_num_rows($oversigt) > 0)
{
    foreach($months as $month=>$monthname)
    {
      echo '-'.$monthname.'-<br />';
      $row = mysql_fetch_assoc($oversigt);
      if($row['month'] != $month)
      {
          break;
      }
        while($row = mysql_fetch_assoc($oversigt))
        {
            echo htmlspecialchars($item['overskrift']).' (Skrevet d. '.$item['dato'].')<br />';
      }
    }
}
else
{
    echo "Ingen ting i DB";
}
?>
Avatar billede myplacedk Nybegynder
12. august 2005 - 17:34 #9
jakobdo: Det vil kun udskrive dem i januar, undtagen den første.
Avatar billede jakobdo Ekspert
12. august 2005 - 20:28 #10
Hvad så med denne konstruktion:

$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"
  );

$oversigt=mysql_query("SELECT MONTH(dato) AS month, overskrift, dato FROM sider ORDER BY dato")or die(mysql_error());

if(mysql_num_rows($oversigt) > 0)
{
    foreach($months as $month=>$monthname)
    {
        echo '-'.$monthname.'-<br />';

        while(($row = mysql_fetch_assoc($oversigt)) && ($row['month'] == $month))
        {
            echo htmlspecialchars($item['overskrift']).' (Skrevet d. '.$item['dato'].')<br />';
        }
    }
}
else
{
    echo "Ingen ting i DB";
}
?>
Avatar billede myplacedk Nybegynder
12. august 2005 - 20:57 #11
Der vil mangle den første i hver måned, undtagen januar.
Avatar billede myplacedk Nybegynder
12. august 2005 - 21:06 #12
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;
}
Avatar billede phpbegynder2004 Nybegynder
12. august 2005 - 22:07 #13
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 />';
  }
}
Avatar billede myplacedk Nybegynder
12. august 2005 - 22:24 #14
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.
Avatar billede phpbegynder2004 Nybegynder
13. august 2005 - 00:23 #15
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;
}


$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($oversigt[$year] as $aarnavn) {
echo $aarnavn.'<br>';
foreach($months as $month=>$monthname) {
  echo '-'.$monthname.'-<br />';
  foreach($oversigt[$month] as $item) {
    echo htmlspecialchars($item[title]).'(Skrevet d. '.$item['dato'].')<br />';
  }
}
}
Avatar billede myplacedk Nybegynder
13. august 2005 - 08:32 #16
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?
Avatar billede jakobdo Ekspert
13. august 2005 - 09:31 #17
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)
Avatar billede myplacedk Nybegynder
13. august 2005 - 09:43 #18
> 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.
Avatar billede jakobdo Ekspert
13. august 2005 - 09:53 #19
Jeg vil give dig ret i den sidste.
Avatar billede phpbegynder2004 Nybegynder
13. august 2005 - 13:04 #20
Tak for hjælpen!
Avatar billede phpbegynder2004 Nybegynder
13. august 2005 - 13:39 #21
Blot en mindre detalje:
Hvis der ingen poster er i en måned, er det så muligt at spring den over?
Avatar billede myplacedk Nybegynder
13. august 2005 - 14:13 #22
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 />';
  }
}
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester