Ir ao conteúdo
  • Cadastre-se

Retorna cálculo da idade errado


Ir à solução Resolvido por DiF,

Posts recomendados

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????

Link para o comentário
Compartilhar em outros sites

  • Moderador
  • Solução

@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";        }    }
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...