Ajuda com session e header

288 views
Skip to first unread message

Luiz Guilherme Mascarenhas

unread,
Feb 22, 2011, 8:49:46 AM2/22/11
to go...@googlegroups.com
Olá a todos!

Tenho encontrado problemas sempre que uso session_start() e header(location:xxx.php)
um exemplo é a página abaixo:

<?php
session_start();
require "conexao.php";

ob_start();
//Acrescenta \ antes de aspas simples evitando a entrada de sql injection
$login = isset($_POST["txt_login"]) ? addslashes(trim($_POST["txt_login"])) : FALSE;
$senha = isset($_POST["txt_senha"]) ? md5(trim($_POST["txt_senha"])) : FALSE;

//testa se login não foi setado OU senha não foi setada
if(!$login || !$senha)
{
   // header("Location: negado.php");
    exit;
}


//seleciona os dados
$SQL = "SELECT * FROM `tb_usuarios` WHERE email= '$login'";
$result_id = mysql_query($SQL) or die("Erro no banco de dadosaqui!");
$total = mysql_num_rows($result_id);

if($total)
{
    $dados = mysql_fetch_row($result_id);

    if(!strcmp($senha, $dados[4]))
    {
        $_SESSION["nome_usuario"] = stripslashes($dados[2]);
        $_SESSION["id"] = stripslashes($dados[0]);
        $_SESSION["evento"] = '1';
       
        if($dados[5])
            {
                    
                header("Location: area_profissional.php");
                exit;
            }
        else
        {
        header('Location: area_usuario.php');
        exit;
        }
    }
    else
    {
        header("Location: negado.php");
        exit;
    }
}
else
{
    header("Location: negado.php");
    exit;
}
ob_end_flush();
?>


Que retorna a seguinte mensagem



Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/livro3/public_html/atenderapido/rlogin.php:1) in /home/livro3/public_html/atenderapido/rlogin.php on line 2

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/livro3/public_html/atenderapido/rlogin.php:1) in /home/livro3/public_html/atenderapido/rlogin.php on line 2

Warning: Cannot modify header information - headers already sent by (output started at /home/livro3/public_html/atenderapido/rlogin.php:1) in /home/livro3/public_html/atenderapido/rlogin.php on line 36

Acho que já segui as recomendações que encontrei, mas não solucionou.

Se alguém puder me dar uma ajuda agradeço!

--
Luiz Guilherme L. Mascarenhas
         

Ole Peter Smith

unread,
Feb 22, 2011, 9:07:24 AM2/22/11
to go...@googlegroups.com
Vc ja escreveu algo output, porisso nao pode setar cookies.

Isto pode ate ser um arquivo PHP tendo algo depois de terminar php:

---begin
<?PHP
,x,x,x
lclcl
?>
(linha vazil aqui)
(linha vazil aqui)
--end

Ole

> Warning: session_start() [function.session-start]: Cannot send session
> cookie - headers already sent by (output started at
> /home/livro3/public_html/atenderapido/rlogin.php:1) in
> /home/livro3/public_html/atenderapido/rlogin.php on line 2
>
> Warning: session_start() [function.session-start]: Cannot send session cache
> limiter - headers already sent (output started at
> /home/livro3/public_html/atenderapido/rlogin.php:1) in
> /home/livro3/public_html/atenderapido/rlogin.php on line 2
>
> Warning: Cannot modify header information - headers already sent by (output
> started at /home/livro3/public_html/atenderapido/rlogin.php:1) in
> /home/livro3/public_html/atenderapido/rlogin.php on line 36
>
> Acho que já segui as recomendações que encontrei, mas não solucionou.
>
> Se alguém puder me dar uma ajuda agradeço!
>
> --
> Luiz Guilherme L. Mascarenhas
>
>

> --
> Você recebeu esta mensagem porque está inscrito na Lista "GOPHP" em Grupos
> do Google.
> Para Postar: go...@googlegroups.com
> Para Sair do Grupo: gophp-un...@googlegroups.com
> Link: http://groups.google.com/group/gophp?hl=pt-BR

--
                                            /////
                                         ( O O )
=================oOO==(_)==OOo=================
                     Idéias são o cúmulo de fertilidade.
                 Pessoa para Pessoa - idéia à idéias
                                 .oooO   Oooo.
==================(     )=(     )=====================
                                     \  (     )  /
                                      \_)   (_/
===============================================
                        Ole Peter Smith, IME, UFG
    http://www.mat.ufg.br/docentes/olepeter - ole at mat.ufg.br
===============================================
                   Life sure is a Mystery to be Lived
                      Not a Problem to be Solved
===============================================

Luiz Guilherme Mascarenhas

unread,
Feb 22, 2011, 9:23:46 AM2/22/11
to go...@googlegroups.com
Ole o que tem de saída nesse arquivo são os headers (que também estão dando problema).
Já verifiquei se tem linha vazia mas não tem.

Ole Peter Smith

unread,
Feb 22, 2011, 9:27:14 AM2/22/11
to go...@googlegroups.com
Vc que sabe, mas ja perdi tempo de mais com algum arquivo incluido
contendo uma linha a mais.

Ole

2011/2/22 Luiz Guilherme Mascarenhas <luizgmas...@gmail.com>:


> Ole o que tem de saída nesse arquivo são os headers (que também estão dando
> problema).
> Já verifiquei se tem linha vazia mas não tem.
>

Wanderson Bezerra

unread,
Feb 22, 2011, 12:10:02 PM2/22/11
to go...@googlegroups.com
Olá Luiz,

Esse erro é devido você já ter feito o session_start() em outro arquivo no qual esse arquivo rlogin.php está incluido.

Wanderson Bezerra
Wanderson Bezerra

Pois que aproveita ao homem ganhar o mundo inteiro, se perder a sua alma? Ou que dará o homem em recompensa da sua alma? - Mateus 16:26

Java Nerds

unread,
Feb 22, 2011, 10:05:42 AM2/22/11
to GOPHP
use @session_start() pq se alguma session foi iniciada anteriormente
ele não retornara erro pq as vezes mais de uma session for aberta
tenta isso flw

On 22 fev, 11:27, Ole Peter Smith <ole....@gmail.com> wrote:
> Vc que sabe, mas ja perdi tempo de mais com algum arquivo incluido
> contendo uma linha a mais.
>
> Ole
>

> 2011/2/22 Luiz Guilherme Mascarenhas <luizgmascaren...@gmail.com>:


>
> > Ole o que tem de saída nesse arquivo são os headers (que também estão dando
> > problema).
> > Já verifiquei se tem linha vazia mas não tem.
>
> > --
> > Você recebeu esta mensagem porque está inscrito na Lista "GOPHP" em Grupos
> > do Google.
> > Para Postar: go...@googlegroups.com
> > Para Sair do Grupo: gophp-un...@googlegroups.com
> > Link:http://groups.google.com/group/gophp?hl=pt-BR
>
> --
>                                             /////
>                                          ( O O )
> =================oOO==(_)==OOo=================
>                      Idéias são o cúmulo de fertilidade.
>                  Pessoa para Pessoa - idéia à idéias
>                                  .oooO   Oooo.
> ==================(     )=(     )=====================
>                                      \  (     )  /
>                                       \_)   (_/
> ===============================================
>                         Ole Peter Smith, IME, UFG

>    http://www.mat.ufg.br/docentes/olepeter- ole at mat.ufg.br

Wender Fernandes

unread,
Feb 22, 2011, 2:34:41 PM2/22/11
to go...@googlegroups.com
O problema está no header, você não pode ter conteudo HTML gerado antes dele. Faça um teste colocando @ na frente dele e verá que o erro está aí.

Em 22 de fevereiro de 2011 14:27, Java Nerds <nilowe...@gmail.com> escreveu:
Truta use @session_start(), ai ele nao retornara mais se jah houver
uma sessão aberta


On 22 fev, 10:49, Luiz Guilherme Mascarenhas
> *Warning*: session_start()
> [function.session-start<http://www.atenderapido.com.br/function.session-start>]:
> Cannot send session cookie - headers already sent by (output started at
> /home/livro3/public_html/atenderapido/rlogin.php:1) in *
> /home/livro3/public_html/atenderapido/rlogin.php* on line *2*
>
> *Warning*: session_start()
> [function.session-start<http://www.atenderapido.com.br/function.session-start>]:
> Cannot send session cache limiter - headers already sent (output started at
> /home/livro3/public_html/atenderapido/rlogin.php:1) in *
> /home/livro3/public_html/atenderapido/rlogin.php* on line *2*
>
> *Warning*: Cannot modify header information - headers already sent by
> (output started at /home/livro3/public_html/atenderapido/rlogin.php:1) in *
> /home/livro3/public_html/atenderapido/rlogin.php* on line *36*

>
> Acho que já segui as recomendações que encontrei, mas não solucionou.
>
> Se alguém puder me dar uma ajuda agradeço!
>
> --
> Luiz Guilherme L. Mascarenhas

Java Nerds

unread,
Feb 22, 2011, 12:27:09 PM2/22/11
to GOPHP
Truta use @session_start(), ai ele nao retornara mais se jah houver
uma sessão aberta


On 22 fev, 10:49, Luiz Guilherme Mascarenhas
<luizgmascaren...@gmail.com> wrote:
> *Warning*: session_start()
> [function.session-start<http://www.atenderapido.com.br/function.session-start>]:
> Cannot send session cookie - headers already sent by (output started at
> /home/livro3/public_html/atenderapido/rlogin.php:1) in *
> /home/livro3/public_html/atenderapido/rlogin.php* on line *2*
>
> *Warning*: session_start()
> [function.session-start<http://www.atenderapido.com.br/function.session-start>]:
> Cannot send session cache limiter - headers already sent (output started at
> /home/livro3/public_html/atenderapido/rlogin.php:1) in *
> /home/livro3/public_html/atenderapido/rlogin.php* on line *2*
>
> *Warning*: Cannot modify header information - headers already sent by
> (output started at /home/livro3/public_html/atenderapido/rlogin.php:1) in *
> /home/livro3/public_html/atenderapido/rlogin.php* on line *36*
>

Luiz Guilherme Mascarenhas

unread,
Feb 23, 2011, 8:23:48 AM2/23/11
to go...@googlegroups.com
Ainda não consegui resolver.
Preciso usar sessão para manter o usuário logado e utilizar seus dados para verificações se o usuário logado tem permissão para abrir tal página.
Mas se uso session_start() para começar a sessão do usuário sempre retorna erro que bloqueia o header(location:... ), logo o redirecionamento.
O arquivo que começa a sessão do usuário e tem os redirecionamentos é esse: (só tem isso no arquivo)


<?php
session_start();
require "conexao.php";
ob_start();
//Acrescenta \ antes de aspas simples evitando a entrada de sql injection
$login = isset($_POST["txt_login"]) ? addslashes(trim($_POST["txt_login"])) : FALSE;
$senha = isset($_POST["txt_senha"]) ? md5(trim($_POST["txt_senha"])) : FALSE;
//testa se login não foi setado OU senha não foi setada
if(!$login || !$senha)
{
    header("Location: negado.php");
   // exit;

}
//seleciona os dados
$SQL = "SELECT * FROM `tb_usuarios` WHERE email= '$login'";
$result_id = mysql_query($SQL) or die("Erro no banco de dadosaqui!");
$total = mysql_num_rows($result_id);
if($total)
{
    $dados = mysql_fetch_row($result_id);
    if(!strcmp($senha, $dados[4]))
    {
        $_SESSION["nome_usuario"] = stripslashes($dados[2]);
        $_SESSION["id"] = stripslashes($dados[0]);
        $_SESSION["evento"] = '1';     
        if($dados[5])
            {
                header("Location: area_profissional.php");
                //exit;
                echo('<script> window.open("area_profissional.php"); </script>');

            }
        else
        {
        header('Location: area_usuario.php');
        //exit;

        }
    }
    else
    {
        header("Location: negado.php");
        //exit;

    }
}
else
{
    header("Location: negado.php");
    //exit;
}
ob_end_flush();
?>

Ole Peter Smith

unread,
Feb 23, 2011, 8:32:25 AM2/23/11
to go...@googlegroups.com
vc tem que deixar session_start para depois, deve ser possivel testar
se ha um sessao ativo (do ultimo load), caso sim, vai e checkar
acesso, e decide se tem acesso (init_session) ou nao (redirect).

Ole

2011/2/23 Luiz Guilherme Mascarenhas <luizgmas...@gmail.com>:

> --
> Você recebeu esta mensagem porque está inscrito na Lista "GOPHP" em Grupos
> do Google.
> Para Postar: go...@googlegroups.com
> Para Sair do Grupo: gophp-un...@googlegroups.com
> Link: http://groups.google.com/group/gophp?hl=pt-BR

--

                                            /////
                                         ( O O )
=================oOO==(_)==OOo=================
                     Idéias são o cúmulo de fertilidade.
                 Pessoa para Pessoa - idéia à idéias
                                 .oooO   Oooo.
==================(     )=(     )=====================
                                     \  (     )  /
                                      \_)   (_/
===============================================
                        Ole Peter Smith, IME, UFG

    http://www.mat.ufg.br/docentes/olepeter - ole at mat.ufg.br

Reinaldo Borges

unread,
Feb 23, 2011, 8:35:28 AM2/23/11
to go...@googlegroups.com
A mensagem do erro diz que na linha 1 (primeira linha) do arquivo rlogin.php já existe output.

Isso geralmente acontece quando há espaço em branco antes do <?php
O primeiro byte do arquivo tem que ser o < do  <?php

Veja se o editor que você está usando não está acrescentando espaços. Veja em um editor de texto
comum, ou editor hexadecimal de arquivos.

[]'s

Reinaldo Borges


Proteja o endereço de seus amigos como estou protegendo o seu.
Ao enviar mensagens para mais de um endereço use SEMPRE o
"Cco" (cópia oculta) ou "Bcc" (Blind carbon copy).


--

Ole Peter Smith

unread,
Feb 23, 2011, 8:37:57 AM2/23/11
to go...@googlegroups.com
ajuda tmbm todar o script via a linha de comando, verificando espaco
branco escrito.

Ole

2011/2/23 Reinaldo Borges <em...@reinaldoborges.com>:

--

Luiz Guilherme Mascarenhas

unread,
Feb 23, 2011, 10:37:28 AM2/23/11
to go...@googlegroups.com
Espaço antes de <? não tem. Olhei Bloco de Notas e Notepad++. Isso pode ser um output vindo da página que chama essa que aparecem os erros?
Porque rodando localhost não dá erro e na web dá?

Wender Fernandes

unread,
Feb 23, 2011, 10:57:09 AM2/23/11
to go...@googlegroups.com
No seu localhost não dá erro provavelmente devido as configurações do php.ini, sua sessão pode não estar programada para inicializar automaticamente e no servidor já deve estar ( Cannot send session cookie - headers already) essa mensagem diz que o session já está rodando. Tente colocar um @ antes do sessio start para ver se a mensagem continua.

Em 23 de fevereiro de 2011 12:37, Luiz Guilherme Mascarenhas <luizgmas...@gmail.com> escreveu:
Espaço antes de <? não tem. Olhei Bloco de Notas e Notepad++. Isso pode ser um output vindo da página que chama essa que aparecem os erros?
Porque rodando localhost não dá erro e na web dá?

--

Douglas Camargo

unread,
Feb 23, 2011, 12:06:23 PM2/23/11
to go...@googlegroups.com
As vezes o problema pode ser em um include que talvez ele esteja fazendo...
ex:
(index.php)
<html>
...
<?php include("rlogin.php");?>
...
</html>

Ai está o problema...
Se ele não iniciou a sessão no INDEX, quando ele inclui o RLOGIN.php, a sessão não poderá ser iniciada porque existe conteúdo antes do início da sessão.
Para resolver, seria necessário iniciar a sessão no INDEX também!!!
ex:
(index.php)
<?php
session_start();
?>
<html>

...
<?php include("rlogin.php");?>
...
</html>

Nilo Vieira

unread,
Feb 23, 2011, 1:10:17 PM2/23/11
to go...@googlegroups.com
Truta dá um print_r() e vai verificando linha por linha

karlos augusto

unread,
Feb 23, 2011, 8:45:28 AM2/23/11
to go...@googlegroups.com
Luiz, Verifique dentro do "conexao.php". Existem duas possibilidades, este codigo pode estar gerando alguma excessão ou ele possui alguma html ou espaço em branco. Lembrando a observação de nossos colegas não pode haver html antes do header e como o conexao.php está antes também não pode ter htmls no codigo.

--

Rafael Sobreira Braga

unread,
Feb 23, 2011, 7:53:35 PM2/23/11
to GOPHP
Tenta fazer o seguinte:

<?
ob_start ( );

session_start ( );

require_once ( "conexao.php" );

...

ob_end_flush();
?>

Colocar as TAGs HTML também pode ajudar com o HEADER:

Tenta fazer o seguinte:

<?
ob_start ( );

session_start ( );

require_once ( "conexao.php" );

?>
<html>
<header></header>
<body>

...

</body>
</html>

<?
ob_end_flush ( );
?>

OBS: aconselho a colocar o exemplo acima em todas as páginas que for
navegar, que precisará da sessão ativa. Se trabalhar com a estrutura
tipo de template (onde todo o site/sistema roda em torno de um arquivo
principal, como por exemplo: index.php?pagina=restrito, default.php?
pagina=restrito), basta incluir o código citado acima uma vez no
arquivo principal, no caso do meu exemplo seria no index.php ou
default.php.

Também dê uma pesquisada no site do PHP sobre as funções ob_start ( )
e ob_end_flush ( ).

ob_start ( ) - http://br2.php.net/manual/pt_BR/function.ob-start.php
ob_end_flush ( ) - http://br2.php.net/manual/pt_BR/function.ob-end-flush.php

Qualquer coisa, posta o resultado... valeu!


On 23 fev, 14:06, Douglas Camargo <doug...@maxstudio.com.br> wrote:
> As vezes o problema pode ser em um include que talvez ele esteja fazendo...
> ex:
> *(index.php)*
> <html>
> ...
> <?php include("*rlogin.php*");?>
> ...
> </html>
>
> Ai está o problema...
> Se ele não iniciou a sessão no INDEX, quando ele inclui o RLOGIN.php, a
> sessão não poderá ser iniciada porque existe conteúdo antes do início da
> sessão.
> Para resolver, seria necessário iniciar a sessão no INDEX também!!!
> ex:
> *(index.php)*
>  <?php
> session_start();
> ?>
> <html>
> ...
> <?php include("*rlogin.php*");?>
> ...
> </html>

Luiz Guilherme Mascarenhas

unread,
Mar 3, 2011, 6:18:01 AM3/3/11
to go...@googlegroups.com
Obrigado a todos que responderam!
Aparentemente o problema foi resolvido com
if (!isset($_SESSION)) @session_start();
Não sei se é a maneira correta MAS resolveu, estou usando $_SESSION normalmente .
Quanto ao header("location:..."), passei a fazer via javascript, daí aproveito para dar mensagens (window.alert) quando necessário.
Reply all
Reply to author
Forward
0 new messages