Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Declarando variavel

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.