Ir para o conteúdo
Airamzita

[Resolvido] session_destroy não destroi

Mensagens Recomendadas

Airamzita

Olá!

Encontro-me com um problema que não estou a conseguir resolver, trata-se de um site para um trabalho académico (por isso não vai online logo não irei mexer no htaccess) em que é obrigatorio fazer o login (na página index.php) para poder aceder à pagina que contém os dados (inicio.php). Para o efeito usei sessões. Está tudo bem mas acontece o seguinte:

- tenho o session_destroy() numa página aparte chamada logout, a qual é chamada dentro da pagina inicio.php, ele só faz o header("Location......). Assim, ao colocar no url /inicio.php ele vai abrir e mostrar os dados e aparece o 'Olá: (login que estava antes de fazer o session_destroy)'.

Isto é na pagina inicio.php:

<h4><a href="logout.php"><img src="logo/logout.png"> Sair </a></h4>

Isto é na pagina logout.php:

<?php
session_destroy();
header("Location: index.php");
?>

- Caso abra primeiro no url o /inicio.php, sou logo mandada para o index.php [como devia ser sempre], isto porque acho que ainda não tem sessão nenhuma aberta anteriormente. Mas assim que faço o login no index.php uma única vez, ele vai sempre pegar nos dados desse login e deixa-me entrar pelo url.

O que está errado?

Cumprimentos e obrigado:)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Olá!

trata-se de um site para um trabalho académico (por isso não vai online logo não irei mexer no htaccess)

não sei porque ?

podes muito bem usar htaccess num site local ...

- Caso abra primeiro no url o /inicio.php, sou logo mandada para o index.php [como devia ser sempre], isto porque acho que ainda não tem sessão nenhuma aberta anteriormente. Mas assim que faço o login no index.php uma única vez, ele vai sempre pegar nos dados desse login e deixa-me entrar pelo url.

O que está errado?

pela explicação, nada

sem login -> index.php

com login -> tudo bem ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
psantos10

Boas...

Na página "logout.php" a linha:

session_destroy();

não faz nada. O mesmo retorna o erro: "Warning: session_destroy(): Trying to destroy uninitialized session". Ou seja, estás a tentar destruir uma sessão que não foi inicializada.

Para resolver o seu problema, deves antes de destruir, inicializar a sessão. Logo o seu código fica assim:

<?php
 // Inicializando a sessão...
 session_start();

// Destruindo a sessão
session_destroy();

// Redireccionar o utilizador depois da destruição da sessão...
header("Location: index.php");
?>

Espero ter ajudado...

Cumps

PS

Editado por psantos10
  • Voto 1

-------Assinatura?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

não faz nada. O mesmo retorna o erro: "Warning: session_destroy(): Trying to destroy uninitialized session". Ou seja, estás a tentar destruir uma sessão que não foi inicializada.

como sabes ? viste o site a funcionar ??

Para resolver o seu problema, deves antes de destruir, inicializar a sessão. Logo o seu código fica assim:

o que ?????


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
psantos10

como sabes ? viste o site a funcionar ??

Faça o seguinte... execute este código:

<?php
   session_destroy();
?>

depois me diz o que aperece...

e outra... Frase encontrada na documentação oficial do PHP:

session_destroy() destroys all of the data associated with the current session. It does not unset any of the global variables associated with the session, or unset the session cookie. To use the session variables again, session_start() has to be called.

fonte: http://php.net/manual/en/function.session-destroy.php

Cumps

PS


-------Assinatura?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Faça o seguinte... execute este código:

<?php
   session_destroy();
?>

depois me diz o que aperece...

e outra... Frase encontrada na documentação oficial do PHP:

fonte: http://php.net/manual/en/function.session-destroy.php

Cumps

PS

:facepalm:

só quem não sabe como as sessões funcionam é que faria um teste desses

@Airamzita nunca disse que aparecia esse erro/warning. deverá esperar um comportamento que não está acontecer, se bem que o descrito é o esperado.


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
psantos10

:facepalm:

só quem não sabe como as sessões funcionam é que faria um teste desses

Ok... Porque não mostra a forma correcta? como funciona? afinal.. é assim que aprendemos, certo?

@Airamzita nunca disse que aparecia esse erro/warning. deverá esperar um comportamento que não está acontecer, se bem que o descrito é o esperado.

Ele não poderia ver o erro por dois "possivéis" motivos:

1º Logo depois do "destroy..." ele faz um redirect.

2º Poderia não ter a "exibição de erros" habilitada no PHP.

Cumps

PS


-------Assinatura?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

1º Logo depois do "destroy..." ele faz um redirect.

errado, ao ser apresentado a mensagem de erro, é enviado informação para o cliente (headers da resposta assim como a mensagem de erro) o que invalida a chamada da função header usada para o redireccionamento.

2º Poderia não ter a "exibição de erros" habilitada no PHP.

pouco provável, esse tipo de configuração é em servidores de produção.

instalações locais como o xampp e semelhantes, tem essa opção ligada, por defeito. é de notar que foi dito que é um trabalho académico e não está(e não estará no futuro) num servidor de produção.

Ok... Porque não mostra a forma correcta? como funciona? afinal.. é assim que aprendemos, certo?

é verdade que é necessário efectuar a chamada da função session_start() mas isso não é inicializar.

já que gostas de quotes do site php.net

// http://php.net/manual/en/function.session-start.php

session_start() creates a session or resumes ...

estamos a falar de uma pessoa iniciada na questão. se não disseres o que realmente é ainda vais é confundir mais.

imagina o que é dizer a uma pessoa que necessita de iniciar algo que já se encontra iniciado para o poder destruir ... pois, confusão


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
psantos10

errado, ao ser apresentado a mensagem de erro, é enviado informação para o cliente (headers da resposta assim como a mensagem de erro) o que invalida a chamada da função header usada para o redireccionamento.

Errado! Pois a chamada da função header seria invalidada caso o erro gerado fosse "Fatal Error". Mas no caso, foi um "Warning" (O script continua a ser executado)

pouco provável, esse tipo de configuração é em servidores de produção.

instalações locais como o xampp e semelhantes, tem essa opção ligada, por defeito. é de notar que foi dito que é um trabalho académico e não está(e não estará no futuro) num servidor de produção.

Mas acontence. Eu pessoalmente não uso Xamp, Wamp (como software que integra tudo e não conceito) ou algo parecido.

Nas versões antigas do PHP (incluindo as versões actuais no Linux) estas opções viam (vêm) desligadas. E no windows, para quem não utiliza softwares com Wamp, ou seja, instalando individulmente o Apache, PHP, MySQL, ... , as versões mais recentes do PHP trazem dois arquivos de configuração. O PHP.ini-development (opções em questão ligadas) e PHP.ini-production (... desligadas);

é verdade que é necessário efectuar a chamada da função session_start() mas isso não é inicializar.

já que gostas de quotes do site php.net

estamos a falar de uma pessoa iniciada na questão. se não disseres o que realmente é ainda vais é confundir mais.

imagina o que é dizer a uma pessoa que necessita de iniciar algo que já se encontra iniciado para o poder destruir ... pois, confusão

Ok... tens razão em dizer que não é inicializar... e que o correcto seria "criar sessão" ou "resumir sessão". Mas note que não existe confusão nenhuma em dizer que para destruir a sessão ele deve primeiro cria-la... Ou seja, para aplicação pode até estar criada, mas para aquele ficheiro (logout.php) não.

cumps

PS


-------Assinatura?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mmsilva

Porque que em cada tópico tem de haver sempre pessoas tentarem ser superiores as outras?, relaxem.

O psantos10 tem razão, como iria destruir uma sessão se nem sequer foi iniciada...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Porque que em cada tópico tem de haver sempre pessoas tentarem ser superiores as outras?, relaxem.

O psantos10 tem razão, como iria destruir uma sessão se nem sequer foi iniciada...

e porque é que existe pessoas que respondem sem ler tudo ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Errado! Pois a chamada da função header seria invalidada caso o erro gerado fosse "Fatal Error". Mas no caso, foi um "Warning" (O script continua a ser executado)

O header() fica invalidado pq já existe output feito, por isso, os headers já tinham sido enviados, por isso, o header() não surge efeito e o utilizador não é enviado para a outra página.

No entanto, se a função error_reporting() ou no php.ini é indicado para não mostrar erros, como não há output, o header() é executado normalmente.

Aqui o erro está no dono do script. Em quanto se está a testar código, é muito boa ideia ter o error_reporting com o valor "-1" para mostrar todos os problemas no código.

  • Voto 1

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
psantos10

O header() fica invalidado pq já existe output feito, por isso, os headers já tinham sido enviados, por isso, o header() não surge efeito e o utilizador não é enviado para a outra página.

No entanto, se a função error_reporting() ou no php.ini é indicado para não mostrar erros, como não há output, o header() é executado normalmente.

Aqui o erro está no dono do script. Em quanto se está a testar código, é muito boa ideia ter o error_reporting com o valor "-1" para mostrar todos os problemas no código.

Boas pessoal...

o código:

<?php
 session_destroy();
 header("Location: qualquer_pagina.php");
?>

dispara um erro. Que prefiro chamo-lo neste momento de Aviso. Ou seja, um Warging (já descrito acima).

E segundo a própria documentação, quando isso acontece, a execução do script não é interropida. Logo independemente da linha "session_destroy();" ser executada com sucesso ou não, o "header" faça sempre o seu trabalho. Que é redireccionar o utilizador para "qualquer_pagina.php".

O contrário só aconteceria se o erro fosse fatal.

Fonte: http://php.net/manual/en/errorfunc.constants.php

PS 1: Indique a fonte (de preferencia a doc oficial do PHP) onde diz que quando o cenário acima acontece o header não é executado. Sei que não sei muito sobre o assunto por isso estou disposto a aprender.

PS 2: Não é minha intenção tentar ser superior, ou mostrar que sei mais do que os outros. Sou um eterno aprendiz por isso faço parte desta comunidade.

Cumps

*PS


-------Assinatura?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o problema não é de execução do PHP, mas sim de como este processa aquilo que está implícito na comunicação entre servidor e cliente : HTTP

quando é feito algum output, seja ele mesmo um único caracter de espaço antes da tag inicial do PHP (<?php), o PHP constrói o header HTTP e envia-o para o browser, isto porque é obrigado pelo protocolo de comunicação.

logo, ao ser apresentada a mensagem de aviso (warning), o PHP não pode mudar aquilo que já foi enviado para o browser : o header

explicação em documentação online : http://php.net/manual/en/function.header.php

header() is used to send a raw HTTP header. See the » HTTP/1.1 specification for more information on HTTP headers.

Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include, or require, functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.

este não é o caso, mas um caso exemplo muito comum é ter os ficheiro criados em UTF-8 com BOM (caracteres adicionais iniciais para determinar a ordem dos bytes em caracteres multibyte). estes bytes iniciais do ficheiro são enviados para o cliente(browser) antes da chamada da função header. o que dá bronca, porque como foi dito, nada deverá ser enviado antes da chamada da função header para que o PHP construa este de forma correcta.


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Airamzita

Tantas respostas.. obrigado a todos!

Não me estava a aparecer nenhum aviso nem nada, simplesmente trocava os header's para testar e via que não estava a destruir nada..

No entanto foi só colocar o session_start(); antes do session_destroy(); e sim, funciona na perfeição.

Achava eu que já existindo na pagina anterior o session_start(); não seria preciso usar mais, mas já percebi a sua lógica.

PS: Achava que não 'existia' o htaccess estando a utilizar o xampp, aprende-se todos os dias :) na mesma, queria uma solução ao nivel do php pois era mesmo erro meu.

Obrigado!!

Editado por Airamzita
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.