Jump to content

[Resolvido] Enviar dados para form


aesp

Recommended Posts

Boa tarde,

A minha dúvida é a seguinte, tenho um formulário que recebe um endereço de email para a subscrição de uma newsletter, quando o utilizador confirma os dados, este faz o post para um ficheiro em PHP que insere o registo ou não. O que eu gostaria de saber é como é que posso escrever no formulário o resultado do post.

Estou a utilizar Jquery para efectuar o POST para não ter que fazer refresh à página.

Deixo aqui um diagrama com a ideia geral.

VembK.png

Obrigado. 🙂

Edited by aesp
Link to comment
Share on other sites

Javascript

function newsletterSubmit() {
   $('form #response').hide();
   $('#submit').click(function(e) {
       e.preventDefault();
       var erro = '';
       var email = $('#txtEmail').val();
       if (email == '') {
           erro = '<p>Por favor, introduza um endereço de email.</p>';
       }
       else if (!email.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/)) {
           erro = '<p>Por favor, introduza um endereço de email válido.</p>';
       }
       if (erro != ''){
           $('#response').removeClass().addClass('error').html('<strong>' + erro + '</strong>').fadeIn('slow');
       }
       else {
           $('form #response').removeClass().addClass('processing')
           .html('<div class="center"><img src="img/ico/ajax-loader.gif" alt=""/>A processar pedido...</div>').fadeIn('slow');
           $.ajax({
               type: 'POST',
               url: 'newsletter.php',
               data: $('#newsletterForm').serialize(),
               success: function(data) {
                   $('form #response').removeClass().addClass('success').html('Obrigado por subscrever a nossa newsletter.').fadeIn('slow');
                   if ($('form #response').hasClass('success')) {
                       setTimeout("$('form #response').fadeOut('slow')", 5000);
                       $('#txtEmail').val('');
                   }
               },
               error: function(data) {
                   alert('erro');
               }
           });
       }
   });
}

Em relação ao PHP, estou a começar a aprender agora a linguagem, tenho aqui uma coisa básica só para controlar se os dados estavam a ser actualizados.

PHP

<?php
   include_once ('resources/init.php');
   $email = $_POST['txtEmail'];

   echo $email;

   $query = mysql_query("SELECT COUNT(email) AS total FROM newsletter WHERE email = '$email';");
   $row = mysql_fetch_assoc($query);

   if ($row['total'] == 0) {
       sleep(3);
       mysql_query("UPDATE newsletter SET email = '$email' WHERE ID = 1;");
   } else {
       mysql_query("UPDATE newsletter SET email = 'repetido' WHERE ID = 1;");
       return false;
   }
?>

Edit: Já agora o UPDATE é propositado.

Edited by brunoais
geshi!
Link to comment
Share on other sites

1º Tens que enviar dados do servidor para o cliente. Podes criar um array e usar o json_encode().

2º No cliente tens vários problemas.

O que me chamou mais a atenção é o uso do eval() (mesmo que escondido) no setTimeout(). Usa uma função anónima em vez de uma string.

Eu não sei como é que se chama o decoder de json do jQuery mas o browser tem um (JSON.parse()) que devolve um objeto.

Tens aí um abuso de processamento.

$('form #response') == $('#response')

Uma tag com um certo id é única em todo o documento não é preciso saber quem é o parent dela.

A função "$" do jQuery é custosa... Usa só o que precisas, não uses repetidamente. Se precisas da informação em 2 sítios, como para:

$('form #response')

Grava numa variável como já o fazes como o e-mail, por exemplo.

Eu não sei como é que se parecem os dados serializados pelo jQuery. Só te posso dizer que podes tentar por tentativa e erro. Podes sempre usar o var_export() do php para saberes o que está no $_POST e gravar o resultado num ficheiro para veres.

Este if:

if ($('form #response').hasClass('success')) {

é inútil. Tu sabes que ele tem a class success. Tu a metes na linha anterior!

Edited by brunoais
realmente... vê-se melhor com as tags code...
  • Vote 1

"[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%.

Link to comment
Share on other sites

1º Tens que enviar dados do servidor para o cliente. Podes criar um array e usar o json_encode().

2º No cliente tens vários problemas.

O que me chamou mais a atenção é o uso do eval() (mesmo que escondido) no setTimeout(). Usa uma função anónima em vez de uma string.

Eu não sei como é que se chama o decoder de json do jQuery mas o browser tem um (JSON.parse()) que devolve um objeto.

Tens aí um abuso de processamento.

$('form #response') == $('#response')

Uma tag com um certo id é única em todo o documento não é preciso saber quem é o parent dela.

A função "$" do jQuery é custosa... Usa só o que precisas, não uses repetidamente. Se precisas da informação em 2 sítios, como para:

$('form #response')

Grava numa variável como já o fazes como o e-mail, por exemplo.

Eu não sei como é que se parecem os dados serializados pelo jQuery. Só te posso dizer que podes tentar por tentativa e erro. Podes sempre usar o var_export() do php para saberes o que está no $_POST e gravar o resultado num ficheiro para veres.

Este if:

if ($('form #response').hasClass('success')) {

é inútil. Tu sabes que ele tem a class success. Tu a metes na linha anterior!

Obrigado brunoais,

Vou pesquisar então sobre o JSON.

Em relação as tags code, como mudaram o cms do forum não sabia que se mantinha da mesma forma, mas desde já obrigado.

Abraço 😉

Link to comment
Share on other sites

brunoais, mais uma vez obrigado pela tua ajuda, estive a procurar uma forma de fazer e realmente é bem mais simples com o JSON, vou deixar aqui em baixo o que utilizei no caso de alguém precisar, e já agora se tiveres sugestões para o código actual agradeço.

function newsletterSubmit() {
$('#newsletterForm').submit(function() {
   $.ajax({
	  type: 'POST',
	  url: 'newsletter.php',
	  data: $('#newsletterForm').serialize(),
	  dataType: 'json',
	  success: function(msg) {
		  $('#response').removeClass('error');
		  $('#response').removeClass('success');
		  $('#response').addClass(msg.status);
		  $('#response').html('<p>' + msg.message + '</p>');
	  },
	  error: function() {
		 $('#response').removeClass('sucess');
		 $('#response').addClass('error');
		 $('#response').html('Ocorreu um erro ao enviar o formulário. Por favor, tente de novo.');
	  }
   });

   return false;
});
}

<?php
if(!empty($_POST)) {
	include_once ('resources/init.php');

	$pattern = "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/";
	$email = mysql_real_escape_string($_POST['txtEmail']);
	$response_array = array();

	if(empty($email)) {
		$response_array['status'] = 'error';
		$response_array['message'] = 'Por favor, introduza um endereço de email.';
	}
	else if (!preg_match($pattern, $email)) {
		$response_array['status'] = 'error';
		$response_array['message'] = 'Por favor, introduza um endereço de email válido.';
	}
	else {
		$query = mysql_query("SELECT COUNT(email) AS total FROM newsletter WHERE email = '$email';");
		$row = mysql_fetch_assoc($query);
		if ($row['total'] > 0) {
			$response_array['status'] = 'error';
			$response_array['message'] = 'O endereço de email inserido já se encontra inscrito.';
		}
		else {
			mysql_query("INSERT INTO newsletter(email, data) VALUES('$email', NOW());");
			$response_array['status'] = 'success';
			$response_array['message'] = 'Obrigado por subscrever a nossa newsletter.';
		}
	}
	echo json_encode($response_array);
}
?>

Já agora, tenho um problema com a expressão regular, por exemplo se colocar live.com.pt ele assume como um endereço de email inválido.

Abraço. 😉

Link to comment
Share on other sites

olha para a expressão regular depois de @:

[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$

ele espera um conjunto de caracteres até encontrar um ponto (inclusive)

[a-zA-Z0-9-]+\.

depois espera um conjunte de 2 a 5 caracteres com ponto ou não

[a-zA-Z.]{2,5}

depois espera o fim da string

$

como vês, se depois do primeiro ponto após o '@' tiveres menos do que 2 ou mais do que 5 caracteres (ponto inclusive) irá falhar

tenta assim

^[a-zA-Z0-9._-]+@[a-zA-Z0-9-.]+\.[a-zA-Z]{2,3}$

verifica que adicionei o ponto ao primeiro conjunto para validar conjuntos de xxx.yyy.zzz, e retirei o ultimo ponto para só permitir domínios que terminam com dois ou três caracteres

nota: acho que rfc deixa até 5 mas não tenho a certeza

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

olha para a expressão regular depois de @:

[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$

ele espera um conjunto de caracteres até encontrar um ponto (inclusive)

[a-zA-Z0-9-]+\.

depois espera um conjunte de 2 a 5 caracteres com ponto ou não

[a-zA-Z.]{2,5}

depois espera o fim da string

$

como vês, se depois do primeiro ponto após o '@' tiveres menos do que 2 ou mais do que 5 caracteres (ponto inclusive) irá falhar

tenta assim

^[a-zA-Z0-9._-]+@[a-zA-Z0-9-.]+\.[a-zA-Z]{2,3}$

verifica que adicionei o ponto ao primeiro conjunto para validar conjuntos de xxx.yyy.zzz, e retirei o ultimo ponto para só permitir domínios que terminam com dois ou três caracteres

nota: acho que rfc deixa até 5 mas não tenho a certeza

Continua a interpretar como inválido.

Link to comment
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.