Avatar billede human Nybegynder
03. oktober 2006 - 18:25 Der er 73 kommentarer og
1 løsning

sortering efter måned

Hej

Jeg har brug for noget hjælp til at komme igang, da jeg er lidt blank på hvordan det kan gøres.

Jeg har nogle rækker i MySQL som indeholder et felt for hvornår de er blevet oprettet. Jeg kan sagtens finde ud af at trække alt indholdet ud, og det har jeg også gjort. Men det jeg også gerne vil, er at fx trække alt indholdet ud for oktober måned, og kun oktober. Samtidig skal der automatisk blive lavet et link hvor man kan klikke og så bliver alt indholdet for oktober vist. Det hele skal selvfølgelig ske automatisk. Dvs når vi nu kommer til december, skal et link automatisk blive oprettet, hvor man så kan se alt fra december måned.

Hvordan kan det laves?

På forhånd tak.
Avatar billede iss Novice
03. oktober 2006 - 18:27 #1
Kommer helt an på hvor smart du var da du lavede din database, hvilken type er feltet?
Avatar billede human Nybegynder
03. oktober 2006 - 18:29 #2
feltet hvor dato og tid står er datetime og gemt med NOW()
Avatar billede nielle Nybegynder
03. oktober 2006 - 18:29 #3
Hvis feltet er et datetimefelt, så er kommandoen for at få alt fra oktober noget i stil med dette:

SELECT * FROM dinTabel WHERE month(ditDatiFelt) = 9

'9' fordi at januar starter som 0.

Læs mere om month() og de andre dato-funktioner i MySQL her:

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
Avatar billede iss Novice
03. oktober 2006 - 18:30 #4
NOW() er en funktion, ikke en type... lav et struktur udtræk hvis du ikke ved hvad felt typen er.
Avatar billede human Nybegynder
03. oktober 2006 - 18:31 #5
jeg har lige skrevet et felt typen er datetime. og er gemt med NOW(). Altså...
Avatar billede iss Novice
03. oktober 2006 - 18:31 #6
Sorry, så ikke du skrev datetime, men så er nielle's svar det du skal bruge, og så er det op til din PHP til at lave links.
Avatar billede human Nybegynder
03. oktober 2006 - 18:34 #7
Tak nielle. Hvordan kan linksne laves automatisk og udføre den korrent sql forspørgsel?
Avatar billede nielle Nybegynder
03. oktober 2006 - 18:38 #8
Skal du kun have et link ... det for den aktuelle måned?

Ok hvad med posterne for f.eks. oktober 2005 ... skal de vises sammen med dem for oktober 2006?
Avatar billede michaeltryl Seniormester
03. oktober 2006 - 18:39 #9
der skal vel være en variabel som henter dags dato ud hvis der automatisk skal laves et link der viser alt fra f.eks december måned
evt
$maaned = date("n");
Avatar billede iss Novice
03. oktober 2006 - 18:42 #10
Noget med:
$_GET['month'] = (int)$_GET['month']
SELECT * FROM dinTabel WHERE month(ditDatiFelt) = $_GET['month']

Og laver linket til dette måned:
?month=<? echo date("n")-1;?>

Og så skal du lige huske året også...
Avatar billede human Nybegynder
03. oktober 2006 - 18:43 #11
fx

december 2006
december 2003

Lad os sige første link skal starte fra Oktober 2006, og derefter et link hvor hver eneste måned som kommer i fremtiden. Altså, linket skal selvfølgelig først oprettes når den nye måned starter.
Avatar billede iss Novice
03. oktober 2006 - 18:47 #12
Du overføre året på samme måde som måned:
$_GET['month'] = (int)$_GET['month'];
$_GET['year'] = (int)$_GET['year'];
SELECT * FROM dinTabel WHERE month(ditDatiFelt) = $_GET['month'] AND year(ditDatiFelt)
?month=<? echo date("n")-1;?>&year=<? echo date("Y")?>
Avatar billede iss Novice
03. oktober 2006 - 18:48 #13
Ups...

Du overføre året på samme måde som måned:
$_GET['month'] = (int)$_GET['month'];
$_GET['year'] = (int)$_GET['year'];
SELECT * FROM dinTabel WHERE month(ditDatiFelt) = $_GET['month'] AND year(ditDatiFelt) = $_GET['year']

og linket:
?month=<? echo date("n")-1;?>&year=<? echo date("Y")?>
Avatar billede iss Novice
03. oktober 2006 - 18:50 #14
Og om liket skal oprettes sørger du for ved at lave nogle if sætninger der tjekker om dato ligger før eller efter dd.
Avatar billede nielle Nybegynder
03. oktober 2006 - 18:52 #15
Linksiden kunne f.-eks. se nogenlunde sådan her ud:

$startYear = 2003;
$currentYear = idate("Y");
$currentMonth = idate("m");

$monthName = {"Januar", "Februar", "Marts", "April", ... }; // Fyld selv resten i

while ($year=$startYear; $year<$currentYear; $year++)
    while ($month=0; $month<=11; $month++)
        echo "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a>";

while ($month=0; $month<=$currentMonth; $month++)
    echo "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a>";
Avatar billede human Nybegynder
03. oktober 2006 - 19:01 #16
Hvor får du $month og $year fra?
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:03 #17
Hvem spørger du?
Avatar billede iss Novice
03. oktober 2006 - 19:04 #18
Hvem spørger du?
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:05 #19
:o)
Avatar billede human Nybegynder
03. oktober 2006 - 19:09 #20
Nielle. Sorry :)
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:11 #21
Ok. :^)

De fås fra de while-løkker som løber igennem alle årene og alle månederne.
Avatar billede human Nybegynder
03. oktober 2006 - 19:19 #22
$monthName = {"Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"};

Parse error: syntax error, unexpected '{'

Det eneste jeg gjorde var at fylde månederne i. Hvordan rettes fejlen?
Avatar billede iss Novice
03. oktober 2006 - 19:24 #23
Du skal bruge
$monthName = array("Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");
Avatar billede human Nybegynder
03. oktober 2006 - 19:27 #24
while ($year=$startYear; $year<$currentYear; $year++)

Parse error: syntax error, unexpected ';'
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:31 #25
Hvordan ser din kode ud nu?
Avatar billede human Nybegynder
03. oktober 2006 - 19:31 #26
<?php
$startYear = 2006;
$currentYear = idate("Y");
$currentMonth = idate("m");

$monthName = array("Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"); // Fyld selv resten i

while ($year=$startYear; $year<$currentYear; $year++)
    while ($month=0; $month<=11; $month++)
        print "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a>";

while ($month=0; $month<=$currentMonth; $month++)
    print "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a>";
?>
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:31 #27
Sludder! Det skal da være "for" i stedet for "while".
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:32 #28
Undskylder:


<?php
$startYear = 2006;
$currentYear = idate("Y");
$currentMonth = idate("m");

$monthName = array("Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"); // Fyld selv resten i

for ($year=$startYear; $year<$currentYear; $year++)
    for ($month=0; $month<=11; $month++)
        print "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a>";

for ($month=0; $month<=$currentMonth; $month++)
    print "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a>";
?>
Avatar billede human Nybegynder
03. oktober 2006 - 19:36 #29
Skrev date i stedet for idate, nu spiller det vist :)

Kan det gøres så den først starter med at tælle fra og med Oktober 2006?
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:41 #30
Det var nu med vilje at jeg brugte idate() i stedet for date().
Avatar billede human Nybegynder
03. oktober 2006 - 19:42 #31
Fatal error: Call to undefined function: idate().
Avatar billede iss Novice
03. oktober 2006 - 19:44 #32
idate er PHP5...
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:45 #33
Det er fordi at du brugere en lettere uddateret PHP. Måske burde du overveje at opgradere? Det er der andre gode grunde til. :^)
Avatar billede human Nybegynder
03. oktober 2006 - 19:47 #34
Så ser det ud til jeg skal rive mit webhotel rundt og bede om en opgradering :P
Ej, vil tingene stadig virke selvom jeg bruger date istedet for idate?

En sidste ting, kan det gøres så tælleren først starter fra Oktober 2006? Vel noget med startMonth = "Oktober"; Men kan ikke lige se hvordan det skal skrives ind i løkken.
Avatar billede iss Novice
03. oktober 2006 - 19:49 #35
Der skulle ikke være nogle problemer...
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:51 #36
<?php
$startYear = 2006;
$startMonth = 9;

$currentYear = idate("Y");
$currentMonth = idate("m");

$monthName = array("Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");

if ($currentYear == $startYear)
{
    for ($month=$startMonth; $month<=$currentMonth; $month++)
        print "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $currentYear</a>";
}
else
{
    for ($month=$startMonth; $month<=$currentMonth; $month++)
        print "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $startYear</a>";

    for ($year=$startYear+1; $year<$currentYear; $year++)
        for ($month=0; $month<=11; $month++)
            print "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a>";

    for ($month=0; $month<=$currentMonth; $month++)
        print "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $currentYear</a>";
}
?>
Avatar billede human Nybegynder
03. oktober 2006 - 19:54 #37
Smukt. November bliver dog også udskrevet. det skal den ikke før det er d.1 november :)
Avatar billede nielle Nybegynder
03. oktober 2006 - 19:58 #38
Ønsker du egentlig at der skal vises links selv om der ikke er nogle poster? Skal oktober f.eks. vises hvis der ikke er poster for den?

... og kan der komme novenber-poster i databasen hvis det endnu ikke r november?
Avatar billede human Nybegynder
03. oktober 2006 - 20:00 #39
Ja, der skal vises links selvom der ikke er nogle poster. Med mindre måneden ikke har været her endnu selvfølgelig.

nej, der kan ikke komme poster i en måned som ikke har været her endnu.
Avatar billede nielle Nybegynder
03. oktober 2006 - 20:02 #40
Jeg tænkte bare at det hele faktisk var nemmere hvis man viste links for de måneder/år som der var der, og så intet andet. Så opbår man også at der ikke er nogle links som føre til tomme sider.
Avatar billede human Nybegynder
03. oktober 2006 - 20:03 #41
Og der kan heller ikke komme nye poster i en måned som er overstået.
Avatar billede human Nybegynder
03. oktober 2006 - 20:05 #42
Hvis der ikke er nogle poster i en given måned. Så skal der være et link. Men linket skal ikke være et link.. Øhh :)

Altså lad os sige der ikke er nogle Poster i Oktober, så skal Oktober 2006 stadig udskrives, men det skal ikke være et link. Se det ville være smart! :)
Avatar billede nielle Nybegynder
03. oktober 2006 - 20:15 #43
Et bud:

$sql = "
SELECT month(ditDatoFelt) AS m, year(ditDatoFelt) AS y
FROM dinTabel
GROUP BY y, m
ORDER BY y ASC, m ASC";
$result = $query($sql) or die(mysql_error());

$row = mysql_fetch_assoc($result)
$year = $row["y"];
$month = $row["m"];
echo "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a>";

while ($row = mysql_fetch_assoc($result))
{
    $year2 = $row["y"];
    $month2 = $row["m"];

    while ($year2 != $year || $month2 != month)
    {
        print $monthName{$month} . " $year<br>";

        $month++;
        if ($month == 12)
        {
            $month = 0;
            $year++;
        }

        echo "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a><br>";
    }
}
Avatar billede nielle Nybegynder
03. oktober 2006 - 20:17 #44
Æhem:

$sql = "
SELECT month(ditDatoFelt) AS m, year(ditDatoFelt) AS y
FROM dinTabel
GROUP BY y, m
ORDER BY y ASC, m ASC";
$result = $query($sql) or die(mysql_error());

$row = mysql_fetch_assoc($result)
$year = $row["y"];
$month = $row["m"];
echo "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a>";

while ($row = mysql_fetch_assoc($result))
{
    $year2 = $row["y"];
    $month2 = $row["m"];

    while ($year2 != $year || $month2 != month)
    {
        echo $monthName{$month} . " $year<br>";

        $month++;
        if ($month == 12)
        {
            $month = 0;
            $year++;
        }
    }

    echo "<a href='getPosts.php?year=$year&month=$month'>" . $monthName{$month} . " $year</a><br>";
}
Avatar billede human Nybegynder
03. oktober 2006 - 20:22 #45
parse error: syntax error, unexpected T_VARIABLE in
$year = $row["y"];
som er linje 17
Avatar billede nielle Nybegynder
03. oktober 2006 - 20:24 #46
$row = mysql_fetch_assoc($result);
Avatar billede human Nybegynder
03. oktober 2006 - 20:29 #47
Parse error: syntax error, unexpected '<'
Det er den sidste linje i dokumentet.
Avatar billede human Nybegynder
03. oktober 2006 - 20:30 #48
Eller nej, det er det ikke. Det er ved </body>
Avatar billede iss Novice
03. oktober 2006 - 20:34 #49
Og du har afsluttet php med en ?> ?
Avatar billede nielle Nybegynder
03. oktober 2006 - 20:34 #50
Gætter på at det er fordi at du ikke har afsluttet din <?php ... ?> blok?
Avatar billede human Nybegynder
03. oktober 2006 - 20:43 #51
Ups:o)

Så har jeg en
Fatal error: Call to undefined function: () in line 14
$result = $query($sql) or die(mysql_error());
Avatar billede iss Novice
03. oktober 2006 - 20:46 #52
$result = mysql_query($sql) or die(mysql_error());
Avatar billede nielle Nybegynder
03. oktober 2006 - 20:47 #53
Jeg beklager alle mine bøffer, men du må nu gerne selv kigge lidt kritisk på koden før at du poster fejlene.

Det skal selvfølgelig være:

$result = $mysql_query($sql) or die(mysql_error());
Avatar billede nielle Nybegynder
03. oktober 2006 - 20:47 #54
Ups:

$result = mysql_query($sql) or die(mysql_error());
Avatar billede human Nybegynder
03. oktober 2006 - 20:50 #55
Super ingen fejl nu. Men den udskriver kun 2006. Ikke Oktober.
Avatar billede nielle Nybegynder
03. oktober 2006 - 20:52 #56
Prøv at retet alle stederne, med:

$monthName{$month}

- til:

$monthName[$month]
Avatar billede human Nybegynder
03. oktober 2006 - 21:02 #57
Det gjorde ingen synlig forskel
Avatar billede nielle Nybegynder
03. oktober 2006 - 21:05 #58
Hvordan ser koden ud nu?
Avatar billede human Nybegynder
03. oktober 2006 - 21:11 #59
<?php
require("../inkluder/conn_inc.php");
$sql = "
SELECT month(date) AS m, year(date) AS y
FROM news
GROUP BY y, m
ORDER BY y ASC, m ASC";
$result = mysql_query($sql) or die(mysql_error());

$row = mysql_fetch_assoc($result);
$year = $row["y"];
$month = $row["m"];
echo "<a href='getPosts.php?year=$year&month=$month'>" . $monthName[$month] . " $year</a>";

while ($row = mysql_fetch_assoc($result))
{
    $year2 = $row["y"];
    $month2 = $row["m"];

    while ($year2 != $year || $month2 != month)
    {
        echo $monthName[$month] . " $year<br>";

        $month++;
        if ($month == 12)
        {
            $month = 0;
            $year++;
        }
    }

    echo "<a href='getPosts.php?year=$year&month=$month'>" . $monthName[$month] . " $year</a><br>";
}
?>
Avatar billede nielle Nybegynder
03. oktober 2006 - 21:16 #60
Tilføj lige array-definitionen:

$monthName = array("Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");

- et eller andet sted i starten af koden.
Avatar billede human Nybegynder
03. oktober 2006 - 21:28 #61
Så virker det. Jeg prøvede lige at teste det lidt, ved at fjerne alle nyhederne i i tabellen. Hvis der ikk er nogen rækker i tabellen så udskrives Oktober 2006 ikke. Det skal det. Men ikke som et link
Avatar billede nielle Nybegynder
03. oktober 2006 - 21:29 #62
Sker det da nogensinde at der ikke er nogen rækker i tabellen?
Avatar billede human Nybegynder
03. oktober 2006 - 21:34 #63
Det kan det. Lad os sige det bliver den 1. november. men der først bliver postet noget den 5. november. Så kan november først ses på listen d. 5.
Avatar billede nielle Nybegynder
03. oktober 2006 - 21:39 #64
Men har du da ikke allerede mindst en række for oktober i tabellen?
Avatar billede human Nybegynder
03. oktober 2006 - 21:50 #65
Jo det har jeg. Dvs hvis der bare er et eller andet i tabellen så vil det altså virke på den rigtige måde? Jeg kan jo ikke rigtig teste det før det bliver den 1. nov ;).

Læg et svar nielle og iss.
Avatar billede nielle Nybegynder
03. oktober 2006 - 22:59 #66
Det er bestemt ikke fordi at man ikke kan kode det, men hvis det er kode som aldrig bliver brugt fordi at omstændighederne ikke er til det, så er det jo lidt noget spildt arbejde. :^)
Avatar billede human Nybegynder
03. oktober 2006 - 23:50 #67
Nej det rigtig nok. Tak for hjælpen :)

Venter lige til i morgen på iss, og ser om han smider et svar.
Avatar billede iss Novice
04. oktober 2006 - 00:10 #68
Så skal du vente meget længere end til i morgen... jeg samler ikke...
Avatar billede human Nybegynder
04. oktober 2006 - 00:25 #69
Hovsa.. jeg har fundet en fejl. Den udskriver November 2006 istedet for Oktober 2006.
Kan du rette det?
Avatar billede iss Novice
04. oktober 2006 - 00:57 #70
$monthName[$month-1] ville nok gøre det...
Avatar billede human Nybegynder
04. oktober 2006 - 01:22 #71
Hvor henne? Det står jo et par steder.
Avatar billede iss Novice
04. oktober 2006 - 03:00 #72
Så ret:
$monthName = array("Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");
til:
$monthName = array("", "Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");
Avatar billede nielle Nybegynder
04. oktober 2006 - 08:22 #73
Det undre mig nu at den skulle vise en forkert måned. month() giver 10 for datoer i november, og det stemmer pænt overens med at have månedsnavnene i et 0-indekseret array.
Avatar billede human Nybegynder
04. oktober 2006 - 13:30 #74
Jeg siger tak for hjælpen, det virker nu :)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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