Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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>';
}
}
}
?>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');>
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.
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.
Podia ter aberto um novo tópico...
Mas existe em javascript:
<script>
window.location.replace("url"):
</script>
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.
>
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/
Hinom,
O problema real é o seguinte:
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");
}@Viper33, pq você não faz um simples teste criando uma sessão e atribuindo um valor a ela apenas para verificar o funcionamento das sessões ?
Depois de alterações na hospedagem o login não funciona mais.
E quais foram essas alterações ?
Mudou versão do PHP ou algo do tipo?
Siga a dica do #11..
Se quer um exemplo de como testar, veja exemplo no manual:
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"); $_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: /
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.
Sim, eu vi os links e havia clicado neles obtendo o seguinte resultado:
Not FoundThe 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.
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:
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");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>';
}
}
}
?>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..
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)Quando 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>
>
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.
Exato, não apareceu a mensagem header already sent, Hinom.
E sem usar o tmp, mas colocando o breakpoint retorna isso:
/home/u970889492/public_html/conexao/conexao.php
1
1394398834
im, isso significa que não há problema no servidor.
ao menos, 99% de chances de ser algum problema em algum arquivo do seu sistema
não há mágica... vá criando pontos de depuração (breakpoints) para caçar a fonte dos erros..
Primeiramente e verificar se na inclusão dos arquivos estão corretos.
./ sendo ../ ou o dirname()
Verifique de acordo com sua raiz
/
/conexao
/classes
/arquivos
/index.php
/funcoes.php
assim pense....
index.php irá incluir o conexão? se sim verifique se o
verifique como utiliza os começa o seu PHP
<? e necessário ativar uma função no servidor de produção.
<?php seria o recomendável.
o arquivos index.php tem a inclusão ou o requerimento correto?
<?php
require_once 'conexao/conexao.php';
// ou está
require_once './conexao/conexao.php';
e assim irá tirar muitos dos erros que vir em seu código postado.
Aqui tmb aconteceu isso o hostinger deve ter broqueado essas sessões pra conta free só pode
por que antes funcionava normalmente e no servidor local funciona 100%
acredito que não é erro em código, não pode um código que funcionou durante 8 meses no servidor (antes dessas alterações), estár errado
#23, #24.. leia todos os posts
o erro está nos códigos e não no server..
se fosse erro no server, o teste não funcionaria.
está bem claro o erro nos scripts do autor do tópico.
Não há bloqueio algum de sessões e nem sei se isso existe..
esse erro sempre existiu.. a diferença é que provavelmente a setagem anterior do host ocultava os erros críticos e warnings e também, provavelmente todos que estão reclamando possuem sistemas muito mal escritos.
Hinom,
Se o Host antes ocultava os erros, então justifica toda a dificuldade de resolver o problema pois aí estava um dos detalhes que nos deixavam em dúvida, pois como disse o amigo aí em cima, antes o mesmo arquivo funcionava e localmente também.
E há sim bloqueio de funcionamento da tag session, pois essa informação me foi passada pelo suporte deles. Me falaram que as tags session já estão em funcionamento.
Como pelo seu código foi possível ver que o servidor está funcionando normalmente, realmente só sobrou o fato do problema ser no meu código.
E acabo de receber uma informação do suporte dizendo que o problema está no arquivo ope.php. Me disseram que estou fechando uma abertura ({) da linha 6 somente na linha 46. Estou verificando.
<?php
error_reporting( E_ALL );
ini_set( 'display_errors', 1);
require_once("./conexao/conexao.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áidos");
location.href="./frm_loginadm.php";</script>';
}
}
}
?>
E paulinhosupriano estou verificando todas as suas dicas novamente.
O que não funciona, exatamente?