Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 15 su 21
  1. #1

    Verificare chi è maggiorenne

    Ciao a tutti,
    ho un database (mysql) di iscritti, per ognuno dei quali ho i tre campi:

    $datanascita_giorno
    $datanascita_mese
    $datanascita_anno

    (esempio: $datanascita_giorno=18, $datanascita_mese=marzo, $datanascita_anno=1987)

    Vorrei risolvere questo problema:
    devo convalidare l'iscrizione solo se la persona risulta maggiorenne.
    Come fare?
    Avevo pensato a fare la differenza in giorni tra la data dell'iscrizione (ossia quella attuale) e quello della data di nascita, e se il risultato è maggiore di 365*18 allora ok, ma così non tengo conto degli anni bisestili..
    qualcuno sa come risolvere?
    Grassssiee

  2. #2

    Re: Verificare chi è maggiorenne

    Originariamente inviato da IGS
    Avevo pensato a fare la differenza in giorni tra la data dell'iscrizione (ossia quella attuale) e quello della data di nascita, e se il risultato è maggiore di 365*18 allora ok, ma così non tengo conto degli anni bisestili..
    qualcuno sa come risolvere?
    Grassssiee
    soluzione 1:
    ... massì, giorno + giorno -
    soluzione 2:
    fai il calcolo degli anni bisestili (presente il calendario gregoriano?)
    soluzione 3: componi la data ed esegui il calcolo con le apposite funzioni PHP
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

  3. #3
    soluzione 1:
    la volevo, appunto, evitare

    soluzione 2:
    no, non conosco l'algoritmo

    soluzione 3:
    quali sono le apposite funzioni? Non le conosco, ma così non avrei lo stesso problema della soluzione 1?

  4. #4
    fai tutto con mktime(), guarda nel manuale.

    eta_in_secondi = mktime( adesso ) - mktime( data nascita utente )

  5. #5
    eccolo:

    $data_anno_oggi=date("Y");
    $data_mese_oggi = date("n");
    $data_giorno_oggi = date("d");

    $data1 = mktime(0, 0, 0, $data_giorno_oggi, $data_mese_oggi, $data_anno_oggi, 0);

    $data2 = mktime(0, 0, 0, $eta_giorno, $eta_mese_n, $eta_anno, 0);

    $giorni_diff=($data1 - $data2)/(60*60*24);

    if (intval($giorni_diff>(365*18))) {$eta_maggiore_18='si';} else {$eta_maggiore_18='no';}
    ma il punto non cambia, così non tengo conto degli anni bisestili.
    Ok che potrei dire: in 18 anni al massimo ci sono 4 anni bisestili, per cui posso modificare:

    intval($giorni_diff>(365*18))
    in
    intval($giorni_diff>(365*18+4))

    però ottengo sempre un risultato che è "quasi" giusto, ma non correttissimo lo stesso.
    Per essere pignoli (e non fare figuracce con gli utenti) come si può migliorare il codice?

  6. #6
    Ti ho consigliato di usare mktime() non a caso, in quanto sono fortemente portato a ritenere che tenga in considerazione anche eventuali anni bisestili, perchè mktime ti da il numero di secondi trascori dal January 1 1970 00:00:00 GMT, e se non è un cazzaro ne DEVE tenere conto

    ma il tuo dubbio era sull'analisi dell'età in secondi che ottieni dopo la differenza... uhm, devi fartelo a mano allora, tenendo conto che:

    Un anno è bisestile se il suo numero è divisibile per 4, tranne che se sia divisibile per 100 (ma è bisestile se è divisibile per 400).

  7. #7
    mktime per le date di nascita si limita comunque alle nascite avvenute dopo il 1970. Poi e' errata la posizione di mese giorno.

    Calcola la data con i singoli valori che hai scomposto:

    codice:
    <?php
    $data_anno_oggi = date("Y");
    $data_mese_oggi = date("n");
    $data_giorno_oggi = date("j");
    
    $eta_anno = '1987';
    $eta_mese = '1';
    $eta_giorno = '5';
    
    IF(($data_anno_oggi - $eta_anno) > 18 ) { echo "sei maggiorenne";    }
    
       elseif(($data_anno_oggi - $eta_anno) < 18 ) { echo "sei minorenne";    }
    
       elseif(($data_anno_oggi - $eta_anno) == 18 AND $data_mese_oggi >= $eta_mese AND $data_giorno_oggi >= $eta_giorno)
                { echo "sei maggiorenne";  }
    
               else { echo "sei ancora minorenne";    }
    
    ?>

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2004
    Messaggi
    15
    Ufficio complicazione affari semplici.

    Il giorno G M ANNODINASCITA + 18 tu sei maggiorenne indipendentemente dagli anni bisestili.

    Ma secondo te uno diventa maggiorenne dopo 365*18 giorni oppure dopo 18 anni?


  9. #9
    grazie piero.mac, script semplice e funzionale!

  10. #10
    Originariamente inviato da RayAW
    Ufficio complicazione affari semplici.

    Il giorno G M ANNODINASCITA + 18 tu sei maggiorenne indipendentemente dagli anni bisestili.

    Ma secondo te uno diventa maggiorenne dopo 365*18 giorni oppure dopo 18 anni?


    non posso tener conto solo degli anni.
    Se oggi è 4 gen 2005
    chi è nato il 5 gen 1987 mi viene considerato maggiorenne anche se non lo è

  11. #11
    Io ho provato a vedere se mktime tiene conto degli anni bisestili e a quanto pare ne tene conto.

    Provate a modificare con la vostra data lo script sottoù
    Codice PHP:
    $mese 08;
    $giorno 28;
    $anno 1985;
    $data_anno_oggi $anno+18;
    $oggi mktime(000$giorno$mese$data_anno_oggi0);
    $nascita mktime(000$giorno$mese$anno0);
    $giorni_diff=($oggi $nascita)/(60*60*24);

    if (
    intval($giorni_diff>(365*18))) {echo 'sei maggiorenne';} else {echo 'sei minorenne';} 

  12. #12
    Per evitare i problemi suddetti del 1970 ecc. basta fare prima un if sull'anno: se è maggiore di 1970 allora si utilizza lo script altrimenti è inutile visto che l'utente sarà sicuramente maggiorenne. Ciao!

  13. #13
    ed eccovi anche la funzionacina pronta all'uso:

    Codice PHP:
    function IsOfAge ($BirthDay $BirthMonth $BirthYear)
            {
               
    $TodayYear date("Y");
               
    $TodayMonth date("n");
               
    $TodayDay date("j");

               if (
    $BirthYear 1970)
                 {
                    return 
    TRUE;
                 }
               else
                 {
                    
    $today mktime(000$TodayDay$TodayMonth$TodayYear0);
                    
    $birth mktime(000$BirthDay$BirthMonth$BirthYear0);
                    
    $result = ($today $birth)/(60*60*24);
                    if (
    intval($result>(365*18)))
                      {
                         return 
    TRUE;
                      }
                    else
                      {
                         return 
    FALSE;
                      }
                 }
            } 

  14. #14
    simpatica.
    Per i moderators: non potrebbe essere questa una mini-pillola?

  15. #15
    No perchè questa è una funzione base. Per essere completa dovrebbe essere strutturata in modo diverso. Leggi questa discussione:

    http://forum.html.it/forum/showthrea...hreadid=784005

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.