Ir ao conteúdo
  • Cadastre-se
Davi Nascimento_770787

RESOLVIDO Retorna cálculo da idade errado

Recommended Posts

Estou perdendo os cabelos por causa de um erro no cálculo de idade. Fiz um formulário em html e os scripts em php.

Algumas data retornam com a idade certa, no entanto, outras retornam um erro. Segue meu código

 

 

*** Formulário

<!DOCTYPE html><html lang="pt-br"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Calcular o IMC</title></head><body> <form method="post" name="form_IMC" action="imc.php" >    <fieldset>        <legend>Descubrindo seu IMC</legend>        <legend><h2><b>Informe seus dados</b></h2></legend>        <label>Nome:</label> <input name="nome" type="text" size="40"/><p>        <label>Data de nascimento: </label>            <input type="date" maxlength="10" name="data" pattern="[0-9]{2}\/[0-9]{2}\/[0-9]{4}$" />            <label>Sexo: </label>            <select name="sexo">                <option value="Masculino" />Masculino</option><br />                <option value="Feminino" />Feminino</option><br />            </select><p>        <label>Peso (Kg): </label> <input type="text" name="peso" /><p>            <label>Altura (cm): </label> <input type="text" name="altura" /><p>        <input type="submit" value="Enviar"/>        <input type="reset" value="Limpar"/>    </fieldset></form></body></html>

****PHP

<?php    $nome = $_POST["nome"];    $data = $_POST["data"];    $sexo = $_POST["sexo"];    $peso = $_POST["peso"];    $altura = $_POST["altura"];    $imc = $peso / (($altura/100)*($altura/100));   //Calcula a idade        $date = new DateTime($data);    $interval = $date->diff( new DateTime( ) );    echo "Nome: $nome<br />";    echo "Data de Nascimento: $data<br/ >";        echo "Sexo: $sexo<br />";    echo "Peso(kg): $peso<br />";    echo "Altura(cm): $altura<br />";    echo "------------------------------<br />";    echo "RESULTADO<br />";    echo "------------------------------<br />";    echo $interval->format( "Idade: %Y anos %m meses %d dias<br />");    echo "Seu IMC é: $imc<br />";    //Calcula o IMC        if($sexo == "Masculino"){        if ($imc<20.7){        echo "Situação: Abaixo do peso";       } elseif ($imc>=20.7 && $imc<26.4) {        echo "Situação: Peso normal";        }elseif ($imc>=26.4 && $imc<27.8) {        echo "Situação: Marginalmente acima do peso";        }elseif ($imc>=27.8 && $imc<31.1) {        echo "Situação: Acima do peso ideal";        }else{        echo "Situação: Obeso";        }    }else{        if ($imc<19.1) {        echo "Situação: Abaixo do peso";        }elseif ($imc>=19.1 && $imc<25.8){        echo "Situação: Peso normal";        }elseif ($imc>=25.8 && $imc<27.3){        echo "Situação: Marginalmente acima do peso";        }elseif ($imc>=27.3 && $imc<32.3){        echo "Situação: Acima do peso ideal";        }else{        echo "Situação: Obesa";        }    }?>

Quando coloco por exemplo a data:  01/01/1985 ele retorna o valor correto: Idade: 30 anos 9 meses 8 dias

 

No entanto quando coloco 27/09/1985 ele retorna o seguinte erro:
Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (27/09/1984) at position 0 (2): Unexpected character' in C:\xampp\htdocs\projeto\ModuloIII\Unidade III\IMC\imc.php:12 Stack trace: #0 C:\xampp\htdocs\projeto\ModuloIII\Unidade III\IMC\imc.php(12): DateTime->__construct('27/09/1984') #1 {main} thrown in C:\xampp\htdocs\projeto\ModuloIII\Unidade III\IMC\imc.php on line 12

 

Alguém pode me ajudar????

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Davi Nascimento_770787

 

Acontece que o datetime como parâmetro na função diff() não aceita o formato  DD/MM/AAAA.

Precisa que seja no formato standard:  AAAA-MM-DD

 

então coloque:   1984-09-27  que vai funcionar.

 

Para não dar problemas com o input onde você entra com os dados no formato DD/MM/AAAA..    você converte no php para o formato standard..

Você pode criar uma função que pegue esta data e separe-a e reordene.. por exemplo: Crie um arquivo chamado  "data.conversor.php" e coloque na mesma pasta.

function converteData($data){    $partes = explode("/", $data);    $standard = $partes[2] . "-". $partes[1] . "-". $partes[0];        return  $standard;}

Eaí para usar esta função... logo quando recebe os dados do formulário você aplica a função na variável da data.. usando o trecho do seu código para entender:

<?php    //inclui o arquivo que contem a função de converter datas de 09/10/2915 para  2015-10-09    include'data.conversor.php';    $nome = $_POST["nome"];    $data = $_POST["data"];    $sexo = $_POST["sexo"];    $peso = $_POST["peso"];    $altura = $_POST["altura"];    $imc = $peso / ($altura * $altura);      //variável que recebe a função de converter datas criada.    $dataConvertida = converteData($data);   //Calcula a idade        $date = new DateTime($dataConvertida);    $interval = $date->diff( new DateTime( ) );    echo "Nome: $nome<br />";

Outro erro,  retire do cálculo de IMC  a divisão por 100 dentro dos parenteses por que senão sua cadeia de IF não vai funcionar.. onde nela você  compara com um valor com decimais.. e dividindo por 100 você deixa o valor inteiro.

 

então deixe a linha assim: $imc = $peso / ($altura $altura);

 

Se quiser testar antes para ver se eu falo corretamente...  entre neste site:  http://phptester.net/

 

No espaço cole este código e clique no botão "Click to test your php code "

<?php    $nome = 'Fulano de tal';    $data = '1984-09-27';    $sexo = 'Masculino';    $peso = 64;    $altura = 1.70;    $imc = $peso / ($altura*$altura);   //Calcula a idade          $date = new DateTime($data);    $interval = $date->diff( new DateTime( ) );    echo "Nome: $nome<br />";    echo "Data de Nascimento: $data<br/ >";        echo "Sexo: $sexo<br />";    echo "Peso(kg): $peso<br />";    echo "Altura(cm): $altura<br />";    echo "------------------------------<br />";    echo "RESULTADO<br />";    echo "------------------------------<br />";    echo $interval->format( "Idade: %Y anos %m meses %d dias<br />");    echo "Seu IMC é: $imc<br />";    //Calcula o IMC        if($sexo == "Masculino"){        if ($imc<20.7){        echo "Situação: Abaixo do peso";       } elseif ($imc>=20.7 && $imc<26.4) {        echo "Situação: Peso normal";        }elseif ($imc>=26.4 && $imc<27.8) {        echo "Situação: Marginalmente acima do peso";        }elseif ($imc>=27.8 && $imc<31.1) {        echo "Situação: Acima do peso ideal";        }else{        echo "Situação: Obeso";        }    }else{        if ($imc<19.1) {        echo "Situação: Abaixo do peso";        }elseif ($imc>=19.1 && $imc<25.8){        echo "Situação: Peso normal";        }elseif ($imc>=25.8 && $imc<27.3){        echo "Situação: Marginalmente acima do peso";        }elseif ($imc>=27.3 && $imc<32.3){        echo "Situação: Acima do peso ideal";        }else{        echo "Situação: Obesa";        }    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×