aesp Posted June 8, 2012 at 01:41 PM Report Share #461401 Posted June 8, 2012 at 01:41 PM (edited) 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. Obrigado. 🙂 Edited June 8, 2012 at 06:21 PM by aesp Link to comment Share on other sites More sharing options...
brunoais Posted June 8, 2012 at 01:51 PM Report Share #461403 Posted June 8, 2012 at 01:51 PM Código js e o código que trata da resposta (php) sff. "[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 More sharing options...
aesp Posted June 8, 2012 at 01:57 PM Author Report Share #461405 Posted June 8, 2012 at 01:57 PM (edited) 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 June 8, 2012 at 02:57 PM by brunoais geshi! Link to comment Share on other sites More sharing options...
brunoais Posted June 8, 2012 at 03:07 PM Report Share #461448 Posted June 8, 2012 at 03:07 PM (edited) 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 June 8, 2012 at 03:08 PM by brunoais realmente... vê-se melhor com as tags code... 1 Report "[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 More sharing options...
aesp Posted June 8, 2012 at 03:18 PM Author Report Share #461454 Posted June 8, 2012 at 03:18 PM 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 More sharing options...
aesp Posted June 8, 2012 at 04:35 PM Author Report Share #461480 Posted June 8, 2012 at 04:35 PM 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 More sharing options...
HappyHippyHippo Posted June 8, 2012 at 04:54 PM Report Share #461488 Posted June 8, 2012 at 04:54 PM isso é porque live.com.pt é na realidade um endereço de email inválido ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
aesp Posted June 8, 2012 at 05:22 PM Author Report Share #461495 Posted June 8, 2012 at 05:22 PM (edited) isso é porque live.com.pt é na realidade um endereço de email inválido ... Não necessariamente, eu possuo email no live.com.pt e assim como eu um utilizador também poderá ter. Edited June 8, 2012 at 05:23 PM by aesp Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 8, 2012 at 05:24 PM Report Share #461498 Posted June 8, 2012 at 05:24 PM estás a dizer que o teu email é live.com.pt ??? impossivel ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
aesp Posted June 8, 2012 at 05:26 PM Author Report Share #461500 Posted June 8, 2012 at 05:26 PM estás a dizer que o teu email é live.com.pt ??? impossivel ... Atenção, estou a falar do domínio obviamente. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 8, 2012 at 05:28 PM Report Share #461502 Posted June 8, 2012 at 05:28 PM 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. será que estou a ler bem ??? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
aesp Posted June 8, 2012 at 05:30 PM Author Report Share #461503 Posted June 8, 2012 at 05:30 PM será que estou a ler bem ??? Devemos estar aqui com alguma confusão 😄 O que eu estou a dizer é, se o utilizador colocar email@live.com.pt, ele considera o email inválido. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 8, 2012 at 05:40 PM Report Share #461506 Posted June 8, 2012 at 05:40 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
aesp Posted June 8, 2012 at 06:04 PM Author Report Share #461515 Posted June 8, 2012 at 06:04 PM 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 More sharing options...
HappyHippyHippo Posted June 8, 2012 at 06:14 PM Report Share #461518 Posted June 8, 2012 at 06:14 PM $pattern = "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-.]+\.[a-zA-Z]{2,3}$/"; print_r(preg_match($pattern, "email@live.com.pt")); // 1 eu testei antes de fazer post ... 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
aesp Posted June 8, 2012 at 06:20 PM Author Report Share #461522 Posted June 8, 2012 at 06:20 PM $pattern = "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-.]+\.[a-zA-Z]{2,3}$/"; print_r(preg_match($pattern, "email@live.com.pt")); // 1 eu testei antes de fazer post ... Falha minha, peço desculpa. Está a funcionar 5*, muito obrigado. 🙂 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now