Eu tenho um arquivo PHP que às vezes é chamado de uma página que iniciou uma sessão e, às vezes, de uma página que não iniciou a sessão. Portanto, quando tenho session_start()
esse script, às vezes recebo a mensagem de erro para "sessão já iniciada". Para isso eu coloquei estas linhas:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
mas desta vez recebi esta mensagem de aviso:
Aviso: Variável indefinida: _SESSION
Existe uma maneira melhor de verificar se a sessão já começou?
Se eu usar @session_start
, isso fará as coisas funcionarem corretamente e calar a boca os avisos?
php
session
session-variables
Logan
fonte
fonte
Respostas:
Maneira recomendada para versões do PHP> = 5.4.0, PHP 7
Referência: http://www.php.net/manual/en/function.session-status.php
Para versões do PHP <5.4.0
fonte
session_start();session_write_close();
: a condição if falhará, mas não teremos uma sessão aberta ...session_start()
a parte superior de um script é FECHADA quando o script sai, OU quandosession_write_closed()
é chamada antes da saída do script. Ou seja, uma sessão FECHA quando seus dados são gravados no cookie da sessão e a sessão é desbloqueada para acesso por outro script que também chama 'session_start'. FECHAR NÃO significa que a sessão está DESTRUÍDA, portanto. Você pode fechar uma sessão saindo do script ou da chamada atualsession_write_close()
e pode abri-la novamente chamandosession_start()
. Meu entendimento, pelo menos.Para versões do PHP anteriores ao PHP 5.4.0:
No entanto, IMHO, você deve realmente pensar em refatorar seu código de gerenciamento de sessões se não souber se uma sessão foi iniciada ou não ...
Dito isso, minha opinião é subjetiva e há situações (exemplos dos quais são descritos nos comentários abaixo) em que talvez não seja possível saber se a sessão foi iniciada.
fonte
O PHP 5.4 introduziu session_status () , que é mais confiável do que confiar em
session_id()
.Considere o seguinte trecho:
Portanto, para verificar se uma sessão foi iniciada, a maneira recomendada no PHP 5.4 é agora:
fonte
você pode fazer isso e é realmente fácil.
Espero que ajude :)
fonte
$_SESSION=array();
, então essa resposta parece boa.session_destroy()
tiver sido chamado,$_SESSION
ainda poderá ser definido. Além disso, nos testes de unidade, você pode definir$_SESSION
diretamente. Mas eu upvoted isso, como para a maioria das situações práticas esta resposta deve ser bom o suficiente (até PHP 5.3 é visto nunca mais ...)fonte
Antes do PHP 5.4, não havia maneira confiável de saber além de definir uma bandeira global.
Considerar:
Ou:
Portanto, antes do PHP 5.4, você deve definir um booleano global.
fonte
Para toda a versão php
fonte
if ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Verifique isto:
Fonte http://php.net
fonte
Use session_id () , ele retornará uma string vazia se não estiver definida. É mais confiável do que verificar o
$_COOKIE
.fonte
espero que ajude !
fonte
Isso deve funcionar para todas as versões do PHP. Ele determina a versão do PHP e verifica se a sessão é iniciada com base na versão do PHP. Se a sessão não for iniciada, ela será iniciada.
fonte
A única coisa que você precisa fazer é:
fonte
Não tenho certeza sobre a eficiência dessa solução, mas isso é do projeto de trabalho. Isso também é usado se você precisar definir o idioma padrão.
fonte
@
antes de uma chamada de função suprime quaisquer erros que possam ser relatados durante a chamada de função.Adicionando um
@
antessession_start
diz ao PHP para evitar a impressão de mensagens de erro.Por exemplo:
O uso
session_start()
após a impressão de algo no navegador resulta em um erro, portanto o PHP exibirá algo como "cabeçalhos não podem ser enviados: iniciado em (linha 12)",@session_start()
ainda falhará nesse caso, mas a mensagem de erro não é impressa em tela.Antes de incluir os arquivos ou redirecionar para a nova página, use o
exit()
função, caso contrário, ocorrerá um erro.Este código pode ser usado em todos os casos:
fonte
No PHP 5.3, isso funciona para mim:
então você tem. Se você não colocar a declaração not at if começando a sessão, de qualquer maneira, não sei por quê.
fonte
Resposta BASEADA na resposta de Meliza Ramos (consulte a primeira resposta) e http://php.net/manual/en/function.phpversion.php ,
AÇÕES:
use apenas openSession ()
fonte
Na verdade, agora é tarde demais para explicá-lo aqui de qualquer maneira, pois foi resolvido. Este foi um arquivo .inc de um dos meus projetos em que você configura um menu para um restaurante selecionando um prato e removendo / adicionando ou alterando a ordem. O servidor em que eu estava trabalhando não tinha a versão real, então a tornei mais flexível. Cabe aos autores que desejam usá-lo e experimentá-lo.
fonte
Este snippet de código funciona para você?
fonte
Você deve reorganizar seu código para ligar
session_start()
exatamente uma vez por execução da página.fonte
fonte
PHP_VERSION_ID está disponível a partir do PHP 5.2.7, portanto, verifique isso primeiro e, se necessário, crie-o.
session_status
está disponível a partir do PHP 5.4, então precisamos verificar isso também:fonte
Com base na minha prática, antes de acessar o que
$_SESSION[]
você precisa chamarsession_start
sempre para usar o script. Veja o link abaixo para o manual.http://php.net/manual/en/function.session-start.php
Para mim, pelo menos,
session_start
é confuso como um nome. Asession_load
pode ser mais claro.fonte
acabei com uma verificação dupla de status. php 5.4+
fonte
Você pode usar a seguinte solução para verificar se uma sessão PHP já foi iniciada:
fonte
É isso que eu uso para determinar se uma sessão foi iniciada. Usando vazio e isset da seguinte maneira:
fonte
Substitua
session_start();
por:fonte