Carcleo 4 Denunciar post Postado Abril 5, 2012 pessoal tenho uma pagina contato.php e uma pagina contato_conteudo.php. Essa ultima, é o conteudo (por include) da primeira. Na contato_conteudo.php tenho um form para envi de email. Nele, jogo o action para contato.php?acao=enviar, e, na propria contato_conteudo.php, pego o retorno assim: if($_GET["acao"]=="enviar") { ... } Acontece que, como estou trabalhando com display_error(E_ALL), o php esta dizendo que a variavel $_GET["acao"] não existe. Bom, nesse instante ela realmente não existe. Como posso contornar esse problema se eu só preciso dela quando o form for submetido? Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Abril 5, 2012 Condicione a condição com outra, esta para quando o form for submetido. Existem duas possibilidades: Verificando a variável de servidor REQUEST_METHOD, buscando por post ou verificando se o elemento referente ao botão foi pressionado, com isset(). O problema da segunda abordagem é que obriga seu elemento de botão a ter um atributo name, que é opcional pelo XHTML. Sem contar que ambas as possibilidades podem ser facilmente violadas terceirizadamente, com cURL, por exemplo. Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 5, 2012 Desculpa, não entendi como proceder. E, com relação à segurança, o que eu poderia fazer? Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Abril 5, 2012 O ideal seria filtrar os dados antes de trabalhar com eles. Vamos supor que você possua uma função chamada filter que faz o tratamento na variável antes de você manipulá-la Com POST <?php if( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' ) { $action = isset( $_POST[ 'action' ] ) ? filter( $_POST[ 'action' ] ) : null; } Com GET <?php $action = isset( $_GET[ 'action' ] ) ? filter( $_GET[ 'action' ] ) : null; Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Abril 5, 2012 Posta mais do código, me ocorreu que pode não ser exatamente isso que procura... Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 5, 2012 Ta: contato.php <?php session_start(); header ("Content-Type: text/html; charset=utf-8"); // Precisa ficar aqui senão dá problema com o arquivo de classe conexão include ("global/config/conexao.php"); include ("global/config/constantes.php"); include ("global/funcoes_php/FotoExibe.php"); ?> <!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> <title><?php echo titulo_empresa;?></title> <?php include ("global/config/campos_meta.php"); ?> <link rel="stylesheet" type="text/css" href="global/config/body.css" /></link> <link rel="stylesheet" type="text/css" href="global/config/menu.css" /></link> <script type="text/javascript" src="global/validacoes_js/valida_email.js"></script> <script type="text/javascript" src="global/validacoes_js/valida_contato.js"></script> </head> <body> <div id="topo"><?php include("global/topo.php"); ?></div> <div id="base_menu"><img src="img/base_menu.gif" width="100%" height="8" alt="" /></div> <div id="conteudo"><?php include("contato_conteudo.php"); ?></div> <div id="base"><?php include("global/base.php"); ?></div> </body> </html> contato_conteudo.php <? if ($_GET["acao"]=="envia") { $nome = $_POST["nome"]; $e_mail = $_POST["mail"]; $mensagem = $_POST["mensagem"]; $titulo = "Mensagem do site"; $texto_cliente = " <table width=\"400\" border=\"0\" align=\"center\"> <tr><td align=\"center\"><img src=\"http://www.dinamicaimoveis.com.br/novo/img/logo.png\" /></td></tr> <tr><td align=\"left\"> <br /></td></tr> <tr> <td align=\"left\"> nl2br($mensagem); </td> </tr> </table> "; $texto_resposta = " <table width=\"400\" border=\"0\" align=\"center\"> <tr><td align=\"center\"><img src=\"http://www.dinamicaimoveis.com.br/novo/img/logo.png\" /></td></tr> <tr><td align=\"left\"> <br /></td></tr> <tr> <td align=\"left\"> Olá $nome!<br /> Recebemos teu email, e responderemos o mais rápido possível.<br /> Obrigado por ter nos contatados.<br /><br /> $email_site </td> </tr> </table> "; $titulo_resposta = "Re: Mensagem do site"; $titulo_cliente = "Mensagem do site"; $nome_split = split(" ",$nome); $headers = "Content-Type: text/html; charset=utf-8\n"; $headers.= "From:".titulo_cabecalho."<".email_site.">\r\n"; $headers_cliente = "Content-Type: text/html; charset=utf-8\n"; $headers_cliente.= "From: $nome<$e_mail>\r\n"; if(mail("$e_mail", "Re: $titulo_cliente","$texto","$headers")) { //E-mail ao cliente echo "<script> alert('Prezado(a) $nome_split[0]: Teu email foi enviado com sucesso!'); document.location='contato.php' </script>"; mail(email_site, "Re: $titulo_resposta","$texto_cliente","$headers_cliente"); } else { echo "<script> alert('Não foi possivel enviar o email, por favor tente novamente...'); document.location='contato.php' </script>"; } } else { ?> <form id="form_contato" method="post" action="?acao=envia"> <table border=0 cellpadding=2 cellspacing=2 align="center" width=400px> <caption>Formulário de Contato</caption> <tr> <th align="left">Nome:</th> <td><input type="text" id="nome" value="" size=60 maxlength=60></td> </tr> <tr> <th align="left">Email:</th> <td><input type="text" id="mail" value="" size=60 maxlength=60></td> </tr> <tr> <th align="left">Mensagem:</th> <td><textarea rows=10 cols=46 id="mensagem"></textarea></td> </tr> <tr> <td colspan="2"> <input type="button" value="enviar" onClick="return valida_contato()"> <input type="reset" value="Limpar Campos"> </td> </tr> </table> </form> <center><h3>Caso prefira usar teu outlook, clike <a href="mailto:<?=email_site;?>?subject=Contato pelo site">AQUI</a></h3></center> <?php } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Abril 5, 2012 Felizmente o que havia dito antes já seria suficiente nesse caso: if( $_GET['action'] == 'envia' ) { if( $_SERVER['REQUEST_METHOD'] == 'post' ) { // Executa as rotinas de envio } else { // Mostra o formulário } } else { // Mostra o formulário } Se a página de envio for solicitada, será feita uma verificação quanto ao tipo de envio. Só se for post executa as rotinas de envio. Qualquer coisa diferente disso, mostra o formulário. Mas veja a falha dos condicionais. Assim você teria de repetir o formulário duas vezes, então a forma menos problemática é você agrupar as condições: if( $_GET['action'] == 'envia' && $_SERVER['REQUEST_METHOD'] == 'post' ) { // Executa as rotinas de envio } else { // Mostra o formulário } Ainda não é ideal, mas já resolve seu problema. SE, por algum motivo maluco, o servidor que estiver usando retornar POST para essa variável, use strcasecmp() ao invés do comparador de igualdade. Ah! E, claro, trate suas variáveis como o Carlos sugeriu. Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 5, 2012 Mas é isso que to fazendo, mas como estou usando display_error(E_ALL), então, quando submeto o form e ele vai no inicio do arquivo, ele diz que: Notice: Undefined index: acao in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\dinamicaimoveis.com.br\contato_conteudo.php on line 2 O que fazer? Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Abril 5, 2012 Sua dúvida foi respondida no post #4 Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Abril 6, 2012 Como você fez? Mesmo com uma verificação grosseira, montagem porca e sem tratamento de segurança, aqui funcionou: <?php if( ( isset( $_GET['action'] ) && $_GET['action'] == 'envia' ) && $_SERVER['REQUEST_METHOD'] == 'POST' ) { var_dump( $_POST ); } else { ?> <form id="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>?action=envia"> <input type="text" name="name" /> <input type="submit" value="Vai" /> </form> <?php } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 6, 2012 Como faço um if com GET <?php$action = isset( $_GET[ 'action' ] ) ? filter( $_GET[ 'action' ] ) : null; Igual ao que fez com Post? Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Abril 6, 2012 O request method por default é GET if( $_SERVER[ 'REQUEST_METHOD' ] == 'GET' ) Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 6, 2012 entendi, só que tambem preciso validar o valor da variavel acao enviado pelo GET. Quando faço isso, ai o erro acontece. <? //if ($_GET["acao"]=="envia") if( $_SERVER[ 'REQUEST_METHOD' ] == 'GET') { if($_GET["acao"]=="enviar") { Compartilhar este post Link para o post Compartilhar em outros sites
Kakashi_Hatake 267 Denunciar post Postado Abril 6, 2012 Só isso já é suficiente <?php $acao = isset( $_GET[ 'acao' ] ) ? $_GET[ 'acao' ] : null; if( $acao == 'enviar' ) { // faz alguma coisa } Compartilhar este post Link para o post Compartilhar em outros sites
Carcleo 4 Denunciar post Postado Abril 6, 2012 Só uma dúvida agora: Estive analisando teu codigo e chegue no codigo abaixo. Se fizer desse jeito, o resultado é o mesmo? Estaria alguma coisa errada? <?php //$acao = isset( $_GET[ "acao" ] ) ? $_GET[ "acao" ] : null; if (!isset( $_GET[ "acao" ] ) ) { $_GET[ "acao" ] = null; ?> <form id="form_contato" method="post" action="?acao=envia"> <table border=0 cellpadding=2 cellspacing=2 align="center" width=400px> <caption>Formulário de Contato</caption> <tr> <th align="left">Nome:</th> <td><input type="text" id="nome" value="" size=60 maxlength=60></td> </tr> <tr> <th align="left">Email:</th> <td><input type="text" id="mail" value="" size=60 maxlength=60></td> </tr> <tr> <th align="left">Mensagem:</th> <td><textarea rows=10 cols=46 id="mensagem"></textarea></td> </tr> <tr> <td colspan="2"> <input type="button" value="enviar" onClick="return valida_contato()"> <input type="reset" value="Limpar Campos"> </td> </tr> </table> </form> <center><h3>Caso prefira usar teu outlook, clike <a href="mailto:<?=email_site;?>?subject=Contato pelo site">AQUI</a></h3></center> <?php } else { if($acao == 'enviar' ) { // faz alguma coisa} $nome = $_POST["nome"]; $e_mail = $_POST["mail"]; $mensagem = $_POST["mensagem"]; $titulo = "Mensagem do site"; $texto_cliente = " <table width=\"400\" border=\"0\" align=\"center\"> <tr><td align=\"center\"><img src=\"http://www.dinamicaimoveis.com.br/novo/img/logo.png\" /></td></tr> <tr><td align=\"left\"> <br /></td></tr> <tr> <td align=\"left\"> nl2br($mensagem); </td> </tr> </table> "; $texto_resposta = " <table width=\"400\" border=\"0\" align=\"center\"> <tr><td align=\"center\"><img src=\"http://www.dinamicaimoveis.com.br/novo/img/logo.png\" /></td></tr> <tr><td align=\"left\"> <br /></td></tr> <tr> <td align=\"left\"> Olá $nome!<br /> Recebemos teu email, e responderemos o mais rápido possível.<br /> Obrigado por ter nos contatados.<br /><br /> $email_site </td> </tr> </table> "; $titulo_resposta = "Re: Mensagem do site"; $titulo_cliente = "Mensagem do site"; $nome_split = split(" ",$nome); $headers = "Content-Type: text/html; charset=utf-8\n"; $headers.= "From:".titulo_cabecalho."<".email_site.">\r\n"; $headers_cliente = "Content-Type: text/html; charset=utf-8\n"; $headers_cliente.= "From: $nome<$e_mail>\r\n"; if(mail("$e_mail", "Re: $titulo_cliente","$texto","$headers")) { //E-mail ao cliente echo "<script> alert('Prezado(a) $nome_split[0]: Teu email foi enviado com sucesso!'); document.location='contato.php' </script>"; mail(email_site, "Re: $titulo_resposta","$texto_cliente","$headers_cliente"); } else { echo "<script> alert('Não foi possivel enviar o email, por favor tente novamente...'); document.location='contato.php' </script>"; } } } ?> Podederia ser dessa forma tambem? Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Abril 6, 2012 Você se refere à esse trecho: //$acao = isset( $_GET[ "acao" ] ) ? $_GET[ "acao" ] : null; if (!isset( $_GET[ "acao" ] ) ) { $_GET[ "acao" ] = null; ?> ? Se for, a resposta é sim, porque você fecha o bloco aqui: } else { if($acao == 'enviar' ) { // faz alguma coisa} E dentro desse ELSE, você usa uma variável não definida, coisa que o operador ternário do Carlos faz. Dessa forma se $_GET['acao'] não existir, o formulário será exibido, se existir a ação executada. Porém, como você re-condiciona a ação do formulário com a tal variável que não existe, além de o fluxo nunca entrar nesse IF, você ainda vai receber um erro de Undefined variable. A melhor opção é fazer como Carlos fez, além de ocupar menos linhas é mais legível. Mas nada te impede de fazer sem ele, unindo as duas condições num só IF: if( ! isset( $_GET['acao'] ) || $_GET['acao'] != 'enviar' ) { // Mostra formulário } else { // Executa ação } Compartilhar este post Link para o post Compartilhar em outros sites