Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Viper33

Problemas com sessão

Recommended Posts

Alguém já passou por uma situação em que as sessões que antes funcionavam normalmente não funcionam mais? O pior é que no meu computador funciona corretamente, mas na hospedagem não funciona mais. E o suporte me diz que o sistema deles está funcionando corretamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Após digitar o login e senha e clicar em enviar, era para o formulário direcionar para a página ope.php para fazer a validação. Caso a validação estivesse ok, seria direcionado para a página index da página administrativa.

O que acontece é que ao clicar em enviar, vai para a página ope.php e para por aí. Não abre a index do setor administrativo.
Como disse anteriormente, no meu computador funciona corretamente, no servidor que antes funcionava também, agora não funciona mais.

 

Página ope.php

 

<?php include_once ("./conexao/conexao.php");?>
<?php session_start();?>
<?php
if(isset($_POST['acao']))
{
$usuario = ($_POST['usuario']);
$senha = ($_POST['senha']);
if($usuario=="")
{
echo '<script>alert("Informe o seu login.");location.href="./frm_loginadm.php";</script>';
}
if($senha=="")
{
echo '<script>alert("Informe a sua senha.");location.href="./frm_loginadm.php";</script>';
}
else
if(!empty($usuario) and !empty($senha));
{
$sql= ("select * from usuario where login = ? and senha = ?");
$verifica= $pdo->prepare($sql);
$verifica->bindValue(1,$usuario);
$verifica->bindValue(2,$senha);
$verifica->execute();
if($verifica->rowCount()>0)
{
$_SESSION['usuario'] = $usuario;
$_SESSION['senha'] = $senha;
header("location:./adm/index.php");
}
else
{
unset ($_SESSION['usuario']);
unset ($_SESSION['senha']);
echo '<script>alert("Usuário ou senha inválidos!");
location.href="./frm_loginadm.php";</script>';
}
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

session_start() deve ser a primeiro coisa no seu código. Habilite os erros do PHP e veja se retorna alguma mensagem de erro:

error_reporting(E_ALL);
ini_set( 'display_errors','1');

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

session_start() deve ser a primeiro coisa no seu código. Habilite os erros do PHP e veja se retorna alguma mensagem de erro:

error_reporting(E_ALL);
ini_set( 'display_errors','1');

Dessa forma dá erro com mensagem de que o cabeçalho não pode ser enviado e etc.

Mas acredito ter encontrado o problema: parece que como a minha hospedagem era gratuita a Hostinger bloqueou as sessões e o backup para me obrigar a assinar um plano. Como disse, o sistema funcionava perfeitamente e depois de alguns meses não funcionou mais. A questão é que quando entrava em contato com o suporte, eles me diziam que estava tudo ok e não me informavam a realidade. Se for isso mesmo marcarei o tópico como resolvido. Assinei um plano e aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe uma maneira diferente desta header("location:./adm/index.php"); para redirecionar para a página index.php? Porque é a única parte do código que não está funcionando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Podia ter aberto um novo tópico...

 

Mas existe em javascript:

 

<script>
window.location.replace("url"):
</script>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, dsmachado, também não funcionou. Não sai da página ope.php. Só pode ser problema na hospedagem, pois no meu pc funciona normalmente. Infelizmente não consigo resolver esse problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dessa forma dá erro com mensagem de que o cabeçalho não pode ser enviado e etc.

Mas acredito ter encontrado o problema: parece que como a minha hospedagem era gratuita a Hostinger bloqueou as sessões e o backup para me obrigar a assinar um plano

headers already sent , certo ?

 

a hospedagem nao está fazendo conspiração contigo...

 

apenas conserte o problema..

 

:seta:

http://forum.imasters.com.br/topic/342563-dicas-para-uso-de-variveis-de-sesso/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom,

 

O problema real é o seguinte:

  1. No meu computador o site e as sessões funcionam perfeitamente.
  2. Online funcionava normalmente também..
  3. Depois de alterações na hospedagem o login não funciona mais.
  4. Apesar do arquivo que redireciona para a página administrativa informar quando deixo os campos vazios ou quando digito login ou senha errados, ele não me leva até a página administrativa quando digito login e senha corretos. Simplesmente vai para a página que faz as verificações (ope.php), ou seja, não vai para a index, fica no meio do caminho.
  5. Não apresenta mensagem de erro nenhuma, mesmo usando error_reporting(E_ALL); ini_set( 'display_errors','1');

Enfim, porque essa parte do código não funciona no servidor mas funciona no meu pc:

 

if($verifica->rowCount()>0)
{
$_SESSION['usuario'] = $usuario;
$_SESSION['senha'] = $senha;
header("location:./adm/index.php");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom,

 

Eles mudaram uma série de coisas no painel de controle e a partir daí o backup não funciona mais, as estatísticas e uma série de outras coisas que eles estão alterando.

A princípio a versão do php não mudou.
Verifiquei que há uma série de usuários narrando problemas, que a sessão do site deles não funciona e etc. Porém, há alguns usuários dizendo que no site deles está normal. E isso é um dos pontos que está dificultando a solução.

Vou ver o seu link e a dica do #11.

 

 

Usando o

 

 

 

<?php error_reporting( E_ALL );

ini_set( 'display_errors', 1);?>
no início do código aparece a mensagem abaixo.
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/u970889492/public_html/conexao/conexao.php:1) in /home/u970889492/public_html/ope.php on line 4

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/u970889492/public_html/conexao/conexao.php:1) in /home/u970889492/public_html/ope.php on line4

Warning: Cannot modify header information - headers already sent by (output started at /home/u970889492/public_html/conexao/conexao.php:1) in /home/u970889492/public_html/ope.php on line 31
Verifiquei no arquivo de conexão e não encontrei nenhum espaço em branco.
A linha 4 é essa: $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
E o erro da linha 31 é justamente onde ele deveria levar para página administrativa: header("location:./adm/index.php");
Como já disse, se digito o login e senha errados ele informa que estão errados, portanto está se conectando.
Dei um echo nessa parte
$_SESSION['usuario'] = $usuario;
$_SESSION['senha'] = $senha;
header("location:./adm/index.php");
E mostra o usuário e senha corretamente.
E Hinom, um link anterior que você mandou está com as imagens com links "quebrados", não consegui ver.




Usando o simple session test version 1.1 o que aparece é:

sessPath: /tmp
sessCookie: /

test 1 (printing session value)
test 2 (kill session) 

Compartilhar este post


Link para o post
Compartilhar em outros sites

certo..

 

nesse teste de sessão "test version 1.1",

adicione no topo, para exibir possíveis erros:

error_reporting( E_ALL );
ini_set( 'display_errors', 1);

 

Veja que tem 2 links abaixo, um serve para imprimir o vvalor da sessão e o outro para excluir.

Clique no primeiro e veja se imprime o valor.

 

Se não imprimir nada ou se exibir o erro de "headers alredy sent", então realmente tem algo no server..

 

Um ponto importante, verifique o tipo de encode do arquivo PHP.

Caso esteja com UTF-8, verifique se está sem o UTF8-BOM. Deve estar como UTF8-ANSI.

 

UTF8-BOM é um caracter "oculto" que provoca um output, gerando escrita no header.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu vi os links e havia clicado neles obtendo o seguinte resultado:

Not Found

The requested URL /tmp.php was not found on this server.

 

Fazendo o que vc solicitou obtive isso:

 

sessPath: /tmp
sessCookie: /

test 1 (printing session value)
test 2 (kill session) 
Warning: Cannot modify header information - headers already sent by (output started at /home/u970889492/public_html/ope.php:18) in /home/u970889492/public_html/ope.php on line 101

 

Linha 18 - echo '<br>sessPath: ' . $sessPath;

 

Linha 101 - header("location:./adm/index.php");


Também havia verificado se estavam com BOM, mas salvei-os sem BOM.

Tudo indica que o problema está no servidor. Se fosse de programação, não funcionaria no meu computador e nem teria funcionado no server antes deles alterarem o serviço.

Grato pela paciência e ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1º passo

Not Found
The requested URL /tmp.php was not found on this server.

vc realmente entendeu como fazer o teste ?

 

 

O script do teste, salve-o num arquivo único. Não coloque-o dentro de outros scripts..

Crie um novo arquivo chamado "tmp.php", por exemplo e execute-o. O nome do arquivo pode ser qualquer nome que desejar.. apenas atente-se que se for diferente de "tmp.php" terá que alterar manualmente os links.

 

No browser, vc acessa assim:

http://seusite/tmp.php

 

 

Para melhor depuração, acesse visualizando o código gerado. Usando o Chrome é:

 

view-source:http://seusite/tmp.php

 

 

 

 

2º passo

 

Na linha 101 faça um breakpoint antes do header();

header("location:./adm/index.php");

exemplo:

/**
* For debug purposes only
*/
if (headers_sent($filename, $linenum)) {
    echo '<br />' . PHP_EOL . $filename . '<br />' .PHP_EOL . $linenum;
}
echo '<br />' .PHP_EOL . time(); exit;

header("location:./adm/index.php");

O intuito é verificar por cabeçalhos enviados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom,

 

Apareceu isso:


Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/u970889492/public_html/conexao/conexao.php:1) in /home/u970889492/public_html/ope.php on line 12

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/u970889492/public_html/conexao/conexao.php:1) in /home/u970889492/public_html/ope.php on line12

A linha 12 é: session_start();

sessPath: /tmp
sessCookie: /

test 1 (printing session value)
test 2 (kill session)
/home/u970889492/public_html/conexao/conexao.php
1
1394290554

O ope.php está assim:

 

<?php include_once ("./conexao/conexao.php");?>
<?php error_reporting( E_ALL );
ini_set( 'display_errors', 1);?>
<?php
/* [EDIT by danbrown AT php DOT net:
The author of this note named this
file tmp.php in his/her tests. If
you save it as a different name,
simply update the links at the
bottom to reflect the change.] */
session_start();
$sessPath = ini_get('session.save_path');
$sessCookie = ini_get('session.cookie_path');
$sessName = ini_get('session.name');
$sessVar = 'foo';
echo '<br>sessPath: ' . $sessPath;
echo '<br>sessCookie: ' . $sessCookie;
echo '<hr>';
if( !isset( $_GET['p'] ) ){
// instantiate new session var
$_SESSION[$sessVar] = 'hello world';
}else{
if( $_GET['p'] == 1 ){
// printing session value and global cookie PHPSESSID
echo $sessVar . ': ';
if( isset( $_SESSION[$sessVar] ) ){
echo $_SESSION[$sessVar];
}else{
echo '[not exists]';
}
echo '<br>' . $sessName . ': ';
if( isset( $_COOKIE[$sessName] ) ){
echo $_COOKIE[$sessName];
}else{
if( isset( $_REQUEST[$sessName] ) ){
echo $_REQUEST[$sessName];
}else{
if( isset( $_SERVER['HTTP_COOKIE'] ) ){
echo $_SERVER['HTTP_COOKIE'];
}else{
echo 'problem, check your PHP settings';
}
}
}
}else{
// destroy session by unset() function
unset( $_SESSION[$sessVar] );
// check if was destroyed
if( !isset( $_SESSION[$sessVar] ) ){
echo '<br>';
echo $sessName . ' was "unseted"';
}else{
echo '<br>';
echo $sessName . ' was not "unseted"';
}
}
}
?>
<hr>
<a href=tmp.php?p=1>test 1 (printing session value)</a>
<br>
<a href=tmp.php?p=2>test 2 (kill session)</a>
<?php
if(isset($_POST['acao']))
{
$usuario = ($_POST['usuario']);
$senha = ($_POST['senha']);
if($usuario=="")
{
echo '<script>alert("Informe o seu login.");location.href="./frm_loginadm.php";</script>';
}
if($senha=="")
{
echo '<script>alert("Informe a sua senha.");location.href="./frm_loginadm.php";</script>';
}
else
if(!empty($usuario) and !empty($senha));
{
$sql= ("select * from usuario where login = ? and senha = ?");
$verifica= $pdo->prepare($sql);
$verifica->bindValue(1,$usuario);
$verifica->bindValue(2,$senha);
$verifica->execute();
if($verifica->rowCount()>0)
{
$_SESSION['usuario'] = $usuario;
$_SESSION['senha'] = $senha;
if (headers_sent($filename, $linenum)) {
echo '<br />' . PHP_EOL . $filename . '<br />' .PHP_EOL . $linenum;
}
echo '<br />' .PHP_EOL . time(); exit;
header("location:./adm/index.php");
}
else
{
unset ($_SESSION['usuario']);
unset ($_SESSION['senha']);
echo '<script>alert("Usuário ou senha inválidos");
location.href="./frm_loginadm.php";</script>';
}
}
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Foi bem fácil encontrar um erro muito comum..

 

Olha isso:

<?php include_once ("./conexao/conexao.php");?>
<?php error_reporting( E_ALL );
ini_set( 'display_errors', 1);?>
<?php

No link do post #9, há um exemplo que mostra esse erro

 

O tópico está zuado porque o imageshak deve ter apagado as imagens ou mudou o endereço, mas enfim..

 

Quando fecha e abre as tags PHP, há um output, ou seja, um header é enviado.

 

Vou tentar desenhar:

 

Temos isso aqui, certo ?

?>
<?

Há uma quebra de linha entre ambos:

?>
 <---  aqui a quebra de linha... isso  gera um cabeçalho
<?

Sacou?

 

 

Não há necessidade em fechar e abrir tags PHP se o código seguinte for PHP..

 

 

Exemplo do que não fazer:

<?php include_once ("./conexao/conexao.php");?>
<?php error_reporting( E_ALL );
ini_set( 'display_errors', 1);?>
<?php
// outro codigo...

Para corrigir:

 

 

<?php 
error_reporting( E_ALL );
ini_set( 'display_errors', 1);

include_once ("./conexao/conexao.php");

// outro código

 

 

obs: Isso corrige um ponto falho nos seus código mas não quer dizer que poderá corrigir tudo... pode haver outro locais com o mesmo tipo de erro ou outros tipos..

 

 

 

 

off

 

 

Sobre o teste de sessão nos exemplos do php.net, vc aplicou errado e continua sem entender..
leia com atenção o post #16..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hinom,

 

Realmente não havia entendido o post #16. Refiz conforme sua orientação e quando clico no link 1 aparece isso:


7a2c3dc586283cbbc840dde127ed7acd


sessPath: /tmp
sessCookie: /

foo: hello world
PHPSESSID: 7a2c3dc586283cbbc840dde127ed7acd

test 1 (printing session value)
test 2 (kill session)

Q
uando clico no segundo: PHPSESSID was "unseted"

 

Corrigi o código retirando o monte de tags PHP desnecessárias. Eu fazia isso no intuito de delimitar o código alterado para evitar que atrapalhasse indevidamente alguma outra parte do código. Vivendo e aprendendo.


Agora, quando tento fazer o login usando o seu breakpoint, aparece isso:

 

/home/u970889492/public_html/conexao/conexao.php
1
1394298811

Sem o seu breakpoint aparece isso:

Warning: Cannot modify header information - headers already sent by (output started at /home/u970889492/public_html/conexao/conexao.php:1) in /home/u970889492/public_html/ope.php on line 29
A linha 29: header("location:./adm/index.php");


Já verifiquei se há mais algum código php desnecessário no ope.php, no conexao.php e no index.php, mas pelo que vi está tudo ok.
Sabe me informar porque esse problema ocorre no servidor, mas localmente funciona normal?
Grato pela paciência e ajuda.



conexao.php:

 

<?php
try{
$pdo = new PDO('editado por segurança, mas contém os dados básicos para conexao');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
echo $e->getMessage();
exit('Erro ao conectar com o banco de dados!');
}
?>


Li o post #6 e vi que o header pode gerar esse problema. Tentei com javascript porém não obtive sucesso:

<script> window.location.replace("./adm/index.php"); </script>

Compartilhar este post


Link para o post
Compartilhar em outros sites

7a2c3dc586283cbbc840dde127ed7acd

 

sessPath: /tmp

sessCookie: /

foo: hello world

PHPSESSID: 7a2c3dc586283cbbc840dde127ed7acd

test 1 (printing session value)

test 2 (kill session)

 

Quando clico no segundo: PHPSESSID was "unseted"

 

Nesse teste não apareceu mensagem de erro de header already sent, certo?

 

Só preciso saber disso para entender o que pode estar ocorrendo pois o teste retornou o resultado esperado para um bom funcionamento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.