Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Opa galera. Então depois que eu comecei a usar cookies no meu sistema o seguinte erro está acontecendo Cannot modify header information - headers already sent by não sei exatamente o que é e preciso de ajuda. O erro ocorre quando eu verifico se a caixa "mantenha-me conectado" é marcada então eu faço uma verificação direto no index.
<?php
session_start();
include '../app/configuracao.php';
include '../app/autoload.php';
include '../app/Controllers/Admins.php';
$rotas = new Rota();
$db = new DataBase();
$control = new Admins();
if(isset($_COOKIE['acesso'])){
$db->query('select * from admins where acesso = :acesso');
$db->bind('acesso',$_COOKIE['acesso']);
$db->resultado();
if($db->resultado()){
$control->fazLogin(isset($db->resultado()->email), isset($db->resultado()->senha));
}
}
?>@Matheus Tavares irei postar aqui onde está o erro já que não achei nenhuma quebra de linha
<?php
class Url {
public static function redirecionar($url){
header("Location: ".URL.DIRECTORY_SEPARATOR.$url);
}
}
É essa classe que indica o erro, onde está esse header se caso eu colocar um @ nela o erro desaparece.
Esse método é o que cria a sessão caso um cookie seja encontrado.
private function criarSessaoCookie($admin){
$_SESSION['id'] = $admin->id;
$_SESSION['nome'] = $admin->nome;
$_SESSION['email'] = $admin->email;
$_SESSION['acesso'] = $admin->acesso;
setcookie('acesso', $_SESSION['acesso'], time() + (30 * 24 * 3600), "/");
URL::redirecionar('paginas/home');
}Olá @Sapinn.
Muito provavelmente você possui um desses cenários:
1 - Algum(ns) arquivo(s) com codificação UTF-8 BOM (byte-order mark). Preferencialmente seus arquivos devem estar em UTF-8.
/applications/core/interface/imageproxy/imageproxy.php?img=https://i.stack.imgur.com/vkXhf.png&key=ff9e516f6b10ae33d10609a3e40f8c6481ca22b8a9e6652f74f0fc2739844cf0" width="286" data-imageproxy-source="https://i.stack.imgur.com/vkXhf.png" />
Essa print é no Notepad++, onde você pode fazer a remoção do BOM com facilidade. ANSI também é aceitável. Se o seu arquivo estiver em ANSI, mantenha-o assim para evitar problemas com acentos.
2 - Alguma quebra de linha após um fechamento de tag **?>**.
No PHP, a tag de fechamento ?> é opcional, ou seja, se você não deseja inserir nenhum HTML após o PHP, basta finalizar suas linhas de código e omitir o fechamento.
Por que isso seria uma boa prática? Porque evita que seu código envie à resposta caracteres indesejados.
Veja um exemplo:
<?php
class MinhaClasse {
}
?>
aqui é onde pode ter caracteres invisíveis desnecessários
Seus arquivos podem perfeitamente ser escritos assim:
<?php
class MinhaClasse {
}
3 - Alguma saída, caractere, quebra de linha ou chamada de funções como echo, imagejpeg, printf, print_r, etc...
É com bastante confiança que afirmo que o warning que você está recebendo seja oriundo de um desses fatores.
Aqui é discutido em mais detalhes essa questão: https://pt.stackoverflow.com/questions/4251/erro-cannot-modify-header-information-headers-already-sent
Em tempo... preciso chamar atenção para essa função:
header("Location: ".URL.DIRECTORY_SEPARATOR.$url);
A constante **DIRECTORY_SEPARATOR** é para ser substituida por barra / (notação Unix) ou contra-barra \ (notação Windows), de acordo com o sistema do servidor.
Exemplo:
Caminho no Linux: /home/sapinn/Downloads/arquivo.pdf
Caminho no Win: C:\Users\sapinn\Downloads\arquivo.pdf
Perceba que não tem relação com URL, onde sempre utilizamos a barra normal, exemplo: google.com/link-qualquer.
Portanto, assim seria mais correto:
header('Location: ' . URL . '/' . $url);
E por fim, você deve inserir um **exit()** logo após a linha do header, pois dificilmente iria querer que seu código PHP continuasse sendo executado após uma declaração de redirecionamento. **Isso é importante.**
header('Location: ' . URL . '/' . $url);
exit();Devemos ressaltar que esse erro é porque alguma coisa já foi para o browser e agora você tentar enviar algum cabeçalho.
É comum isso acontecer devido a função include um arquivo enviou e você inclui outro que mexe em alo a respeito cabeçalho http e então tem esse erro gerado.
Como o matheus disse isso ocorre na maioria dos casos por causa de "qualquer tipo de caractere antes a abertura da tag do PHP".
Entenda que um arquivo incluído é como se fosse mesmo arquivo que executou a função include.
Se qualquer arquivo antecessor possui um caractere antes de <?php ou fechamento de ?> + algum caractere se der include em outro arquivo saiba que o cabeçalho já foi enviado.
Uma forma também de descobrir esses tipos de caracteres é através de ferramentas próprias, uma delas é o NetBeans IDE ou PhpStorm que podem identificar qualquer tipo de caractere mesmo aqueles que são invisíveis para o windows.
Um péssimo editor de código que é muito popular é o "Visual Studio Code" esse é mestre em criar anomalias em arquivos.
Vale também lembrar que se você manda algo para o cabeçalho você não pode mandar outra coisa (*O que possivelmente não é seu caso como já mencionado*).
A solução para re-envio é armazenar o buffer de saída ao qual só vai entregar o cabeçalho quando tudo estiver pronto usando o **ob_start** para esse armazenamento.
Der uma lida nesse [ARTIGO](https://www.phpit.com.br/artigos/entendendo-pra-que-serve-ob-start-ob-end-flush-ob-get-contents-e-afins.phpit) para mais detalhes.Uma nova dúvida surgiu... Quando o usuário marca a opção de manter-se conectado o link <?=URL?>/admins/cadastrar fica redirecionando o usuário para a pagina home e tudo isso por causa da função que eu chamo no index, essa função:
$control->fazLogin($db->resultado()->email, $db->resultado()->senha);
A função é a seguinte:
public function fazLogin($email, $senha){
$admin = $this->adminModel->checarLogin($email, $senha);
if($admin):
$this->criarSessao($admin);
else:
URL::redirecionar('paginas/login');
endif;
}
Não sei porquê isso acontece, eu devo retirar a essa função e chama-la em outro lugar ????
Olá @Sapinn.
Você não pode chamar a session_start() depois de ter escrito alguma coisa na resposta.
Certifique-se de não ter quebras de linha, html, echos e coisas assim no código que antecede o session_start.
Se você não encontrar nada de anormal, peço que poste exatamente a linha e o trecho do seu código apontado pela mensagem de erro, para lhe ajudar.