Regne ut alder med php

kongen

kongemedlem
Hvordan kan man regne ut med php om en person er 18 år eller ikke fra et skjemafelt alderen fylles ut i?
 

spikre

peterhamre.no
Enkel matematikk tilsier at vi tar dagens dato og subtraherer med brukerens dato. Da får vi alder. Så spør vi simpelthen om alderen er over 18 eller ikke - og gir 2 ulike konsekvenser av de 2 mulige utfallene.

PHP:
$idag  = date("Y-m-d"); // dagens dato
$brukerdato = $_POST[]; //datoen brukeren oppgir

if (($idag - $brukerdato) => '18') { //hvis over 18 år
echo "du er 18 år eller eldre";
} else { // hvis ikke over 18 år
echo "du er ikke gammel nok";
}

$brukerdato må du selvfølgelig strippe for tags som kan være skadelig. Variablene bør konverteres til noe annet enn datoformat, og deretter må 18 konverteres til det samme formatet. $idag er nå år-måned-dag. Mulig du kun trenger år. I så fall skriver du date("Y") (4 siffer).
 
Sist redigert:

kongen

kongemedlem
Mulig du kun trenger år. I så fall skriver du date("Y") (4 siffer).

Jeg trenger kun å sjekke om personen er 18 år eller eldre. Men hvis jeg tar kun år, og personen er født 31. desember 1996 og fyller ut skjema 1. januar 2014, vil ikke da denne løsningen runde av til 18 år (2014-1996) selv om personen bare er 17 år og 1 dag?
 

adeneo

Medlem
Dette er enklere enn man kanskje skulle tro, man bruker strtotime

PHP:
$minus_atten = strtotime('-18 years');

og får en unix timestamp som representerer datoen for akkurat 18 år siden i dag, som skulle bli 819652394, og sammenligner den med tilsvarende for hva brukeren har fylt inn

PHP:
$alder = mktime(0, 0, 0, ( $_POST['month']), $_POST['day'], $_POST['year']);

så blir det noe slikt

PHP:
$minus_atten = strtotime('-18 years');
$alder       = mktime(0, 0, 0, ( $_POST['month']), $_POST['day'], $_POST['year']);
                    
if ($minus_atten < $alder) {
      echo 'Ikke over atten!';
}else{
      echo 'Over atten';
}

Klinker til med et fiks ferdig eksempel

PHP:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Datoer</title>
        <style type="text/css">
            label {position: relative; width: 60px; display: inline-block;}
        </style>
    </head>
    <body>
        <?php
            if (isset($_POST['month']) && isset($_POST['day']) && isset($_POST['year'])) {
                $minus_atten = strtotime('-18 years');
                $alder       = mktime(0, 0, 0, ( $_POST['month']), $_POST['day'], $_POST['year']);
                
                if ($minus_atten < $alder) {
                    echo 'Ikke over atten!';
                }else{
                    echo 'Over atten';
                }
            }
        ?>
        
        <form method="POST" action="">
            <p>Fødselsdato</p>
            <label>År : </label>
            <select name="year">
                <?php for ($i=2014; $i>1940; $i--) {echo '<option'.(isset($_POST['year'])&&$i==$_POST['year']?' selected':'').'>'.$i.'</option>';} ?>
            </select>
            <br />
            <label>Måned : </label>
            <select name="month">
                <?php
                    for ($m=1; $m<=12; $m++) {
                        echo '<option value="'.$m.'"'.(isset($_POST['month'])&&$m==$_POST['month']?' selected':'').'>'.(date('F', mktime(0,0,0,$m, 1, date('Y')))). '</option>';
                    }
                ?>
            </select>
            <br />
            <label>Dato : </label>
            <select name="day">
                <?php for ($i=1; $i<32; $i++) {echo '<option'.(isset($_POST['day'])&&$i==$_POST['day']?' selected':'').'>'.$i.'</option>';} ?>
            </select>
            <br /><br />
            <input type="submit" value="Send" />
        </form>
    </body>
</html>
 

adeneo

Medlem
Spikre har nok rett, prinsippet er akkurat det samme, og det må det jo nesten være, for den eneste måten man kan sjekke alder på er jo nettopp å ta den fødselsdatoen brukeren oppgir og sammenligne den med i dag minus atten år.

Så kan man selvfølgelig legge til de atten årene på brukerens dato, trekke de fra i dag, eller se om forskjellen mellom de er atten år, i teorien blir det akkurat det samme.

Jeg er av den oppfatning av at det er enklere å jobbe med unix tid, og tok derfor eksemplet til Spikre litt lengre, da jeg oppfattet det som pseudo kode for å kun vise teorien, ettersom jeg ikke helt kan se at det funker å sammenligne et dato objekt direkte med superglobalen $_POST og så sjekke det mot en string "18", og i hvertfall ikke med => ettersom det ikke er en gyldig operator (det er >=), og jeg skrev det derfor slik jeg ville jeg skrevet det.
 
Topp