Ir ao conteúdo
  • Cadastre-se
Macunaíma

RESOLVIDO Limitar opção de lista com PHP

Recommended Posts

Olá galera. Em um formulário por exemplo, tenho um <input type=list> e gostaria de limitar a resposta apenas com as opções que coloquei nos <option>, com PHP. Eu sei que também existe o <select>, o que resolveria meu problema, mas ele não aceita placeholder. Acho que seria algo do tipo ->

Arquivo: contato.php<form name="contact" method="post" action="recebe.php">            <fieldset><legend><label for="Tnome"><strong id="form">Contato</strong></label></legend>                <div id="info">Mande-nos sua pergunta ou sugestão através do seguinte formulário.</div>                <p><input type="text" name="nome" id="Tnome" class="inputs" size="20" maxlength="20" placeholder="Nome" required/>  <input type="text" name="sobrenome" id="Tsobrenome" class="inputs" size="20" maxlength="20" placeholder="Sobrenome" required/> </p>                                <p><input list="estado" name="estados" id="Testado" class="inputs" placeholder="Estado" required/>                    <datalist id="estado">                        <option value="Acre"></option>                        <option value="Alagoas"></option>                                    </datalist>                </p>                <p><input type="email" name="email" id="Temail" class="inputs" size="40" maxlength="40" placeholder="e-mail" required/><br/></p>                <p><textarea name="mensagem" id="Tmensagem" class="inputs" cols="50" rows="10" placeholder="Mensagem" required></textarea><br/></p>                <p><input type="reset" value="Limpar">   <input type="submit" value="Enviar" id="enviar" class="inputs"/></p>            </fieldset>------------------------------------------------------------------------------------------------------------Arquivo: recebe.php$nome = $_POST['nome'];$sobrenome = $_POST['sobrenome'];$estado = $_POST['estados'];if ($estado != 'Acre', 'Alagoas') {	echo('Informe corretamente seu estado');}$email = $_POST['email'];$mensagem = $_POST['mensagem'];

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual é o erro exatamente?

 

Se quiser limitar basta não por mais options.

 

No php, acredito que terias que fazer um foreach para percorrer a lista portanto sua verificação está errada.

 

Uma pergunta, se o seu objetivo é um "placeholder", por que não usar o elemento select e adicionar um option primário com value 0(zero) e a palavara "estado e no php verificar,  se o valor for zero... é porque a pessoa nao selecionou nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Limitar no sentido de não haver outras respostas alem das oferecidas pelos <option>. Posso fazer isso com o select também, já tinha pensado nisso, mas também não sei como fazer esse script para a opção Estado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então..  O atributo datalist do html5 serve para você colocar uma lista pré-definida.. onde quando o usuário começar a digitar vai começar aparecendo...  como um auto complete.

Basicamente se você tenta bloquear a inserção de dados .. com um readyonly ou disabled, a lista não aparece.

 

Para contornar isso o único jeito seria validar o dado digitado no campo através do php. Mas isso não é legal, uma vez que o usuário pode digitar  Alagoas.. como ALAGOAS..  isso poderia causar problemas no seu banco de dados.

 

Neste caso em específico, o melhor  é usar o elemento select mesmo. desta maneira:

<select name="estados">  <option value="padrao">Escolha um estado</option>  <option value="alagoas">Alagoas</option>  <option value="acre">Acre</option></select>

Validação no php:

$estados = $_POST["estados"];if($estados == "padrao"):   echo "<script>alert('O estado não pode ser vazio'); history.go(-1);</script>";     exit;endif;

Mas ainda assim você vai passar trabalho.. pois imagina se você quer adicionar todos os estados...desse jeito terias que digitar um por um.

O melhor é você criar uma tabela estados no seu banco de dados e resgatar dentro do select os campos desta maneira:

<select name="estados">  <option value="0">Escolha o estado</option>  <?php     include 'conexao.php';     $busca_estado = mysql_query("select * from estados");     while($estado = mysql_fetch_object($busca_estado)):         echo "<option value='$estado->id> $estado->nome </option>";     endwhile;     ?></select>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu ja tinha digitado todos os estados no datalist. Existem mais dois campos no formulário que estou usando quase o mesmo código que você usou para o <select>.

 

O 1º é o campo para confirmar e-mail:

$confemail = $_POST["confemail"]; if($email != $confemail):   echo "<script>alert('Você confirmou seu e-mail errado'); history.go(-1);</script>";     exit;endif;

O 2º é para a senha

$confsenha = $_POST["confsenha"]; if($senha != $confsenha):   echo "<script>alert('Você confirmou sua senha errado'); history.go(-1);</script>";     exit;endif;

Acho que não errei nada nesses 2, já testei. O que você acha?

 

Ainda tenho um outro problema, o e-mail inserido na hora do cadastro não pode ser o mesmo de um já cadastrado. Consegui fazer um controle disso(vou mostrar o código em baixo), mas não da forma que gostaria. Gostaria que a verificação fosse feita na hora, não só após clicar no botao de envio.

 

Consegui fazer assim:

$email = $_POST['email'];----------------------------------------------------$sql = mysql_query("SELECT * FROM cadastro WHERE email = '$email'") or die(mysql_error());$row = mysql_num_rows($sql); if($row > 0) {	session_start();	$_SESSION['email'] = $_POST['email'];	echo "<script>alert('E-mail já cadastrado, digite outro!'); history.go(-1)</script>";exit;

PS: porque no if onde seria { } você coloca apenas :, para comportar os valores?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Respondendo sua última pergunta primeiro...

O php possui uma sintaxe alternativa onde você elimina o uso de delimitadores de bloco {}

 

exemplo:

//modo alternativoif($var > $var2):  echo "Maior";endif;//com elseif($var > $var2):    echo "Maior";else:     echo "Menor";endif;//Sintaxe ternária ( if em uma única linha)echo ($var > $var2) ? "Maior" : "menor";

Sobre a validação de email em tempo real..  você vai ter que usar ajax.

 

por exemplo você pode usar o keyup para fazer requisição a um arquivo php a cada caractere digitado... por exemplo:

$(".email").on('keyup', function(){      $.ajax({          url: 'validaEmail.php',          data: 'html',          data: $('.email').val();          success: function(callback){             $('.msg-box').html(callback);          },          error: function(callback){              $('.msg-box').html(callback);          }       });});

Quanto a suas validações da senha e email iguais.. está OK

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre a sintaxe alternativa, eu não sabia delas mesmo. No segundo exemplo com else, você coloca o else dentro do if e depois fecha o if, não é? Ficaria assim no modo mais simples:

//com elseif($var > $var2){    echo "Maior";else{     echo "Menor";}}

Já sobre a validação de email, vou ter que estudar mais um pouco aqui sobre ela e seu código, pois apenas havia ouvido falar de Ajax, não conheço a linguagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim seria isso mesmo, mas faltou um bloco delimitador na frente do else " } "   entre esse jeito e a sintaxe alternativa.. eu recomendo você se acostumar a usar a alternativa.. pois seu código vai ficar muito mais legível. vou mostrar um exemplo mais complexo.

 

exemplo de sintaxe normal:

//Que coisa horrível de ler mesmo identadowhile($var != $algumaCoisa){   if($var > $var2){      echo "alguma coisa";   }else{      echo "alguma outra coisa";   } } //Veja que beleza .. assim você não se perde no meio de tanta "chaves"while($var != $algumaCoisa):    if($var > $var2):      echo "alguma coisa";    else:      echo "alguma outra coisa";    endif;endwhile;  

O ajax, nada mais é do que uma técnica javascript que permite a requisição assíncrona de dados.

A sintaxe que eu passei, é com jQuery.  Outra dica é se não quiser fazer com keyup,.. pode fazer com focusout() para que quando digitar o email.. e sair do campo ele valida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

" Faltou um ' } ' na frente do else? ". Me parece que não, creio que fiz correto. É verdade, as chaves confundem mesmo na hora do fechamento, é questão de acostumar com a alternativa, como você disse. Sobre o Ajax, vou deixar esse tópico aberto para depois que eu ler mais sobre o keyup, dar algum retorno aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

" Faltou um ' } ' na frente do else? ". Me parece que não, creio que fiz correto.

se não colocar a chave na frente da palavra chave else  vai dar erro.

if(){}else{}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O } na frente do else pertence ao IF,  assim como o último }  pertence ao ELSE]

 

Tem gente que gosta de identar desta maneira:

if(){  //delimitador inicial do IF} // delimitador final do IFelse{  // delimitador inicial do ELSE} // delimitador final do ELSE

Compartilhar este post


Link para o post
Compartilhar em outros sites

No post #6 você dá o exemplo dos modos alternativos de sintaxe. No mesmo post o if da linha 7 é fechado depois do else com um endif;​. Daí no post #7 eu perguntei:

 

 

Sobre a sintaxe alternativa, eu não sabia delas mesmo. No segundo exemplo com else, você coloca o else dentro do if e depois fecha o if, não é? Ficaria assim no modo mais simples:

//com elseif($var > $var2){    echo "Maior";else{     echo "Menor";}}

Já sobre a validação de email, vou ter que estudar mais um pouco aqui sobre ela e seu código, pois apenas havia ouvido falar de Ajax, não conheço a linguagem.

 

Por você ter colocado o endif; após o else eu achei que você escreveu o else dentro do if. Pois para mim o : seria igual ao e o endif; seria igual ao }. Então no meu exemplo o primeiro { que aparece pertence ao if e o ultimo também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, nesse caso em específico..  na sintaxe tradicional você obrigatoriamente precisa primeiro fechar o IF, para abrir um else.

Diferente da sintaxe alternativa..  onde  você só fecha o IF com o um  endif,

 

NO meu exemplo do post #6, no início você até pode confundir .. e achar que o else está dentro do if.. mas na verdade o else está na mesma linha do if.  

 

Isso é usado em outras linguagens como por exemplo o python.  onde presa a identação.

 

se for usar essa notação da alternativa tens que lembrar que:

//isso está dentro do ifif(condição):   $dentro_do_if  endif;if(condição):   $algumacoisaelse:   $dendo_do_elseendif;//exemplo mais complexo:if(condiçao):     //faz alguma coisaelseif(outra condição):      //faz outra coisaelseif(mais outra condição):     //faz outra coisaelse:    se nada cima fizer, esta fazendif;

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.





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

×