Avatar billede canedo Nybegynder
03. marts 2003 - 09:51 Der 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.

Hvordan gør jeg?

<?php
$conn = mysql_connect("localhost", "roof");
mysql_select_db("foedselsdag");

$dage = time() + (60*60*24*30);
$datotil = ?
$datofra = ?

$result = mysql_query("SELECT * FROM personer WHERE Dato >= '$datofra' AND Dato <= '$datotil'");
print mysql_error();

while ($row = mysql_fetch_array($result)) {
$navn = $row["Navn"];

if ($navn == '') { echo "Ingen har f&oslash;dselsdag indenfor de n&aelig;ste 30 dage"; }

else {
echo "$navn";
}
}
?>
Avatar billede martinhrj Nybegynder
03. marts 2003 - 09:59 #1
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
Avatar billede canedo Nybegynder
03. marts 2003 - 10:17 #2
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.
Avatar billede martinhrj Nybegynder
03. marts 2003 - 10:39 #3
Godt argument!

Mon så ikke det skal se ud i stil med dette?
$datefra = date(j);
$mndfra = date(n);

if($mndfra==”12”)
  $mndtil=”1”;
else
  $mndtil= $mndfra+1;

$year = date(Y);

$daysinmonth = date(t, mktime (0,0,0,1,$mndtil,$year);

if($datefra>$daysinmonth)
  $datetil = $daysinmonth;
else
  $datetil = $datefra;

SELECT * FROM table WHERE (dato>$datefra AND mnd>$mndfra) AND (dato<$datetil AND mnd<$mndtil)
Avatar billede canedo Nybegynder
03. marts 2003 - 10:57 #4
måske et dumt spørgsmål, men hvad betyder
$datefra = date(j);
$mndfra = date(n);
?
Avatar billede martinhrj Nybegynder
03. marts 2003 - 11:04 #5
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
Avatar billede canedo Nybegynder
03. marts 2003 - 11:13 #6
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?
Avatar billede martinhrj Nybegynder
03. marts 2003 - 11:19 #7
du gør bare som jeg skrev før...

SELECT * FROM table WHERE (dato>$datefra AND mnd>$mndfra) AND (dato<$datetil AND mnd<$mndtil)

hvor dato er dit feldt med datoen, og mnd er dit feldt med måneden i tabellen.
Avatar billede canedo Nybegynder
03. marts 2003 - 11:36 #8
Jeg får en "Parse Error" - unexpected ';' på linje 40.

mit script er her:
<?php
$conn = mysql_connect("localhost", "roof");
mysql_select_db("foedselsdag");

#$dage = time() + (60*60*24*30);



$datefra = date(j);
$mndfra = date(n);

if($mndfra=="12")
  $mndtil="1";
else
  $mndtil= $mndfra+1;

$year = date(Y);

$daysinmonth = date(t, mktime (0,0,0,1,$mndtil,$year); #linje 40

if($datefra>$daysinmonth)
  $datetil = $daysinmonth;
else
  $datetil = $datefra;




$result = mysql_query("SELECT * FROM personer WHERE (dato>$datefra AND mnd>$mndfra) AND (dato<$datetil AND mnd<$mndtil);
print mysql_error();

while ($row = mysql_fetch_array($result)) {
$navn = $row["Navn"];

if ($navn == '') { echo "Ingen bøger skal afleveres indenfor de næste 30 dage"; }

else {
echo "$navn";
}
}
?>
Avatar billede martinhrj Nybegynder
03. marts 2003 - 12:12 #9
echo "$navn";

skal erstattes med

echo $navn;

Det er ikke nødvendigt at have "" uden om en variabel i PHP.
Avatar billede canedo Nybegynder
03. marts 2003 - 12:18 #10
Nu, får jeg igen denne fejl, men på linje 39:
$daysinmonth = date(t, mktime (0,0,0,1,$mndtil,$year);
Avatar billede martinhrj Nybegynder
03. marts 2003 - 12:21 #11
Der mangler vist en ) lige før ;

$daysinmonth = date(t, mktime (0,0,0,1,$mndtil,$year));
Avatar billede canedo Nybegynder
03. marts 2003 - 12:26 #12
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"; }

else {
echo $navn;
}
}
Avatar billede martinhrj Nybegynder
03. marts 2003 - 12:31 #13
prøv at bytte de 2 " ud med ' i ["Navn"]

Hvis det ikke virker... så prøv at skrive
$searchfor = "Navn";
før while....
og byt "Navn" ud med $searchfor

Så krydser vi fingre for det :)
Avatar billede canedo Nybegynder
03. marts 2003 - 12:36 #14
Nu får jeg denne fejl:
PHP Parse error: parse error, unexpected T_STRING in c:\inetpub\wwwroot\php\hiphurra\main.php3 on line 52

Mit script:

$result = mysql_query("SELECT * FROM personer WHERE (dato>$datefra AND mnd>$mndfra) AND (dato<$datetil AND mnd<$mndtil);
print mysql_error();

$searchfor = "Navn"; #52
while ($row = mysql_fetch_array($result)) {
$searchfor = $row['Navn'];

if ($searchfor == '') { echo "Ingen bøger skal afleveres indenfor de næste 30 dage"; }

else {
echo $searchfor;
}
}
?>
Avatar billede martinhrj Nybegynder
03. marts 2003 - 12:41 #15
Arh! Så kom de udslagsgivne linier med :)

$result = mysql_query("SELECT * FROM personer WHERE (dato>$datefra AND mnd>$mndfra) AND (dato<$datetil AND mnd<$mndtil);

Her mangler der en ") til sidst... ellers hænger det ikke helt sammen :)

$result = mysql_query("SELECT * FROM personer WHERE (dato>$datefra AND mnd>$mndfra) AND (dato<$datetil AND mnd<$mndtil)");
Avatar billede canedo Nybegynder
03. marts 2003 - 12:49 #16
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
Avatar billede martinhrj Nybegynder
03. marts 2003 - 12:55 #17
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);
Avatar billede canedo Nybegynder
03. marts 2003 - 13:28 #18
Jeg har ikke noget felt "Dato" eller "Date". Jeg har nemlig tre kolonner: Dag, Mdr og Aar...
Avatar billede martinhrj Nybegynder
03. marts 2003 - 13:32 #19
Arh! Så skal denne linie
$result = mysql_query("SELECT * FROM personer WHERE (dato>$datefra AND mnd>$mndfra) AND (dato<$datetil AND mnd<$mndtil)");

ændres til
$result = mysql_query("SELECT * FROM personer WHERE (Dag>$datefra AND Mdr>$mndfra) AND (Dag<$datetil AND Mdr<$mndtil)");
Avatar billede canedo Nybegynder
03. marts 2003 - 13:33 #20
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

$searchfor = "Navn"; #52
while ($row = mysql_fetch_array($result)) {
$searchfor = $row['Navn']
Avatar billede martinhrj Nybegynder
03. marts 2003 - 13:35 #21
Jeg kan iøvrigt anbefale dig (hvis du vil videre med PHP) den gratis manual der kan findes her
http://www.php.net/docs.php
Avatar billede canedo Nybegynder
03. marts 2003 - 13:36 #22
okAY, nu får jeg ingen medd., men... den viser ikke listen med folk, som har fødselsdag i denne måned...
Avatar billede martinhrj Nybegynder
03. marts 2003 - 13:36 #23
Prøv lige at poste det du er kommet frem til indtil videre...
Avatar billede canedo Nybegynder
03. marts 2003 - 13:41 #24
<?php
$conn = mysql_connect("localhost", "roof");
mysql_select_db("foedselsdag");

$dage = time() + (60*60*24*30);
$datefra = date('j');
$mndfra = date('n');

if($mndfra=="12")
  $mndtil="1";
else
  $mndtil= $mndfra+1;

$year = date('Y');

$daysinmonth = date('t', mktime (0,0,0,1,$mndtil,$year));

if($datefra>$daysinmonth)
  $datetil = $daysinmonth;
else
  $datetil = $datefra;




$result = mysql_query("SELECT * FROM personer WHERE (Dag>$datefra AND Mdr>$mndfra) AND (Dag<$datetil AND Mdr<$mndtil)");
print mysql_error();

$searchfor = "Navn";
while ($row = mysql_fetch_array($result)) {
$searchfor = $row['Navn'];

if ($searchfor == '') { echo "Ingen har f&oslash;dselsdag indenfor de næste 30 dage"; }

else {
echo $searchfor;
}
}
?>
Avatar billede martinhrj Nybegynder
03. marts 2003 - 13:49 #25
$searchfor = "Navn";
while ($row = mysql_fetch_array($result)) {
$searchfor = $row['Navn'];

det er her problemet er... Du skriver ikke noget ud, på noget tidspunkt!

Prøv at skrive

echo $row['Navn'];

i stedet for sidste linie!

For det at den ikke skriver noget, tyder jo på at den ikke laver fejl. Og DET er jo positivt :)
Avatar billede martinhrj Nybegynder
03. marts 2003 - 13:50 #26
Lige en ting til! Denne skal så også ændres...
if ($searchfor == '')

evt til
if($row['Navn'] =='')
Avatar billede martinhrj Nybegynder
03. marts 2003 - 13:51 #27
hehe... jeg fortsætter... når du så har ændret det, er der jo ingen grundt il at beholde linien
$searchfor = "Navn";
Avatar billede canedo Nybegynder
03. marts 2003 - 13:51 #28
Jeg har nu dette:

$searchfor = "Navn";
while ($row = mysql_fetch_array($result)) {
$searchfor = $row['Navn'];

if ($searchfor == '') { echo "Ingen har &oslash;dselsdag indenfor de n&aelig;ste 30 dage"; }

else {
echo $row['Navn'];

}
}

Men der er stadig intet at se...
Avatar billede martinhrj Nybegynder
03. marts 2003 - 13:56 #29
Hmm... spøjst! prøv at skrive
echo 'halo haløj... så langt så godt';

lige efter linien
echo $row['Navn'];

og se om den overhovedet kommer dertil...
Avatar billede canedo Nybegynder
03. marts 2003 - 14:00 #30
hmm... det skriver den ikke, den kommer åbenbart ikke helt dertil.
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:05 #31
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!
Avatar billede canedo Nybegynder
03. marts 2003 - 14:09 #32
Den vil gerne skrive det der står over while, men ikke det der står under...
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:13 #33
OK! Vent lidt... jeg prøver lige at lave nogle rettelser! Der går lige nogle minutter!
Avatar billede canedo Nybegynder
03. marts 2003 - 14:14 #34
vil du ha mit script, som det ser ud pt?
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:19 #35
Hehe.. for sent :)

Prøv at erstatte dit med følgende (husk lige at gemme en backup af dit eget!):

<?php
$conn = mysql_connect("localhost", "roof");
mysql_select_db("foedselsdag");

$dage = time() + (60*60*24*30);
$datefra = date('j');
$mndfra = date('n');

if($mndfra=="12")
  $mndtil="1";
else
  $mndtil= $mndfra+1;

$year = date('Y');

$daysinmonth = date('t', mktime (0,0,0,1,$mndtil,$year));

if($datefra>$daysinmonth)
  $datetil = $daysinmonth;
else
  $datetil = $datefra;


$sql = "SELECT * FROM personer WHERE (Dag>$datefra AND Mdr>$mndfra) AND (Dag<$datetil AND Mdr<$mndtil)";
echo $sql;

$result = mysql_query($sql);
print mysql_error();

$numrows = mysql_NumRows($result);
echo $numrows;
if($numrows==0){
  echo'Der er ikke nogen der har fødselsdag inden for de næste 30 dage';
}

$x = 0;
while ($numrows>0;) {
    $RName=mysql_result($result,$x,"Navn");

echo $RName;

$numrows--;
$x++;
}
?>
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:19 #36
Prøv så at køre det, og poste en kopi af hvad den skriver!
Avatar billede canedo Nybegynder
03. marts 2003 - 14:24 #37
Nu skriver den:
PHP Parse error: parse error, unexpected ';' in c:\inetpub\wwwroot\php\hiphurra\main.php3 on line 57

$x = 0; #56
while ($numrows>0;) {
    $RName=mysql_result($result,$x,"Navn");

echo $RName;
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:27 #38
ups... prøv lige at fjerne ;'et efter 0 i linie 57... Det er jo det der sker, når man ikke kan teste det :)
Avatar billede canedo Nybegynder
03. marts 2003 - 14:38 #39
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
Avatar billede canedo Nybegynder
03. marts 2003 - 14:42 #40
... men selvom jeg har lavet en post i db hvor fødselsdatoen er den 8. marts, så skrives den ikke ud.
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:43 #41
OK! Har du en "front" til din database? Hvor du kan skrive sql i?
Avatar billede canedo Nybegynder
03. marts 2003 - 14:43 #42
jeg bruger PHPAdmin.
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:44 #43
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)";
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:45 #44
Det nytter jo ikke noget at finde en måned der er større end 3 og mindre end 4 :)

Nu er den så større end eller lig med 3 og mindre end eller lig med 4...
Avatar billede canedo Nybegynder
03. marts 2003 - 14:49 #45
.... 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
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:53 #46
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...
Avatar billede canedo Nybegynder
03. marts 2003 - 14:53 #47
kan det være fordi der skal "0" foran $datefra og mndfra...?
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:54 #48
Er de feldter forøvrigt varchar? Det ville måske også være nemmere hvis de var af typen int... men lad os nu vente lidt med det :)
Avatar billede canedo Nybegynder
03. marts 2003 - 14:55 #49
OK, nu har jeg ændret datoen til 3 og 9 uden nul foran, men jeg den listes stadig ikke.
Avatar billede canedo Nybegynder
03. marts 2003 - 14:56 #50
skal jeg lave felterne om til int?
Avatar billede martinhrj Nybegynder
03. marts 2003 - 14:57 #51
prøv at kør følgende sql i din PHPadmin
SELECT * FROM personer WHERE (Dag>=3 AND Mdr>=3) AND (Dag<=3 AND Mdr<=4)

og se om den giver svar!
Avatar billede canedo Nybegynder
03. marts 2003 - 14:58 #52
Jeg har lige ændret Dag og Mdr til type INT, men det ænder tilsyneladende intet. Posterne listes stadig ikke.
Avatar billede canedo Nybegynder
03. marts 2003 - 15:02 #53
I phpAdmin giver det intet resultat... den finder ingen poster. Underligt.
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:02 #54
Nææ.. ikke så underligt.. jeg er lige kommet til at kigge på sql forespørgslen igen... den laver jeg lige om!
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:08 #55
Prøv dette i stedet for den tidligere linie...

$sql = "SELECT * FROM personer WHERE (Dag>$datefra AND Mdr=$mndfra) or (Dag<$datetil AND Mdr=$mndtil)";
Avatar billede eagleeye Praktikant
03. marts 2003 - 15:12 #56
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)
Avatar billede eagleeye Praktikant
03. marts 2003 - 15:13 #57
hmm for sent, sorry martinhrj.
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:14 #58
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 :)
Avatar billede canedo Nybegynder
03. marts 2003 - 15:15 #59
YES! nu virker det! langt om længe! Tusind tak for hjælp og tålmodighed.
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:15 #60
helt i orden eagleeye! Jeg er ikke en "ørn" (hehe) til SQL... men det bliver da bedre :-)
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:16 #61
Så lidt så lidt! Så føler man da man har udrettet lidt, på sådan en sygedag :)
Avatar billede canedo Nybegynder
03. marts 2003 - 15:17 #62
læg et svar martinhrj :)
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:18 #63
Hehe... der kom jeg dig lidt i forkøbet ;)
Avatar billede erikjacobsen Ekspert
03. marts 2003 - 15:26 #64
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).

Jeg har en løsning, der vistnok virker :)
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:30 #65
if($mndfra=="12")
  $mndtil="1";
else
  $mndtil= $mndfra+1;

burde det ikke få det til at virke over nytår?

Sandt nok! sortering er der ikke taget højde for!
Avatar billede canedo Nybegynder
03. marts 2003 - 15:32 #66
erikjacobsen > her er den endelige version (uden designmæssige skønheds rettelser)

<?php
$conn = mysql_connect("localhost", "roof");
mysql_select_db("foedselsdag");

$dage = time() + (60*60*24*30);
$datefra = date('j');
$mndfra = date('n');

if($mndfra=="12")
  $mndtil="1";
else
  $mndtil= $mndfra+1;

$year = date('Y');

$daysinmonth = date('t', mktime (0,0,0,1,$mndtil,$year));

if($datefra>$daysinmonth)
  $datetil = $daysinmonth;
else
  $datetil = $datefra;


$sql = "SELECT * FROM personer WHERE (Dag>$datefra AND Mdr=$mndfra) or (Dag<$datetil AND Mdr=$mndtil)";
#echo $sql;

$result = mysql_query($sql);
print mysql_error();

$numrows = mysql_NumRows($result);
echo $numrows;
if($numrows==0){
  echo'Der er ikke nogen der har fødselsdag inden for de næste 30 dage';
}

$x = 0;
while ($numrows>0) {
    $RName=mysql_result($result, $x, "Navn");

echo "<br>" . $RName;

$numrows--;
$x++;
}

?>

Jeg ved ikke hvorvidt det virker hen over nytår, men... du kan måske gennemskue det?
Avatar billede erikjacobsen Ekspert
03. marts 2003 - 15:32 #67
"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.
Avatar billede erikjacobsen Ekspert
03. marts 2003 - 15:33 #68
Hvis det fungerer - og der må I hellere teste det - så kan det i hvert
fald ikke generaliseres til fx 60 dage.
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:36 #69
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 :)
Avatar billede canedo Nybegynder
03. marts 2003 - 15:41 #70
:) 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?
Avatar billede erikjacobsen Ekspert
03. marts 2003 - 15:43 #71
:) - 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 ...
Avatar billede canedo Nybegynder
03. marts 2003 - 15:49 #72
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 :-)
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:52 #73
Det var da rart at vide... Så er spørgsmålet bare, om den lister dem i den rigtige rækkefølge?
Avatar billede canedo Nybegynder
03. marts 2003 - 15:55 #74
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.
Avatar billede erikjacobsen Ekspert
03. marts 2003 - 15:58 #75
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.
Avatar billede martinhrj Nybegynder
03. marts 2003 - 15:58 #76
;) Glimrende !
Avatar billede canedo Nybegynder
03. marts 2003 - 16:01 #77
ja, okay. Jeg vender tilbage i morgen. Så fylder jeg i mellemtiden min database godt op med fødselsdage i forskellig rækkefølge.
Avatar billede canedo Nybegynder
03. marts 2003 - 22:06 #78
hmm.... okay, nu har jeg opdaget en fejl. Den sorterer ikke rigtigt. Den sorterer efter ... foreste tal i kolonnen "Dag", hvor skal der rettes?
Avatar billede martinhrj Nybegynder
03. marts 2003 - 22:30 #79
Du skal i slutningen af din SQL-linie skrive:

ORDER BY `Mdr`,`Dag` ASC

Hvis den så sorterer dem i omvendt rækkefølge, skal du skrive DESC i stedet for ASC... Jeg kan ikke lige huske hvilken du skal skrive :)
Avatar billede canedo Nybegynder
04. marts 2003 - 09:10 #80
Jeg har nu lavet min SQL med tilføjelse af: ORDER BY `Mdr`,`Dag` DESC, og resultatet bliver:

Dorthe 17. jan 1976
Leif 7. jan 1951
Pia 27. dec 1977
Birgit 23. dec

Ændrer jeg så SQL'en til: ORDER BY `Mdr`,`Dag` ASC får jeg:

Leif 7. jan 1951
Dorthe 17. jan 1976
Birgit 23. dec
Pia 27. dec 1977

Ingen af delene virker helt perfekt. Kan det hjælpe at sætte "0" foran alle værdierne som er under 10? Eller skal der tilføjes noget mere SQL kode?
Avatar billede canedo Nybegynder
04. marts 2003 - 09:15 #81
Eller kunne man forestille sig noget lignende: If mdr(now)=dec then order by ... et eller andet?
Avatar billede martinhrj Nybegynder
04. marts 2003 - 09:30 #82
Prøv om dette virker!

if($mndfra=="12")
  $sql = "... ORDER BY `Mdr` DESC,`Dag` ASC";
else
  $sql = "... ORDER BY `Mdr`,`Dag` ASC";

Jeg er i tvivl om, hvorvidt den første sql linie er tilladt... men det er da et forsøg værd!
Avatar billede martinhrj Nybegynder
04. marts 2003 - 09:34 #83
Så fik jeg det lige testet! Og det er tilladt! Så mon ikke det burde virke?
Avatar billede martinhrj Nybegynder
04. marts 2003 - 09:47 #84
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?
Avatar billede canedo Nybegynder
04. marts 2003 - 10:04 #85
Ja, jeg har lavet mine felter til int, selvom "0" ikke kommer med foran 1,2,3... men jeg tester lige det du har skrevet.
Avatar billede canedo Nybegynder
04. marts 2003 - 10:11 #86
yes! det virker perfekt efter hensigten, - visningen er korrekt både i november, december, januar og august måned :-) Tusind tak for hjælpen!
Avatar billede canedo Nybegynder
04. marts 2003 - 10:12 #87
- og god bedring, - selvom det nu er rart med sådan en som dig, som hjælper på eksperten på sine sygedage :)
Avatar billede martinhrj Nybegynder
04. marts 2003 - 10:12 #88
NP!
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