• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

FerFil

validar datas em php com list forms [Resolvido]

24 mensagens neste tópico

Boas, ppl...

Preciso da vossa ajuda sou rookie em PHP e tou a tentar validar umas list form com datas, ou seja, quero que o utilizador quando inserir a data 31/02/07 não seja aceite, pq a data n existe. Essa validação é pra ser inserida na base de dados.

deixo o form criado....

<form action="registo.php" method="post" name="formulario">
Data de Nascimento: * 
<select name="dn" size="1">
<option value="none" selected>DIA</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select> 
- 
<select name="dn" size="1" >
<option value="none" selected>MÊS</option>
<option value="jan">01</option>
<option value="fev">02</option>
<option value="mar">03</option>
<option value="abr">04</option>
<option value="mai">05</option>
<option value="jun">06</option>
<option value="jul">07</option>
<option value="ago">08</option>
<option value="set">09</option>
<option value="out">10</option>
<option value="nov">11</option>
<option value="dez">12</option>
</select>
- 
<select name="dn" size="1" >
<option value="none" selected>ANO</option>
<option value="40">1940</option>
<option value="41">1941</option>
<option value="42">1942</option>
<option value="43">1943</option>
<option value="44">1944</option>
<option value="45">1945</option>
<option value="46">1946</option>
<option value="47">1947</option>
<option value="48">1948</option>
<option value="49">1949</option>
<option value="50">1950</option>
<option value="51">1951</option>
<option value="52">1952</option>
<option value="53">1953</option>
<option value="54">1954</option>
<option value="55">1955</option>
<option value="56">1956</option>
<option value="57">1957</option>
<option value="58">1958</option>
<option value="59">1959</option>
<option value="60">1960</option>
<option value="61">1961</option>
<option value="62">1962</option>
<option value="63">1963</option>
<option value="64">1964</option>
<option value="65">1965</option>
<option value="66">1966</option>
<option value="67">1967</option>
<option value="68">1968</option>
<option value="69">1969</option>
<option value="70">1970</option>
<option value="71">1971</option>
<option value="72">1972</option>
<option value="73">1973</option>
<option value="74">1974</option>
<option value="75">1975</option>
<option value="76">1976</option>
<option value="77">1977</option>
<option value="78">1978</option>
<option value="79">1979</option>
<option value="80">1980</option>
<option value="81">1981</option>
<option value="82">1982</option>
<option value="83">1983</option>
<option value="84">1984</option>
<option value="85">1985</option>
<option value="86">1986</option>
<option value="87">1987</option>
<option value="88">1988</option>
<option value="89">1989</option>
<option value="90">1990</option>
<option value="91">1991</option>
<option value="92">1992</option>
<option value="93">1993</option>
<option value="94">1994</option>
<option value="95">1995</option>
<option value="96">1996</option>
<option value="97">1997</option>
<option value="98">1998</option>
<option value="99">1999</option>
<option value="00">2000</option>
<option value="01">2001</option>
<option value="02">2002</option>
<option value="03">2003</option>
<option value="04">2004</option>
<option value="05">2005</option>
<option value="06">2006</option>
<option value="07">2007</option>
</select> <br><br>
<input type="submit" name="envia_dn" value="Envar">
</form>

O que tenho que fazer? Mas expliquem como se eu fosse muiiiiiitaa burro. Tb aceito desenhos  :)

Desde já OBR...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

<form action="registo.php" method="post" name="formulario">
Data de Nascimento: * 
<select name="dia" size="1">
<option value="none" selected>DIA</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select> 
- 
<select name="mes" size="1" >
<option value="none" selected>MÊS</option>
<option value="jan">01</option>
<option value="fev">02</option>
<option value="mar">03</option>
<option value="abr">04</option>
<option value="mai">05</option>
<option value="jun">06</option>
<option value="jul">07</option>
<option value="ago">08</option>
<option value="set">09</option>
<option value="out">10</option>
<option value="nov">11</option>
<option value="dez">12</option>
</select>
- 
<select name="ano" size="1" >
<option value="none" selected>ANO</option>
<option value="40">1940</option>
<option value="41">1941</option>
<option value="42">1942</option>
<option value="43">1943</option>
<option value="44">1944</option>
<option value="45">1945</option>
<option value="46">1946</option>
<option value="47">1947</option>
<option value="48">1948</option>
<option value="49">1949</option>
<option value="50">1950</option>
<option value="51">1951</option>
<option value="52">1952</option>
<option value="53">1953</option>
<option value="54">1954</option>
<option value="55">1955</option>
<option value="56">1956</option>
<option value="57">1957</option>
<option value="58">1958</option>
<option value="59">1959</option>
<option value="60">1960</option>
<option value="61">1961</option>
<option value="62">1962</option>
<option value="63">1963</option>
<option value="64">1964</option>
<option value="65">1965</option>
<option value="66">1966</option>
<option value="67">1967</option>
<option value="68">1968</option>
<option value="69">1969</option>
<option value="70">1970</option>
<option value="71">1971</option>
<option value="72">1972</option>
<option value="73">1973</option>
<option value="74">1974</option>
<option value="75">1975</option>
<option value="76">1976</option>
<option value="77">1977</option>
<option value="78">1978</option>
<option value="79">1979</option>
<option value="80">1980</option>
<option value="81">1981</option>
<option value="82">1982</option>
<option value="83">1983</option>
<option value="84">1984</option>
<option value="85">1985</option>
<option value="86">1986</option>
<option value="87">1987</option>
<option value="88">1988</option>
<option value="89">1989</option>
<option value="90">1990</option>
<option value="91">1991</option>
<option value="92">1992</option>
<option value="93">1993</option>
<option value="94">1994</option>
<option value="95">1995</option>
<option value="96">1996</option>
<option value="97">1997</option>
<option value="98">1998</option>
<option value="99">1999</option>
<option value="00">2000</option>
<option value="01">2001</option>
<option value="02">2002</option>
<option value="03">2003</option>
<option value="04">2004</option>
<option value="05">2005</option>
<option value="06">2006</option>
<option value="07">2007</option>
</select> <br><br>
<input type="submit" name="envia_dn" value="Envar">
</form>

$meses = array(
    'jan' => 31,
    'fev' => (date("L") ? 29 : 28),
    'mar' => 31,
    'abr' => 30,
    'mai' => 31,
    'jun' => 30,
    'jul' => 31,
    'ago' => 31,
    'set' => 30,
    'out' => 31,
    'nov' => 30,
    'dez' => 31 );

if($_POST['dia'] > $meses[$_POST['mes']]){
    die("AHAHAH, yeah right :|");
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O código do Dj tem um contra

(...)
'fev' => (date("L") ? 29 : 28),
(...)

Aqui está a usar os dados do ano do servidor.

Se o user colocar lá uma data válida de fevereiro, e se o ano do server não tiver o dia 29 por exemplo, vai dar erro de validação.

Por isso ias ter de implementar também um sistema para verificar se o ano é ou não bissexto (existe um tópico a falar sobre isso na secção de C++), e ai poderás implementar com rigor a validação da data.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porreiro...

tava agora a testar o código na integra e dava-me erro na validação da Data de Nascimento, quando inserido 29/02/2004 (ano bissexto), já tava pra dar umas cabeçadas no teclado  :wallbash: (às xs funciona).

Obr pela dica.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

todos os anos multiplos de 4 são bissextos logo..

basta ter uma condição em que se o ano a dividr por 4 der numero inteiro fevereiro tem 29 dias, senao tem 28.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

todos os anos multiplos de 4 são bissextos logo..

basta ter uma condição em que se o ano a dividr por 4 der numero inteiro fevereiro tem 29 dias, senao tem 28.

Não é bem assim. Existem outras duas restrições:

Todo ano divisível por 100 não é bissexto

Mas se o ano for também divisível por 400 é bissexto

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O código do Dj tem um contra

(...)
'fev' => (date("L") ? 29 : 28),
(...)

Aqui está a usar os dados do ano do servidor.

Se o user colocar lá uma data válida de fevereiro, e se o ano do server não tiver o dia 29 por exemplo, vai dar erro de validação.

Easy to fix:

'fev' => (date("L", mktime(0, 0, 0, 0, 0, $_POST['ano'])) ? 29 : 28),

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

todos os anos multiplos de 4 são bissextos logo..

basta ter uma condição em que se o ano a dividr por 4 der numero inteiro fevereiro tem 29 dias, senao tem 28.

Não é bem assim. Existem outras duas restrições:

Todo ano divisível por 100 não é bissexto

Mas se o ano for também divisível por 400 é bissexto

Todo ano divisível por 100 não é bissexto-LOL Nunca aprendi isto na escola xD Edit: tens a certeza? :S Fui ver ao relogio do meu pc e no ano 2000 tem lá 29 dias :S

Quanto a

Mas se o ano for também divisível por 400 é bissexto- Se um ano é divisivel por 400 também é divisivel por 4..

(já que 400 é multiplo de 4(4*100=400))

EDIT: Esquece já percebi... Se o ano for divisivel por 400 é. caso não seja se for divisivel por 4 é a nao ser que seja também divisivel por 100 .. confusao minha..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O q o QuickFire quer dizer, axo q é +/- isto:

$ano = $_POST['ano'];

function AnoBissexto($ano){
return $ano % 4 == 0 && ($ano % 400 == 0 || $ano % 100 != 0);
}

echo sprintf("Em %d, Fevereiro tem %d dias\n", $ano, AnoBissexto($ano) ? 29 : 28);

Espero n tar errado  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tanta coisa quando a solução mais simples era passar um timestamp. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obr a todos,

sem a vossa ajuda o meu cérebro n descolava  :D

djthyrax - a tua ajuda foi essencial, mas na tua correcção ao código continuou sem funcionar, resolvi a situação do seguinte modo:

'fev' => (date("L", mktime(0, 0, 0, 2, 0, $_POST['ano'])) ? 29 : 28),

Então passo a colar o código gerado, para futuras ajudas:

<?
$meses = array(
    'jan' => 31,
    'fev' => (date("L", mktime(0, 0, 0, 2, 0, $_POST['ano'])) ? 29 : 28),
    'mar' => 31,
    'abr' => 30,
    'mai' => 31,
    'jun' => 30,
    'jul' => 31,
    'ago' => 31,
    'set' => 30,
    'out' => 31,
    'nov' => 30,
    'dez' => 31 );

if($_POST['dia'] > $meses[$_POST['mes']]){
echo 'data errada';
}else{
echo 'data certa';
}
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Foi erro de digitação, o 9 tá logo ao lado do 8. :D

Já corrigi o post. E mete o teu post com o GeSHi: [ code=php] [ /code]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, desta x como deve de ser  :D

$meses = array(
    'jan' => 31,
    'fev' => (date("L", mktime(0, 0, 0, 2, 0, $_POST['ano'])) ? 29 : 28),
    'mar' => 31,
    'abr' => 30,
    'mai' => 31,
    'jun' => 30,
    'jul' => 31,
    'ago' => 31,
    'set' => 30,
    'out' => 31,
    'nov' => 30,
    'dez' => 31 );

if($_POST['dia'] > $meses[$_POST['mes']]){
   echo 'data errada';
   }else{
   echo 'data [b]certa[/b]';
   }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais uma questão....

Quando se introduz uma data anterior a 1970 dá-me este erro:

Warning: mktime() [function.mktime]: Windows does not support negative values for this function in c:\wamp\www\tenis_shop\pos_registo.php on line 5

Tive a informar-me o o mktime() só aceita datas compreendidas entre 1970 e 2038.

Como faço para conseguir validar datas anteriores a 1970?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desenvolves a tua própria função. Blame it on PHP Windows code.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este erro só acontece no windows?? pq o servidor em principio vai ser Linux

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se usares uma versão anterior a 5.1.0, poderá não acontecer nenhum erro em Linux. Mas não dou garantias de nada.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso acontece devido ao timestamp...

Returns the Unix timestamp corresponding to the arguments given. This timestamp is a long integer containing the number of seconds between the Unix Epoch (January 1 1970 00:00:00 GMT) and the time specified.

Essa é a maior limitação do timestamp.

Se quiseres validar datas superiores a 2038 (não é que venhas a precisar tão cedo :D) também não consegues...

A solução é utilizar a função para verificar se X é bissexto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:cheesygrin: Ao fim dumas boas horitas devidas à cama, lá consegui, fazer o que cria :cheesygrin:

Código batido à la unha. quem conseguir simplificar, e se der, agradeço.

$anobi = array(
1940 => 1940,
1944 => 1944,
1948 => 1948,
1952 => 1952,
1956 => 1956,
1960 => 1960,
1964 => 1964,
1968 => 1968,
1972 => 1972,
1976 => 1976,
1980 => 1980,
1984 => 1984,
1988 => 1988,
1992 => 1992,
1996 => 1996,
2000 => 2000,
2004 => 2004,
2008 => 2008 );

$meses = array(
    'jan' => 31,
    'fev' => 28,
    'mar' => 31,
    'abr' => 30,
    'mai' => 31,
    'jun' => 30,
    'jul' => 31,
    'ago' => 31,
    'set' => 30,
    'out' => 31,
    'nov' => 30,
    'dez' => 31 );

if ($_POST['dia'] == none || $_POST['mes'] == none || $_POST['ano'] == none){
echo 'Introduza uma data';
}else{
	if($_POST['dia'] > $meses[$_POST['mes']]){
			if ($_POST['dia'] == 29){
				if ($_POST['mes'] == fev){
					if($_POST['ano'] == $anobi[$_POST['ano']]){
					echo 'data certa de ano bissexto';
					}else{
					echo 'data errada';
					}
				}
			}
		}else{
		echo 'data certa de ano normal';
	}
}

Para q ñ haja duvidas a $anobi refere-se aos anos bissextos, e ñ aos anos q dão "prós 2 lados"  :P

Bem, aceito feedback pra moral daqui do rookie levantar, obr aos q me ajudaram  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hey. Troca

($_POST['dia'] == none || $_POST['mes'] == none || $_POST['ano'] == none)

por

(empty($_POST['dia']) || empty($_POST['mes']) || empty($_POST['ano']))

e podes resumir o

				if ($_POST['dia'] == 29){
				if ($_POST['mes'] == fev){
					if($_POST['ano'] == $anobi[$_POST['ano']]){
					echo 'data certa de ano bissexto';
					}else{
					echo 'data errada';
					}
				}
			}

a

if ($_POST['dia'] == 29 && $_POST['mes'] == "fev") {
if (array_key_exists($_POST['ano'], $anobi) {
echo 'data certa de ano bissexto';
}
else
{
echo 'data errada';
}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Troca:

$anobi = array(
1940 => 1940,
1944 => 1944,
1948 => 1948,
1952 => 1952,
1956 => 1956,
1960 => 1960,
1964 => 1964,
1968 => 1968,
1972 => 1972,
1976 => 1976,
1980 => 1980,
1984 => 1984,
1988 => 1988,
1992 => 1992,
1996 => 1996,
2000 => 2000,
2004 => 2004,
2008 => 2008 );

por

$anobi = array(
1940,
1944,
1948,
1952,
1956,
1960,
1964,
1968,
1972,
1976,
1980,
1984,
1988,
1992,
1996,
2000,
2004,
2008);

E depois, em vez de:

if($_POST['ano'] == $anobi[$_POST['ano']]){

metes:

if(false !== array_search($_POST['ano'], $anobi)){

Para pegares no $anobi e gerar mais uns anitos, só precisas de:

for($i = $anobi[count($anobi)-1]+4; $i < 3000; $i += 4) $anobi[] = $i;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora