03. marts 2003 - 09:51Der er
87 kommentarer og 1 løsning
Beregn fødselsdag
Jeg er igang med at lave et script som viser en liste over hvem der har fødselsdag indenfor de næste 30 dage. Jeg har 3 felter i min database: Dag (dd), Mdr (mm) og Aar (yyyy). Jeg har lavet det nedenstående, men mangler at lave værdierne til variablerne $datotil og $datofra for at få det til at virke.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Umiddelbart vil jeg foreslå dig at bruge den mysql-tabeltype der hedder date. Den er på formen yyyy-mm-dd. Og så kan du lettere slå op efter fra og til dato.
$startdate = mktime (0,0,0,3,2,2003); $enddate = mktime (0,0,0,4,2,2003); SELECT * FROM tabel WHERE date>$startdate AND date<$enddate
Ja, men så beregnes der jo fra f.eks. 03.09.1978, og det er jo ikke meningen. Jeg har delt min database op i seperate tekstfelter, for at kunne adskille år fra resten. Systemet skal beregne en årlig begivenhed - hen over nytår.
date(j) angiver datoen som tal. Fx. idag: 2 , da vi har d. 2.3
date(n) angiver måneden som tal. fx. idag: 3 , da vi har d. 2.3
Her er hvad du ellers kan angive:
a - "am" or "pm" A - "AM" or "PM" B - Swatch Internet time d - day of the month, 2 digits with leading zeros; i.e. "01" to "31" D - day of the week, textual, 3 letters; e.g. "Fri" F - month, textual, long; e.g. "January" g - hour, 12-hour format without leading zeros; i.e. "1" to "12" G - hour, 24-hour format without leading zeros; i.e. "0" to "23" h - hour, 12-hour format; i.e. "01" to "12" H - hour, 24-hour format; i.e. "00" to "23" i - minutes; i.e. "00" to "59" I (capital i) - "1" if Daylight Savings Time, "0" otherwise. j - day of the month without leading zeros; i.e. "1" to "31" l (lowercase 'L') - day of the week, textual, long; e.g. "Friday" L - boolean for whether it is a leap year; i.e. "0" or "1" m - month; i.e. "01" to "12" M - month, textual, 3 letters; e.g. "Jan" n - month without leading zeros; i.e. "1" to "12" O - Difference to Greenwich time in hours; e.g. "+0200" r - RFC 822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200" (added in PHP 4.0.4) s - seconds; i.e. "00" to "59" S - English ordinal suffix for the day of the month, 2 characters; i.e. "st", "nd", "rd" or "th" t - number of days in the given month; i.e. "28" to "31" T - Timezone setting of this machine; e.g. "EST" or "MDT" U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday) W - ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0) Y - year, 4 digits; e.g. "1999" y - year, 2 digits; e.g. "99" z - day of the year; i.e. "0" to "365" Z - timezone offset in seconds (i.e. "-43200" to "43200"). The offset for timezones west of UTC is always negative, and for those east of UTC is always positive.
Og et par eksempler:
/* Today is March 10th, 2001, 5:16:18 pm */ $today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm $today = date("m.d.y"); // 03.10.01 $today = date("j, n, Y"); // 10, 3, 2001 $today = date("Ymd"); // 20010310 $today = date('h-i-s, j-m-y, it is w Day z '); // 05-16-17, 10-03-01, 1631 1618 6 Fripm01 $today = date('\i\t \i\s \t\h\e jS \d\a\y.'); // It is the 10th day. $today = date("D M j G:i:s T Y"); // Sat Mar 10 15:16:08 MST 2001 $today = date('H:m:s \m \i\s\ \m\o\n\t\h'); // 17:03:17 m is month $today = date("H:i:s"); // 17:16:17
Okay, så skal jeg i min sql-streng have ændret så det ikke kun er WHERE Dato, men hvor det gælder flere felter, fordi min dato jo ligger i 3 forskellige felter, hvordan skal min SQL så se ud?
Nu får jeg: PHP Parse error: parse error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRING in c:\inetpub\wwwroot\php\hiphurra\main.php3 on line 53
while ($row = mysql_fetch_array($result)) { #52 $navn = $row["Navn"]; #53
if ($navn == '') { echo "Ingen bøger skal afleveres indenfor de næste 30 dage"; }
Hmm.... nu kan siden da vises, men jeg får nu disse meddelelser:
Unknown column 'dato' in 'where clause'
PHP Notice: Use of undefined constant j - assumed 'j' in c:\inetpub\wwwroot\php\hiphurra\main.php3 on line 29 PHP Notice: Use of undefined constant n - assumed 'n' in c:\inetpub\wwwroot\php\hiphurra\main.php3 on line 30 PHP Notice: Use of undefined constant Y - assumed 'Y' in c:\inetpub\wwwroot\php\hiphurra\main.php3 on line 37 PHP Notice: Use of undefined constant t - assumed 't' in c:\inetpub\wwwroot\php\hiphurra\main.php3 on line 39 PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\inetpub\wwwroot\php\hiphurra\main.php3 on line 53
Hmm... mon ikke det første er fordi du har kaldt dit feldt for date i tabellen?
Derefter kommer der noget som siger at jeg er en idiot :( Du skal lige skrive ' rundt om j, n og Y hvor du hat date() funktioner. Fx. date('j'); i stedet for date(j);
Nu får jeg denne fejlmrdd.: PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in c:\inetpub\wwwroot\php\hiphurra\main.php3 on line 53
OK! Prøv at flytte den linie op over while... og så skriv en linie magen til (du skal dog kunne kende forskel på teksten den skriver) og sæt den lige under while-linien! Kør så "skidtet" og se hvad den skriver!
hmmm.... måske nærmer vi os. Her er det den skriver ud nu: SELECT * FROM personer WHERE (Dag>3 AND Mdr>3) AND (Dag<3 AND Mdr<4)0Der er ikke nogen der har fødselsdag inden for de næste 30 dage
hehe... logisk!!!! $sql = "SELECT * FROM personer WHERE (Dag>$datefra AND Mdr>$mndfra) AND (Dag<$datetil AND Mdr<$mndtil)"; skal være $sql = "SELECT * FROM personer WHERE (Dag>=$datefra AND Mdr>=$mndfra) AND (Dag<=$datetil AND Mdr<=$mndtil)";
.... stadig intet held :-) Jeg får igen denne udskrift: SELECT * FROM personer WHERE (Dag>=3 AND Mdr>=3) AND (Dag<=3 AND Mdr<=4)0Der er ikke nogen der har fødselsdag inden for de næste 30 dage
I min db har jeg bl.a. posterne: Navn Noter Berorer Id Dag Mdr Aar Buller 1 38 09 03 Hanne 1 39 01 04 2003
Ork... så skal du tage en beslutning... vil du skrive dato og måned som eks 03 eller som 3? Jeg tror det er lettest i længden at skrive 3, og droppe 0 foran...
Prøv at ændre det ved de 2 du har skrevet op her... så buller.dag = 9 osv...
Hvis vi tager udagspunkt i 3/3-2002 så skal din SQL se sådan her ud hvor 4 kommer af 3+1 dog skal du huske at laves noget kode som tjekke hvis månede er = 12 så er næste måned jo januar 1:
SELECT * FROM personer WHERE (Dag>=3 AND Mdr=3) OR (Dag<=3 AND Mdr=4)
Og hvis vi giver eagleeye ret (hvilket vi gør!) så er strengen ændret en smule igen (for at medtage dags dato!) $sql = "SELECT * FROM personer WHERE (Dag>=$datefra AND Mdr=$mndfra) or (Dag<=$datetil AND Mdr=$mndtil)";
Og PHPkoden checker allerede for om det er 12. mnd :)
Jeg er ikke helt sikker på hvilken version, der blev den endelige, men jeg er altså ikke sikker på at det I laver virker henover nytår. Bliver det også sorteret korrekt (voksende dato - formoder jeg I ønsker).
"burde det ikke" --- ja, jeg har set koden, men virker det. Hvis vi nu er den 15. december og kigger 30 dage frem, og der er spredt lidt fødselsdage ud sidst i december og først i januar. Jeg er ikke overbevist, men kan tage fejl.
Jeg vil lade canedo teste det! om det kan generaliseres til et andet antal dage... enig! Det kan det ikke! Men det var jo heller ikke en del af kravet :)
:) ja, jeg har kun behov for at det skal kunne liste dem der har fødselsdag indenfor de næste 30 dage, og ikke mere end 30 dage. På på den måde så lever det jo op til formålet. Hvorvidt det virker hen over nytår - det kan jeg slet ikke gennemskue.
Kan man prøve at instille tiden på PC'en og lave nogle fødselsdage i december og januar? Eller skal vi vente og se?
:) - du skulle tage og prøve. Jeg kunne måske - men gider ikke - finde ud af det ud fra koden. Nu er det jo ikke ligefrem styring af et atomkraftværk, så du kan jo også bare vente ...
ja :D det virker skam hen over nytår... jeg har sat min dato på computeren til den 3. dec, og indtastede 2 fødselsdage i december og 2 i januar, den lister dem rigtigt :-)
Den lister først den person med fødselsdag i december og så den i januar :-) Det virker efter alt at dømme helt efter hensigten. Godt vi fik det helt på plads.
Om den lister den korrekt afhænger af rækkefølgen de står i databasen. Så sætter du flere ind, blandet, så vil de ikke blive korrekte ... ;)
Men ok - det virker. Prøv lige med den 15. december og så noget flere fødselsdage i de to måneder, og iøvrigt også andre steder på året. Altså fyld din kalender ret godt op.
Men det kræver at dine fields er af typen int (eller lignende)! Ellers sorteres dag 10 før dag 2... og det er jo ikke meningen :) Men det havde du vist allerede lavet om?
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.