Header Location não funciona quando está online

4 respostas
G

Olá, fiz uma pagina para mandar email. No servidor local funciona normalmente, mas quando boto ele online ele não redireciona.
Eu hospedei ele no webhost

<?php
    ob_start();
    session_start();
    include_once("menus/menuGlobal.php");
    echo "<center><img src='images/gif.gif'class='img-responsive' /></center>";
    include_once("rodape.php");
	$nome     = $_POST['nome'];
	$email    = $_POST['email'];
	$mensagem = $_POST['mensagem'];
    $assunto  = $_POST['assunto'];
  
    if(empty($nome)){
        $_SESSION['erro'] = "Campo nome não foi preenchido!";
         header("Location:contatos.php");
    } else if(empty($email)){
        $_SESSION['erro'] = "Campo email não foi preenchido!";
         header("Location:contatos.php");
    } else if(empty($mensagem)){
        $_SESSION['erro'] = "Campo mensagem não foi preenchido!";
         header("Location:contatos.php");
    } else if(empty($assunto)){
        $_SESSION['erro'] = "Campo assuno não foi preenchido!";
         header("Location:contatos.php");
    }

    if((!empty($nome)) && (!empty($email)) && (!empty($mensagem))){

        require 'vendor/autoload.php';

        $from = new SendGrid\Email(null, $email);
        $subject = $assunto;
        $to = new SendGrid\Email(null, "[email removido]");
        $content = new SendGrid\Content("text/html", "<br><br>Nova mensagem de contato pelo site<br><br>Nome: $nome<br>Email: $email <br>Mensagem: $mensagem");
        $mail = new SendGrid\Mail($from, $subject, $to, $content);

        //Necessário inserir a chave 

        $apiKey = '';

        $sg = new \SendGrid($apiKey);

        $response = $sg->client->mail()->send()->post($mail);

        if($response){
            $_SESSION['sucesso'] = "Email enviado com sucesso, em breve estaremos respondendo!";
            header("Location:contatos.php");
        }else{
            $_SESSION['erro'] = "Email não enviado, tente novamente!";
            header("Location:contatos.php");
        }
    }

    header("Location:contatos.php");     
    ob_end_flush(); 
    ?>

`

4 Respostas

R

Estranho funcionar mesmo localmente, pois quando se usa a função header, não se deve imprimir nada antes (echo, print, printf ou html puro por exemplo)…

Recomendo retirar/comentar ou mover a linha do echo center… para baixo de tudo…

Outra prática antiga era colocar um exit logo abaixo de cada header que usa location…

header("Location:contatos.php");
exit;

Isso evitava a continuação das linhas abaixo, não sei como está hoje na versão 7…

Essa linha abaixo do header não faz sentido

ob_end_flush();

Já que após redirecionamento, o php não terá mais controle sobre ela…

Assim como ob_start(); é muito utilizado para downloads de arquivos não para redirecionamentos, sugiro removê-los do seu código, pois são usados para limpeza de buffer (streams), coisa que você não vai usar mandando email…

G

Já fiz, mas não resolveu.

<?php
        session_start();
        //include_once("menus/menuGlobal.php");
        //echo "<center><img src='images/gif.gif'class='img-responsive' /></center>";
        //include_once("rodape.php");
		$nome     = $_POST['nome'];
		$email    = $_POST['email'];
		$mensagem = $_POST['mensagem'];
        $assunto  = $_POST['assunto'];
      
        if(empty($nome)){
            $_SESSION['erro'] = "Campo nome não foi preenchido!";
             header("Location:contatos.php");
        } else if(empty($email)){
            $_SESSION['erro'] = "Campo email não foi preenchido!";
             header("Location:contatos.php");
        } else if(empty($mensagem)){
            $_SESSION['erro'] = "Campo mensagem não foi preenchido!";
             header("Location:contatos.php");
        } else if(empty($assunto)){
            $_SESSION['erro'] = "Campo assuno não foi preenchido!";
             header("Location:contatos.php");
        }

        if((!empty($nome)) && (!empty($email)) && (!empty($mensagem))){

            require 'vendor/autoload.php';

            $from = new SendGrid\Email(null, $email);
            $subject = $assunto;
            $to = new SendGrid\Email(null, "[email removido]");
            $content = new SendGrid\Content("text/html", "<br><br>Nova mensagem de contato pelo site<br><br>Nome: $nome<br>Email: $email <br>Mensagem: $mensagem");
            $mail = new SendGrid\Mail($from, $subject, $to, $content);

            //Necessário inserir a chave 

            $apiKey = '';

            $sg = new \SendGrid($apiKey);

            $response = $sg->client->mail()->send()->post($mail);

            if($response){
                $_SESSION['sucesso'] = "Email enviado com sucesso, em breve estaremos respondendo!";
                header("Location:contatos.php");
            }else{
                $_SESSION['erro'] = "Email não enviado, tente novamente!";
                header("Location:contatos.php");
            }
        }

        header("Location:contatos.php");   
        exit;
        ?>
R

Cada header precisa ter seu exit abaixo…

Outra coisa, verifique se não tem algum espaço em branco antes e após os simbolos do php e retire-os…

<?php ... ?>

E por fim, deixe essas diretivas no começo do arquivo só para testar e pegar erros…

<?php
ini_set('display_errors', true);
error_reporting(E_ALL);
...
G

RESOLVI. O problema era o espaço em branco antes de abrir o php. Obrigado a todos!

Criado 11 de agosto de 2017
Ultima resposta 12 de ago. de 2017
Respostas 4
Participantes 2