03. februar 2009 - 21:26
Der er
38 kommentarer og 1 løsning
Matche testere ved alder
Hejsa. Når mine brugere opretter sig, skal de sætter deres fødselsdagsdato som dd-mm-yyyy, f.eks 08-02-1999 Jeg skal så lave et system, som kan matche testere som er i en bestemt målgruppe - f.eks hvis der er en målgruppe fra 0-10 år, så skal den finde brugere, som er højest 10 år. Hvordan gøres dette, når jeg har lavet systemet således, at brugerne skriver dd-mm-yyyy? På forhånd tusind tak!
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
03. februar 2009 - 21:48
#1
Dette virker for mig. <?php $date = ##Din dato##; list($day,$month,$year) = explode("-",$date); $time = mktime(0,0,0,$month,$day,$year); if($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-10)) && $time <= time()){ $aldersgruppe = "0-10"; } ?>
03. februar 2009 - 21:48
#2
Altså, jeg har disse informationer fra målgrupper: 0-10 11-20 21-25 f.eks. Brugernes aldre er som dd-mm-yyyy. Hvordan kan jeg få f.eks "0-10" til at matche med "dd-mm-yyyy".
03. februar 2009 - 21:49
#3
Du gemmer det naturligvis som en DATE i mysql, altså yyyy-mm-dd - så er det bare at lave en query som f.eks. SELECT * FROM brugere WHERE birthdate > DATE_SUB(NOW(),INTERVAL 10 YEAR) eller noget i den stil :)
03. februar 2009 - 21:53
#4
For alle tre aldersgrupper bliver mit eksempel altså: <?php $date = ## Din dato ##; list($day,$month,$year) = explode("-",$date); $time = mktime(0,0,0,$month,$day,$year); if($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-10)) && $time <= time()){ $aldersgruppe = "0-10"; } elseif($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-20)) && $time <= mktime(0,0,0,date("n"),date("j"),(date("Y")-11))){ $aldersgruppe = "11-20"; } elseif($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-25)) && $time <= mktime(0,0,0,date("n"),date("j"),(date("Y")-21))){ $aldersgruppe = "21-25"; } ?> Jeg har testet det med forskellige fødselsdage og fundet at scriptet virker.
03. februar 2009 - 21:54
#5
coder, jeg siger jeg gemmer som dd-mm-yyyy, så gemmer den nok ikke som yyyy-mm-dd :-) psychopixi: Kan du forklare lidt mere om hvad din funktion gør? Hvad hvis jeg f.eks vil udtrække alle brugere i min tabel, som er mellem 0-10 år? Kan du give et eksempel på dette, så du alletiders. TAK!
03. februar 2009 - 21:54
#6
Hvis MySQL så prøv: SELECT * FROM dintabel WHERE foedselsdag >= DATE_SUB(NOW(), INTERVAL 10 YEAR)
03. februar 2009 - 21:55
#7
jespernerd, Ja, jeg prøver at fortælle dig, at du skal gemme i et andet format. Tilføj et nyt felt, lav en UPDATE hvor du konverterer den gamle kolonne til det nye format, hvorefter du retter i din kode til at bruge den nye, og så fjerner den gamle. Problem løst, på den rigtige måde, vel at mærke ;)
03. februar 2009 - 21:57
#8
arne - INTERVAL 10 years -- øøh....?? Hvad vil det sige? Kender ikke den funktion, sorry! og hvordan skal foedselsdag i databasen så defineres? er dd-mm-yyyy godt nok??
03. februar 2009 - 22:02
#9
Jeg må gå ud fra at du bruger MySQL? Hvis du gør bliver hele funktionen noget i retningen af: <?php $query = "SELECT * FROM `din_tabel`"; $result = mysql_query($query); while ($row = mysql_fetch_assoc($result)){ $date = $row["dato"]; list($day,$month,$year) = explode("-",$date); $time = mktime(0,0,0,$month,$day,$year); if($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-10)) && $time <= time()){ $aldersgruppe["0-10"] .= $row["user"] ", "; } elseif($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-20)) && $time <= mktime(0,0,0,date("n"),date("j"),(date("Y")-11))){ $aldersgruppe["11-20"] .= $row["user"] ", "; } elseif($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-25)) && $time <= mktime(0,0,0,date("n"),date("j"),(date("Y")-21))){ $aldersgruppe["21-25"] .= $row["user"] ", "; } } echo "0-10 : " . $aldersgruppe["0-10"] . "<br/>"; echo "11-20 : " . $aldersgruppe["11-20"] . "<br/>"; echo "21-25 : " . $aldersgruppe["21-25"] . "<br/>"; ?> Hvis der er noget specifikt du ikke er helt med på må du lige spørge:)
03. februar 2009 - 22:06
#10
psycho - kan du ikke integrerer det til en MYSQL-fetchning? Så den siger noget med: SELECT brugernavn FROM brugere WHERE foedselsdag ER MELLEM 0-10 ÅR Eksempelvis?
03. februar 2009 - 22:07
#11
codedk havde saa alerede foreslaaet DATE_SUB. Du skal bruge DATE som kolonne type i databasen. Der er ikke nogen kolonne type som hedder dd-mm-yyyy. Brug af VARCHAR til datoer er en meget dårlig ide.
03. februar 2009 - 22:07
#12
Tror umiddelbart det kræver for meget parsing til at kunne bestå af én MySQL-fetching.
03. februar 2009 - 22:12
#13
Jeg giver iøvrigt arne ret i at det er dumt at bruge dato strings i din database. Det bliver meget lettere for dig hvis du bruger "mktime" i stedet.
03. februar 2009 - 22:29
#14
Okay, så vil jeg lave sådan, at man indsætter sin alder som dd-mm-yyyy, og indsætter i mysql som yyyy-mm-dd, hvordan laves min mysql_query så? Tak på forhånd
03. februar 2009 - 22:38
#15
Jeg har ikke testet følgende løsning, men så vidt jeg kan se skulle den virke for 0-10 år: $query = "SELECT `brugernavn` FROM `brugere` WHERE `foedselsdag` BETWEEN DATE_SUB(NOW(), INTERVAL 10 YEAR) and NOW()"; De andre intervaller laves self efter samme princip.
03. februar 2009 - 22:42
#16
arne: Jeg brugte BEWTWEEN for at illustrere konceptet, så han også kan bruge det for de andre alders intervaller.
03. februar 2009 - 22:41
#17
Jeg tror at >= er nok. BETWEEN sikrer ganske vist mod fødselsdage i fremtiden, men .... :-)
03. februar 2009 - 22:47
#18
Hvad så hvis det skal være mellem 11-31 år f.eks?
03. februar 2009 - 22:47
#19
Til vilkårlige alders intervaller er BETWEEN lige i øjet.
03. februar 2009 - 22:52
#20
arne_v kan du give eksempel? I mine øjne kan jeg kun se BETWEEN 10 years.. Hvis jeg sætter den til BETWEEN 20 years, bliver det vel bare 0-20? Hvad så med 25-35 f.eks? Kan du give et eksempel
03. februar 2009 - 22:54
#21
#18 Det må jo blive noget i retningen af: <?php $date_from = mktime(0,0,0,date("n"),date("j"),(date("Y")-31); $query = "SELECT `brugernavn` FROM `brugere` WHERE `foedselsdag` BETWEEN DATE_SUB(".$date_from.", INTERVAL 20 YEAR) and ".$date_from.""; ?>
03. februar 2009 - 22:55
#22
03. februar 2009 - 22:57
#23
#21 - bliver det så ikke mellem 20-31?? ellers kan jeg virkelig ikke se hvordan den funktion virker. Du sætter -31 (vel 31 år?) også interval 20 year... 20-31??
03. februar 2009 - 22:59
#24
Hov jeg lavede vist også en fejl. <?php $date_from = mktime(0,0,0,date("n"),date("j"),(date("Y")-11); $query = "SELECT `brugernavn` FROM `brugere` WHERE `foedselsdag` BETWEEN DATE_SUB(".$date_from.", INTERVAL 20 YEAR) and ".$date_from.""; ?> INTERVAL bestemmer hvor mange år du ville have det til at løbe over. Dvs. 20 år i tilfældet hvor du vil have intervallet fra 11-31.
03. februar 2009 - 23:00
#25
Nu prøver jeg selv, hvis jeg vil have fra 30-45 f.eks, skal jeg så skrive: <?php $date_from = mktime(0,0,0,date("n"),date("j"),(date("Y")-30); $query = "SELECT `brugernavn` FROM `brugere` WHERE `foedselsdag` BETWEEN DATE_SUB(".$date_from.", INTERVAL 40 YEAR) and ".$date_from.""; ?> ??
03. februar 2009 - 23:02
#26
#25 Nej, der må du skulle bruge INTERVAL 15 YEAR...
03. februar 2009 - 23:03
#27
Ahh, nu forstår jeg. 30+15 = 45, right? :-)
03. februar 2009 - 23:06
#28
Yup:)
03. februar 2009 - 23:06
#29
smid svar og tusind tak for hjælpen
03. februar 2009 - 23:08
#30
Ingen problem:) Håber det virker for dig nu:D
04. februar 2009 - 13:58
#31
Hej igen. Hvad hvis den skal hente testere der er OVER 60 år gammel?
04. februar 2009 - 14:21
#32
SELECT mail FROM edok WHERE landsdel = 'København' AND rang = 0 AND koen = 0 AND (bbday BETWEEN DATE_SUB(697158000, INTERVAL 8 YEAR) and 697158000) Sådan ser min SQL ud, den fortæller mig: Column 'bbday' cannot be null bruger følgende: if ( $row['maalgruppe'] == 3) { $date_from = mktime(0,0,0,date("n"),date("j"),(date("Y")-17)); $test = "BETWEEN DATE_SUB(".$date_from.", INTERVAL 8 YEAR) and ".$date_from; }
04. februar 2009 - 14:24
#33
(her prøver jeg at matche testere der er mellem 17-25 år..)
04. februar 2009 - 15:46
#34
Ingen der kan hjælpe?
04. februar 2009 - 17:04
#35
SELECT mail FROM edok WHERE bbday BETWEEN DATE_SUB(728780400, INTERVAL 8 YEAR) AND 728780400 Følgende tal: 728780400 er fra: $date_from = mktime(0,0,0,date("n"),date("j"),(date("Y")-16)); Det vil sige 16 år tilbage. Interval 8 year betyder den skal gå fra 16 og 8 år frem.. Men den resulterer ingenting, selv jeg er 17 år i min database.. bbday står som 1991-02-08... Kan ingen slet ikke hjælpe mig??
04. februar 2009 - 19:37
#36
Tager jeg som et nej
05. februar 2009 - 14:27
#37
Jeg får dette til at virke upåklageligt: <?php $query = "SELECT * FROM `users`"; $result = mysql_query($query); while($r=mysql_fetch_array($result)){ $date = $r["birthday"]; $aldersgrupper = array(0 => 10, 11 => 20, 21 => 35, 36 => 50, 51 => 69, 70 => 150); list($year,$month,$day) = explode("-",$date); $time = mktime(0,0,0,$month,$day,$year); foreach($aldersgrupper as $fra => $til){ if($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-$til)) && $time <= mktime(0,0,0,date("n"),date("j"),(date("Y")-$fra))){ $aldersgruppe[$fra ." - ". $til] = $r["user"]; break; } } } ?> Og du indsætter selvfølgeligt blot rigtigt database navn og de rigtige aldersgrupper i arrayet. Skal du efterfølgende udskrive output til skærmen kan du gøre det efter dette princip: <?php foreach($aldersgruppe as $alder => $user){ echo $alder . ": " . $user . "<br/>"; } ?> Håber det hjalp:)
05. februar 2009 - 15:33
#38
Faktisk er der en meget påfalde fejl i ovenstående. Dette er rettet og denne kode virker: <?php $query = "SELECT * FROM `users`"; $result = mysql_query($query); $aldersgrupper = array(0 => 10, 11 => 20, 21 => 35, 36 => 50, 51 => 69, 70 => 150); while($r=mysql_fetch_array($result)){ $date = $r["birthday"]; list($year,$month,$day) = explode("-",$date); $time = mktime(0,0,0,$month,$day,$year); foreach($aldersgrupper as $fra => $til){ if($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-$til)) && $time <= mktime(0,0,0,date("n"),date("j"),(date("Y")-$fra))){ $aldersgruppe[$fra ." - ". $til][] = $r["user"]; break; } } } foreach($aldersgruppe as $alder => $users){ foreach($users as $user){ echo $alder . ": " . $user . "<br/>"; } } ?>
05. februar 2009 - 15:28
#39
Faktisk er der en meget påfalde fejl i ovenstående. Dette er rettet og denne kode virker: <?php $query = "SELECT * FROM `users`"; $result = mysql_query($query); $aldersgrupper = array(0 => 10, 11 => 20, 21 => 35, 36 => 50, 51 => 69, 70 => 150); while($r=mysql_fetch_array($result)){ $date = $r["birthday"]; list($year,$month,$day) = explode("-",$date); $time = mktime(0,0,0,$month,$day,$year); foreach($aldersgrupper as $fra => $til){ if($time >= mktime(0,0,0,date("n"),date("j"),(date("Y")-$til)) && $time <= mktime(0,0,0,date("n"),date("j"),(date("Y")-$fra))){ $aldersgruppe[$fra ." - ". $til][] = $r["user"]; break; } } } foreach($aldersgruppe as $alder => $users){ foreach($users as $user){ echo $alder . ": " . $user . "<br/>"; } } ?>
Vi tilbyder markedets bedste kurser inden for webudvikling