Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Opa pessoal!
Tudo certo com vocês? Espero que sim!
Estou desenvolvendo um sistema pra minha empresa, e ao hospedar o mesmo em um servidor obtive o seguinte erro na página de login.
Erro na Linha: #68 :: Cannot modify header information - headers already sent by (output started at /home/emtellogistica/www/index.php:62)
/home/emtellogistica/www/index.php
No meu servidor LOCAL o erro simplesmente não ocorre e tudo funciona bem. Estudando sobre o erro vi que não é possibilitado o envio de header após output, mas, até onde sei, não houve output HTML até a parte em que dou o "Location" no usuário após logado
Segue o código:
<?php require("_app/Config.inc.php");?>
<?php session_start();?>
<?php $login = new Login(3);
if($login->CheckLogin()):
header("Location: home.php");
endif;?>
<!DOCTYPE html>
<html>
<head>
<!-- Meta, title, CSS, favicons, etc. -->
<meta charset="utf-8">
<title>EMTEL - Sistema de Gestão</title>
<meta name="keywords" content="HTML5, Bootstrap 3, Admin Template, UI Theme"/>
<meta name="description" content="Alliance - A Responsive HTML5 Admin UI Framework">
<meta name="author" content="ThemeREX">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Font CSS (Via CDN) -->
<link rel='stylesheet' type='text/css' href='[http://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700'>](http://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700)
<link href='[https://fonts.googleapis.com/css?family=Lato:400,300,300italic,400italic,700,700italic'](https://fonts.googleapis.com/css?family=Lato:400,300,300italic,400italic,700,700italic) rel='stylesheet'
type='text/css'>
<!-- Theme CSS -->
<link rel="stylesheet" type="text/css" href="assets/skin/default_skin/css/theme.css">
<!-- Admin Forms CSS -->
<link rel="stylesheet" type="text/css" href="assets/admin/forms/css/forms.css">
<!-- Favicon -->
<link rel="shortcut icon" href="assets/img/favicon.ico">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body class="external-page sb-l-c sb-r-c">
<!-- Start: Main -->
<div id="main" class="animated fadeIn">
<!-- Start: Content-Wrapper -->
<section id="content_wrapper">
<!-- begin canvas animation bg -->
<div id="canvas-wrapper">
<canvas id="demo-canvas"></canvas>
</div>
<!-- Begin: Content -->
<section id="content">
<!-- Login -->
<div class="admin-form theme-primary mw320" id="login">
<div class="panel mw320">
<?php $dataLogin = filter_input_array(INPUT_POST, FILTER_DEFAULT);
if(!empty($dataLogin['adminlogin'])):
$login->ExeLogin($dataLogin);
if(!$login->getResult()):
WSErro($login->getError()[0], $login->getError()[1]);
else:
header("Location: home.php");
endif;
endif;
$get = filter_input(INPUT_GET, 'exe', FILTER_DEFAULT);
if(!empty($get)):
if($get == 'restrito'):
WSerro('<b>Oops:</b> Você tentou acessar uma área restrita! Favor efetue login.', WS_ALERT);
elseif($get == 'logoff'):
WSErro('<b>Sucesso ao deslogar:</b> Sua sessão foi finalizada com sucesso', WS_ACCEPT);
endif;
endif;?>
<form name="adminlogin" method="post" action="index.php">
<div class="panel-body pn mv10">
<div class="section">
<label for="username" class="field prepend-icon">
<input type="text" name="user" id="username" class="gui-input"
placeholder="Usuário">
<label for="username" class="field-icon">
<i class="fa fa-user"></i>
</label>
</label>
</div>
<!-- end section -->
<div class="section">
<label for="password" class="field prepend-icon">
<input type="password" name="pass" id="password" class="gui-input"
placeholder="Senha">
<label for="password" class="field-icon">
<i class="fa fa-lock"></i>
</label>
</label>
</div>
<!-- end section -->
Não sei mais o que fazer...
Porque este erro ocorre em um servidor WEB e não ocorre no meu servidor LOCAL?
Obs: Todos as mensagens de erro estão habilitadas no meu servidor local.
Agradeço desde já toda e qualquer ajuda.
valeu pessoal!
Opa ESerra
Obrigado pela resposta;
Mas então como resolver o problema? Porquê no meu servidor Local o erro não acontece?
Obrigado
Atte;
Rogério;
Agradeço a atenção.
Eu já tinha lido esta postagem antes de postar aqui, não sei se fui "burro" mas, não consegui resolver. Não consigo achar a lógica do problema, principalmente pelo fato dele funcionar normalmente no meu servidor Local.
Continuo pedindo a ajuda de vocês
Obrigado!
Não pode haver saídas ao navegador antes de header().
Você tem código HTML antes de header(). Esse é o problema
Leia mais neste link
Beraldo;
Existe uma explicação então do porque não houve o erro no meu servidor local?
Como vou exibir mensagem de erro naquela parte do HTML (caso o login não tenha sido efetuado por erro de senha ou similar) se eu tiver que puxar o Header la pra cima antes de qualquer HTML?
Tem como me da um exemplo de como deveria ficar meu código?
Obrigado!
O seu *Config.inc.php *tem *HTML* -> **<p><small><b><span> = ** código *HTML*, basta inverter.
<?php session_start();?>
<?php require("_app/Config.inc.php");?>Existe uma explicação então do porque não houve o erro no meu servidor local?
Sim, existe.
Você pode estar com os erros ocultos ou com output_buffering ativado (valor maior que 0)
Habilite todas as exibições de erro, como mostrado neste tópico, na Orientação No. 2 e deixe output_buffering, no php.ini, com o valor Off.
>
Como vou exibir mensagem de erro naquela parte do HTML (caso o login não tenha sido efetuado por erro de senha ou similar) se eu tiver que puxar o Header la pra cima antes de qualquer HTML?
Tem como me da um exemplo de como deveria ficar meu código?
Você pode usar uma Estrutura MVC, separando a programação do HTML.
Outra saída é usar as Funções de Controle de Buffer, como ob_start() e ob_end_flush()
Beraldo;
Como ainda sou iniciante na linguagem, levaria um tempo até aprender MVC e estruturar a aplicação neste modelo, por isso, acredito que a solução mais prática e rápida seria as funções de controle...
Procurei no manual PHP, entendi a função delas, porém, como utilizá-las? Em que parte do código eu deveria colocar o ob_start e o ob_end_flush?
Agradeço!
É só usar ob_start() no começo. Se você não limpar o buffer manualmente, o PHP limpa automaticamente e envia pro navegador.
Mas procure usar MVC ou uma forma mais organizada, pra separar PHP e HTML. Seus códigos ficarão muito mais limpos e claros. Iniciante ou Avançado, qualquer um é capaz de programar de forma clara :)
Quando você inicia uma sessão é criado um cookie, neste momento os cabeçalhos são enviados...