Avatar billede jespernerd Nybegynder
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!
Avatar billede psychopixi Nybegynder
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";
}
?>
Avatar billede jespernerd Nybegynder
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".
Avatar billede coderdk Praktikant
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 :)
Avatar billede psychopixi Nybegynder
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.
Avatar billede jespernerd Nybegynder
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!
Avatar billede arne_v Ekspert
03. februar 2009 - 21:54 #6
Hvis MySQL så prøv:

SELECT *
FROM dintabel
WHERE foedselsdag >= DATE_SUB(NOW(), INTERVAL 10 YEAR)
Avatar billede coderdk Praktikant
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 ;)
Avatar billede jespernerd Nybegynder
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??
Avatar billede psychopixi Nybegynder
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:)
Avatar billede jespernerd Nybegynder
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?
Avatar billede arne_v Ekspert
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.
Avatar billede psychopixi Nybegynder
03. februar 2009 - 22:07 #12
Tror umiddelbart det kræver for meget parsing til at kunne bestå af én MySQL-fetching.
Avatar billede psychopixi Nybegynder
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.
Avatar billede jespernerd Nybegynder
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
Avatar billede psychopixi Nybegynder
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.
Avatar billede psychopixi Nybegynder
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.
Avatar billede arne_v Ekspert
03. februar 2009 - 22:41 #17
Jeg tror at >= er nok.

BETWEEN sikrer ganske vist mod fødselsdage i fremtiden, men ....

:-)
Avatar billede jespernerd Nybegynder
03. februar 2009 - 22:47 #18
Hvad så hvis det skal være mellem 11-31 år f.eks?
Avatar billede arne_v Ekspert
03. februar 2009 - 22:47 #19
Til vilkårlige alders intervaller er BETWEEN lige i øjet.
Avatar billede jespernerd Nybegynder
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
Avatar billede psychopixi Nybegynder
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."";
?>
Avatar billede psychopixi Nybegynder
03. februar 2009 - 22:55 #22
Avatar billede jespernerd Nybegynder
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??
Avatar billede psychopixi Nybegynder
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.
Avatar billede jespernerd Nybegynder
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."";
?>

??
Avatar billede psychopixi Nybegynder
03. februar 2009 - 23:02 #26
#25
Nej, der må du skulle bruge INTERVAL 15 YEAR...
Avatar billede jespernerd Nybegynder
03. februar 2009 - 23:03 #27
Ahh, nu forstår jeg. 30+15 = 45, right? :-)
Avatar billede psychopixi Nybegynder
03. februar 2009 - 23:06 #28
Yup:)
Avatar billede jespernerd Nybegynder
03. februar 2009 - 23:06 #29
smid svar og tusind tak for hjælpen
Avatar billede psychopixi Nybegynder
03. februar 2009 - 23:08 #30
Ingen problem:)

Håber det virker for dig nu:D
Avatar billede jespernerd Nybegynder
04. februar 2009 - 13:58 #31
Hej igen.

Hvad hvis den skal hente testere der er OVER 60 år gammel?
Avatar billede jespernerd Nybegynder
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;
}
Avatar billede jespernerd Nybegynder
04. februar 2009 - 14:24 #33
(her prøver jeg at matche testere der er mellem 17-25 år..)
Avatar billede jespernerd Nybegynder
04. februar 2009 - 15:46 #34
Ingen der kan hjælpe?
Avatar billede jespernerd Nybegynder
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??
Avatar billede jespernerd Nybegynder
04. februar 2009 - 19:37 #36
Tager jeg som et nej
Avatar billede psychopixi Nybegynder
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:)
Avatar billede psychopixi Nybegynder
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/>";
    }
}
?>
Avatar billede psychopixi Nybegynder
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/>";
    }
}
?>
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