Jump to content
rmlm

Validação de campos e respectiva mensagem de erro

Recommended Posts

rmlm

Boa noite a todos,

o problema é o seguinte, eu estou a utilizar este tipo de validação pq não sei mais nenhuma:

if($primeiro_nome == ''){
header('Location: index.php?status=erro1');
}elseif($ultimo_nome == ''){
header('Location: index.php?status=erro2');
}elseif($email == ''){
header('Location: index.php?status=erro3');
}elseif($repita_email == ''){
header('Location: index.php?status=erro4');
}elseif($pass == ''){
header('Location: index.php?status=erro5');
}elseif($repita_pass == ''){
header('Location: index.php?status=erro6');
}elseif($email != $repita_email){
header('Location: index.php?status=erro7');
}elseif($pass != $repita_pass){
header('Location: index.php?status=erro8');
}else{
              Aqui processa o registo!
}

Depois através disto manda a mensagem de erro:

<span class="aviso">
         <?php if(!empty($_GET['status']) && $_GET['status'] == 'erro1'){ ?> Indique o seu primeiro nome <?php } ?>
</span>

Que fica com este aspecto:

ex.png

O problema é que isto quando volta para trás apaga tudo o que o utilizador já tinha inserido nos campos, o que é desagradável  :) ! Alguem sabe de alguma coisa que faça este mesmo efeito e que nao apague os dados inseridos nos inputs??

Share this post


Link to post
Share on other sites
brunoais

A solução que sei para o teu problema não é fácil de aplicar depois desse código.

O que é preciso é esquecer redirects e usar o action do form para a própria página.

Nessa página verificas se o formulário foi submetido.

Se o formulário for submetido incluis o código dessa página que valida o código.

Nessa página que valida o código, o que fazes é gravar numa variável o erro, se existe um.

De volta à página que incluiu o sistema de validação e gravar os dados, escreves dentro do atributo value dos inputs: <?php echo $_POST[''] ?>

Em que dentro dos '' fica o que está indicado como o nome (o que está dentro do atributo name) da tag input correspondente.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
rmlm

brunoais, podias dar um pequeno exemplo do que me disseste?

É que estou a ter problemas  :wallbash:

Obrigado

Share this post


Link to post
Share on other sites
KTachyon

Ou podes fazer com Javascript:

function validaForm() {
    d = document.formulario;

    if (d.primeiro_nome.value == "") {
        d.primeiro_nome.focus();
        d.primeiro_nome_alert.style.display = 'block';
        return false;
    }

    return true;
}

No HTML tens que dar IDs às componentes e colocar o display: none; no css dos alertas:

<input type="text" name="primeiro_nome" id="primeiro_nome" />
<span id="primeiro_nome_alert" style="display:none;">Indique o seu primeiro nome!</span>

No form, obrigas a que seja feita a validação onSubmit:

<form name="formulario" id="formulario" method="post" action="whatever.php" onSubmit="return validaForm()">

Senão, para cada form tens que ter várias páginas. Com esta abordagem, é tudo verificado do lado do cliente, ou seja, não é necessário que o utilizador volte a fazer uma request ao servidor para ir buscar uma página de erro, e é bastante mais extensível, pois assim podes apresentar todos os erros ao utilizador de uma vez (em vez de um por cada tentativa de submit).

Claro que deves sempre verificar do lado do servidor, para evitar falhas de segurança, pois é sempre possível o utilizador "adulterar" um request com posts vazios (ou outros caracteres não permitidos), mas, nesse caso, tratando-se de um utilizador expert, dás-lhe o castigo de ter que voltar a preencher tudo mais uma vez.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
brunoais

É uma solução. Eu gosto dela, só não a sugeri porque pensava q só se queria php :)

brunoais, podias dar um pequeno exemplo do que me disseste?

É que estou a ter problemas  :wallbash:

Obrigado

Acho melhor seres tu a mostrar aonde é que tens problemas e o que é que do que tu tens é que está a dar problemas (inclui mostrar código que tenhas feito).

EDIT:

Se não vais fazer usando o método que te indiquei, então paro de ajudar nessa parte do problema.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
rmlm

vamos la ver no whatever.php só meto a query que vai fazer o insert certo?

no js meto a validaçao dos campos... vamos la ver se consigo!

EDIT:

Isto está a mandar as mensagens a dizer que os campos estão vazios mas esta sempre a submeter os dados!

Vou mostrar o meu codigo:

Aqui é a pagina registar.php (que é a tua whatever.php):

include("conectar.php");

//Inicio da leitura dos campos do formulario
$primeiro_nome = mysql_real_escape_string($_POST['primeiro_nome']);
$ultimo_nome   = mysql_real_escape_string($_POST['ultimo_nome']);
$email         = mysql_real_escape_string($_POST['email']);
$repita_email  = mysql_real_escape_string($_POST['repita_email']);
$pass          = SHA1($_POST['pass']);
$repita_pass   = SHA1($_POST['repita_pass']);
$foto          = mysql_real_escape_string($_POST['foto']);
//Fim da leitura

mysql_query("INSERT INTO usuarios (idUsuarios, primeiro_nome, ultimo_nome, email, password, foto, activo, online, inserido_em) VALUES ('','$primeiro_nome','$ultimo_nome', '$email', '$pass','$foto', '0', '0', NOW())");

header('Location: index.php?status=sucesso');

Depois tenho o teu script que acrescentei o resto dos campos a validar:

function validaForm() {
    d = document.formulario;

    if (d.primeiro_nome.value == "") {
        d.primeiro_nome.focus();
        d.aviso1.style.display = 'block';
        return false;
    }else if(d.ultimo_nome.value == ""){
        d.ultimo_nome.focus();
        d.aviso2.style.display = 'block';
        return false;
    }else if(d.email.value == ""){
        d.email.focus();
        d.aviso3.style.display = 'block';
        return false;
    }else if(d.repita_email.value == ""){
        d.repita_email.focus();
        d.aviso4.style.display = 'block';
        return false;
    }else if(d.pass.value == ""){
        d.pass.focus();
        d.aviso5.style.display = 'block';
        return false;
    }else if(d.repita_pass.value == ""){
        d.repita_pass.focus();
        d.aviso6.style.display = 'block';
        return false;
}else{
	return true;
}
}

O formulario:

<form name="formulario" id="formulario" action="registar.php" method="post" onsubmit="return validaForm()">
<div class="titulo">Primeiro Nome:</div>
                <div>
                	<span><input class="ip_registo" name="primeiro_nome" id="primeiro_nome" type="text"/></span>
                	<span id="aviso1">
                    	Indique o seu primeiro nome
                    </span>
                </div>
            	<div class="titulo">Ultimo Nome:</div>
                <div>
                	<span><input class="ip_registo" name="ultimo_nome" id="ultimo_nome" type="text"/></span>
                    <span id="aviso2">
                    	Indique o seu ultimo nome
                    </span>
                </div>
..............................      
</form>

Share this post


Link to post
Share on other sites
ruimcosta

Boas,

Tenho aqui um exemplo que dei numa aula e adaptei-o ao teu caso, vê se serve.

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("jquery", "1.4.2");
</script>
<style>
    .erros{
        display: none;
        color: #ff0000;
    }
</style>
<?php
if( $_SERVER['REQUEST_METHOD'] == 'POST' ){
    if( isset($_POST['primeiro_nome']) ){
        if( $_POST['primeiro_nome'] == "" ){
            $pnome  = "";
            $aviso1 = 'Indique o seu primeiro nome';
        }else{
            $pnome  = $_POST['primeiro_nome'];
            $aviso1 = "";
        }
    }

    if( isset($_POST['ultimo_nome']) ){
        if( $_POST['ultimo_nome'] == "" ){
            $unome  = "";
            $aviso2 = 'Indique o seu ultimo nome';
        }else{
            $unome  = $_POST['ultimo_nome'];
            $aviso2 = "";
        }
    }    
}
?>
<form name="formulario" id="formulario" action="formulario.php" method="post">
    <div class="titulo">Primeiro Nome:</div>
    <div>
        <span><input class="ip_registo" name="primeiro_nome" id="primeiro_nome" type="text" value="<?php echo $pnome ?>" /></span>
        <span id="aviso1" class="erros"><?php echo $aviso1 ?></span>
    </div>
    <div class="titulo">Ultimo Nome:</div>
    <div>
        <span><input class="ip_registo" name="ultimo_nome" id="ultimo_nome" type="text" value="<?php echo $unome ?>" /></span>
        <span id="aviso2" class="erros"><?php echo $aviso2 ?></span>
    </div>
    <input type="submit" value="Enviar" id="btnenviar" name="btnenviar" />
</form>
<script>
$(document).ready(function(){
    $("#btnenviar").click(function(e){
        e.preventDefault();
        
        var erro;
        
        if( $("#primeiro_nome").val() == "" ){
            $("#aviso1").html("Indique o seu primeiro nome").fadeIn('slow');
            erro = 1;
        }else{
           $("#aviso1").fadeOut('slow'); 
           erro = 0;
        }

        if( $("#ultimo_nome").val() == "" ){
            $("#aviso2").html("Indique o seu ultimo nome").fadeIn('slow');
            erro = 1;
        }else{
           $("#aviso2").fadeOut('slow'); 
           erro = 0;
        }
        
        if( erro == 0 ){
		$("form").submit();	
	}
    });
});
</script>


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
brunoais

Aqui é a pagina registar.php (que é a tua whatever.php):

include("conectar.php");

//Inicio da leitura dos campos do formulario
$primeiro_nome = mysql_real_escape_string($_POST['primeiro_nome']);
$ultimo_nome   = mysql_real_escape_string($_POST['ultimo_nome']);
$email         = mysql_real_escape_string($_POST['email']);
$repita_email  = mysql_real_escape_string($_POST['repita_email']);
$pass          = SHA1($_POST['pass']);
$repita_pass   = SHA1($_POST['repita_pass']);
$foto          = mysql_real_escape_string($_POST['foto']);
//Fim da leitura
...

O sistema de verificação que tens não faz verificação (como verificar se as 2as passwords são iguais).

Fazes coisas a mais (como processar em sha1 a password e a sua repetição, limpares o e-mail e a sua repetição como para meteres os dois na base de dados).

Depois tenho o teu script que acrescentei o resto dos campos a validar:

function validaForm() {
    d = document.formulario;

    if (d.primeiro_nome.value == "") {
        d.primeiro_nome.focus();
        d.aviso1.style.display = 'block';
        return false;
    }else if(d.ultimo_nome.value == ""){
        d.ultimo_nome.focus();
        d.aviso2.style.display = 'block';
        return false;
    }else if(d.email.value == ""){
        d.email.focus();
        d.aviso3.style.display = 'block';
        return false;
    }else if(d.repita_email.value == ""){
        d.repita_email.focus();
        d.aviso4.style.display = 'block';
        return false;
    }else if(d.pass.value == ""){
        d.pass.focus();
        d.aviso5.style.display = 'block';
        return false;
    }else if(d.repita_pass.value == ""){
        d.repita_pass.focus();
        d.aviso6.style.display = 'block';
        return false;
}else{
	return true;
}
}

Isso não verifica todos os problemas. Usando esse código só irás indicar o 1º problema que existe.

Tenta, em vez disso, usar vários if em vez de else if. E usar uma variável que inicializas a true aonde:

Se algum dos if deu true, a variável passa a false.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
rmlm
O sistema de verificação que tens não faz verificação (como verificar se as 2as passwords são iguais).

Fazes coisas a mais (como processar em sha1 a password e a sua repetição, limpares o e-mail e a sua repetição como para meteres os dois na base de dados).

Sim isso eu sei... eu agora só estou preocupado em resolver o problema do post inicial!

Share this post


Link to post
Share on other sites
rmlm

@ ruimcosta

Meti o teu codigo assim:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style>
    .erros{
        display: none;
        color: #ff0000;
    }
</style>

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
        google.load("jquery", "1.4.2");
</script>

<script>
$(document).ready(function(){
    $("#btnenviar").click(function(e){
        e.preventDefault();
        
        var erro;
        
        if( $("#primeiro_nome").val() == "" ){
            $("#aviso1").html("Indique o seu primeiro nome").fadeIn('slow');
            erro = 1;
        }else{
           $("#aviso1").fadeOut('slow'); 
           erro = 0;
        }

        if( $("#ultimo_nome").val() == "" ){
            $("#aviso2").html("Indique o seu ultimo nome").fadeIn('slow');
            erro = 1;
        }else{
           $("#aviso2").fadeOut('slow'); 
           erro = 0;
        }
        
        if( erro == 0 ){
                        $("form").submit();        
                }
    });
});
</script>

</head>

<body>
<?php
if( $_SERVER['REQUEST_METHOD'] == 'POST' ){
    if( isset($_POST['primeiro_nome']) ){
        if( $_POST['primeiro_nome'] == "" ){
            $pnome  = "";
            $aviso1 = 'Indique o seu primeiro nome';
        }else{
            $pnome  = $_POST['primeiro_nome'];
            $aviso1 = "";
        }
    }

    if( isset($_POST['ultimo_nome']) ){
        if( $_POST['ultimo_nome'] == "" ){
            $unome  = "";
            $aviso2 = 'Indique o seu ultimo nome';
        }else{
            $unome  = $_POST['ultimo_nome'];
            $aviso2 = "";
        }
    }    
}
?>
<form name="formulario" id="formulario" action="registar.php" method="post">
    <div class="titulo">Primeiro Nome:</div>
    <div>
        <span><input class="ip_registo" name="primeiro_nome" id="primeiro_nome" type="text" value="<?php echo $pnome; ?>" /></span>
        <span id="aviso1" class="erros"><?php echo $aviso1; ?></span>
    </div>
    <div class="titulo">Ultimo Nome:</div>
    <div>
        <span><input class="ip_registo" name="ultimo_nome" id="ultimo_nome" type="text" value="<?php echo $unome; ?>" /></span>
        <span id="aviso2" class="erros"><?php echo $aviso2; ?></span>
    </div>
    <input type="submit" value="Enviar" id="btnenviar" name="btnenviar" />
</form>
</body>
</html>

Mas isto está a enviar para o value dos inputs isto:

<br /><b>Notice</b>:  Undefined variable: pnome in <b>C:\xampp\htdocs\Projecto\test.php</b> on line <b>77</b><br />

Share this post


Link to post
Share on other sites
ruimcosta

Claro que da erro....se um gajo dormisse as 8 horas recomendadas.....dorme-se metade depois anda-se assim.  :) .

antes da linha if( $_server.... mete:

  $pnome  = "";

  $unome  = "";


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
rmlm

Claro que da erro....se um gajo dormisse as 8 horas recomendadas.....dorme-se metade depois anda-se assim.  :D .

antes da linha if( $_server.... mete:

  $pnome  = "";

  $unome  = "";

LOL

Já deu! obrigado!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.