Jump to content
carcleo

Sessão não funciona em outra página

Recommended Posts

carcleo

Pessoal, tenho minha página index.php que é para validar login e criar a sessão do Admin.

<?php  
 session_start();
 header  ("Content-Type: text/html; charset=utf-8");
 require_once("_global/_constantes/error.ini");
 require_once("controlls/util/Constantes.php");
 $constantes = new Constantes();
?>
<!DOCTYPE html>
<html>
<head>
<title><?php echo $constantes->getTituloSite(); ?></title>
<?php  require_once("_global/_meta/meta.ini"); ?>
<link rel="shortcut icon" type="image/x-icon" href="_img/favicon.png" />
<link type="text/css" rel="stylesheet" href="_global/_css/estiloSite.css" />
<link type="text/css" rel="stylesheet" href="_global/_css/estiloMenu.css" />
<script type="text/javascript" src="_global/_scripts/_funcoes/_js/jquery-2.1.1.js"></script>

</head>
<body>
  <div id="topo"><h1>Sistema de Gerenciamento de Clientes - Logon Administrador</h1></div>
  <div id="cont">
  <div class="sessoes"><?php require_once("indexConteudo.php"); ?></div>
  </div>
  <div id="final">
  <div class="sessoes"><?php require_once("final.php"); ?></div>
  </div>
</body>
</html>

E o indexConteudo.php que contem a validação e gera a sessão

<?php
require_once "controlls/util/Conexao.php";
require_once "controlls/models/Admins.php";
require_once "controlls/daos/AdminsDao.php";


$connection = new Conexao();
$conexao = $connection->abreConexao();
$AdminsDao = new AdminsDao($conexao);

if (!$_GET["acao"]) {
?>
 <h1>Logar no Sistema</h1>
 <form action="" method="post">
<input type="hidden" name="acao" value="logar" /> <br />
<label>Login</label>:<input type="text" name="login" /> <br />
<label>Login</label>:<input type="text" name="senha" /> <br /> <br />
<input type="submit" value="Enviar" /><br /> <br />
 </form>

<?php
}

if ($_POST["acao"] == "logar") {

$login = $_POST["login"];
$senha = $_POST["senha"];

if( $login == "" || $senha == "" ) {
echo "erro";
}
else
{

if( strlen($login) <> 4 || strlen($senha) <> 4 ) {
echo "Login ou Senha com quantidade de caracters errado!";
}
else
{
$admin = $AdminsDao->pesquisaAdmin($login, $senha);

if($admin == null) {
echo "Usuário ou senha inválidos";
}
else {
if($admin->getBloqueado() == "s"){
echo $admin->get.": O Administrador geral bloqueou você!";
}
else {
$_SESSION["admin"] = $admin;


print $_SESSION["admin"]->getIdAdmins()."<br />";
print $_SESSION["admin"]->getTipo()."<br />";
print $_SESSION["admin"]->getNome()."<br />";
print $_SESSION["admin"]->getLogin()."<br />";
print $_SESSION["admin"]->getSenha()."<br />";
print $_SESSION["admin"]->getBloqueado()."<br />";
exit;


header("Location:principal.php");
}
}

  $connection->fechaConexao();

}
}

}
?>

Testei a sessão aqui e funciona;. Mas quando chego na página principal.php

<?php  
 session_start();

 require_once("controlls/models/Admins.php");

 print $_SESSION["admin"]->getIdAdmins()."<br />";
 print $_SESSION["admin"]->getTipo()."<br />";
 print $_SESSION["admin"]->getNome()."<br />";
 print $_SESSION["admin"]->getLogin()."<br />";
 print $_SESSION["admin"]->getSenha()."<br />";
 print $_SESSION["admin"]->getBloqueado()."<br />";

?>
?>

Dá o seguinte erro:

Fatal error: main(): The script tried to execute a method or access a property of an incomplete object.
Please ensure that the class definition "Admins" of the object you are trying to operate on was loaded
_before_ unserialize() gets called or provide a __autoload() function to load the class definition in
C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\php\andre\provedor\principal.php on line 9

Alguém pode me ajudar a resolver?

Cheguei a ver possivel saida html antes ds session_start(); mas não acho nada. Conerir utf-8 sem BOM em todos os arquivos

Edited by carcleo

Share this post


Link to post
Share on other sites
carcleo

Não sei não, Mas preciso guardar na sessão um objeto da Classe que guarda os dados de um Administrador.

Ví em um fórum internacional assim:

<?php  
 require_once("controlls/models/Admins.php");  // É necessário que a Classe esteja antes da sessão
 session_start();
 header  ("Content-Type: text/html; charset=utf-8");

/*
 print $_SESSION["admin"]->getIdAdmins()."<br />";
 print $_SESSION["admin"]->getTipo()."<br />";
 print $_SESSION["admin"]->getNome()."<br />";
 print $_SESSION["admin"]->getLogin()."<br />";
 print $_SESSION["admin"]->getSenha()."<br />";
 print $_SESSION["admin"]->getBloqueado()."<br />";
*/

?>

Com o include da classe antes do session_start();

E por mais incrível que possa parecer, funcionou!

Mas gostaria de saber se há outro recurso ou porque o recurso usado funcionou!

Edited by carcleo

Share this post


Link to post
Share on other sites
carcleo
<?php 

class Admins {

 private $idAdmins;
 private $tipo;
 private $nome;
 private $login;
 private $senha;
 private $bloqueado;

 public function __construct ($_tipo, $_nome, $_login, $_senha, $_bloqueado) {		 
	 $this->tipo = $_tipo;
	 $this->nome = $_nome;
	 $this->login = $_login;
	 $this->senha = $_senha;
	 $this->bloqueado = $_bloqueado;
 }

 public function setIdAdmins ($_idAdmins) {
	 $this->idAdmins = $_idAdmins;
 }

 public function getIdAdmins () {
	 return $this->idAdmins;
 }

 public function getTipo () {
	 return $this->tipo;
 }

 public function getNome () {
	 return $this->nome;
 }

 public function getLogin () {
	 return $this->login;
 }

 public function getSenha () {
	 return $this->senha;
 }

 public function getBloqueado () {
	 return $this->bloqueado;
 }

}
?>

Edited by carcleo

Share this post


Link to post
Share on other sites
carcleo
<?php 

class AdminsDao {
private $conexao;

public function __construct ($_conexao) { 
   $this->conexao = $_conexao;
}

public function cadastrar ($admin) { 

   $string = "INSERT INTO admins (tipo, nome, login, senha, bloqueado) VALUES ('".$admin->getTipo()."','".$admin->getNome()."','".$admin->getLogin()."','".$admin->getSenha().",'".$admin->getBloqueado()."')";

$this->conexao->query($string);

}

public function editar ($admin) { 

   $string = "UPDATE admins SET tipo = '".$admin->getTipo()."', nome = '".$admin->getNome()."', login = '".$admin->getLogin()."', senha = '".$admin->getSenha()."', bloqueado = '".$admin->getBloqueado()."' WHERE idAdmins = ".$admin->getIdAdmins();

$this->conexao->query($string);
}

public function pesquisaLoginAdmin ($admin) {

$string = "SELECT idAdmins FROM admins WHERE login = '".$admin->getLogin()."'";

$registros = $this->conexao->query($string);
$quantasLinhas = $registros->num_rows;

if ($quantasLinhas > 0)
{
return true;
}
else
{
return false;
}
}

public function pesquisaAdmin($login, $senha) {
$admin = null;           

$string = "SELECT idAdmins, tipo, nome, login, senha, bloqueado 
          FROM admins 
WHERE login = '".$login."' AND senha = '".$senha."' ";

$registros = $this->conexao->query($string);
$quantasLinhas = $registros->num_rows; 

if ($quantasLinhas > 0)
{
list ($idAdmins, $tipo, $nome, $login, $senha, $bloqueado) = $registros->fetch_row();
$admin = new Admins($tipo, $nome, $login, $senha, $bloqueado);            
$admin->setIdAdmins($idAdmins);
}

return $admin;

}

public function pesquisaAdmins() {
$admins = null;           

$string = "SELECT idAdmins, tipo, nome, login, senha, bloqueado";

$registros = $this->conexao->query($string);
$quantasLinhas = $registros->num_rows; 

if ($quantasLinhas > 0)
{
list ($idAdmins, $tipo, $nome, $login, $senha, $bloqueado) = $registros->fetch_row();
$admin = new Admins($tipo, $nome, $login, $senha, $bloqueado);            
$admin->setIdAdmins($idAdmins);

$admins = array();
array_push($admins, $admin);
}

return $admins;

}

}
?>

Edited by carcleo

Share this post


Link to post
Share on other sites
RuiAlmeida20

Pelo que estou a ver tu não guardas nenhuns dados do admin apenas tentas guardar uma class dentro duma session o que é impossivel...

Share this post


Link to post
Share on other sites
carcleo

Veja bem: olha a criação da sessão que é feita em uma tela de login.

<?php
require_once "controlls/util/Conexao.php";
require_once "controlls/models/Admins.php";
require_once "controlls/daos/AdminsDao.php";


$connection = new Conexao();
$conexao = $connection->abreConexao();
$AdminsDao = new AdminsDao($conexao);

if (!$_GET["acao"]) {
$erroadmin = (isset($_GET["erroadmin"])) ? $_GET["erroadmin"] : "";
?>
 <h1>Logar no Sistema</h1><br />
 <h3 class="avisos"><?php echo $erroadmin; ?></h3>

 <form action="" method="post">
<input type="hidden" name="acao" value="logar" /> <br />
<label>Login</label>:<input type="text" name="login" /> <br />
<label>Senha</label>:<input type="text" name="senha" /> <br /> <br />
<input type="submit" value="Enviar" /><br /> <br />
 </form>

<?php
}

if ($_POST["acao"] == "logar") {

$login = $_POST["login"];
$senha = $_POST["senha"];

if( $login == "" || $senha == "" ) {
echo "erro";
}
else
{

if( strlen($login) <> 4 || strlen($senha) <> 4 ) {
echo "Login ou Senha com quantidade de caracters errado!";
}
else
{
$admin = $AdminsDao->pesquisaAdmin($login, $senha);

if($admin == null) {
echo "Usuário ou senha inválidos";
}
else {
if($admin->getBloqueado() == "s"){
echo $admin->get.": O Administrador geral bloqueou você!";
}
else {
//AQUI O SESSION FUNCIONA NORMAL, OU SEJA, ESTOU GUARDANDO UM OBJETO DA CLASSE NA SESSÃO
$_SESSION["admin"] = $admin;
header("Location:principal.php");
}
}

  $connection->fechaConexao();

}
}

}
?>

Quando

header("Location:principal.php");

Ocorre, na página principal tenho a validação da sessão

principal.php

<?php  
 require_once("controlls/models/Admins.php");  // É necessário que a Classe esteja antes da sessão
 session_start();
 header  ("Content-Type: text/html; charset=utf-8");
 require_once("_global/_constantes/error.ini");
 require_once("_global/testaAdmin.php");
 require_once("controlls/util/Constantes.php");
 $constantes = new Constantes();
 echo "Seja benvindo Administrador ". $_SESSION["admin"]->getNome()."<a href=''>Sair</a>";
 $menu = ($_SESSION["admin"]->getTipo() == "s") ? "menu" : "menu2" ;
?>

Dessa forma funciona. Mas não acho que esteja correto!

Edited by carcleo

Share this post


Link to post
Share on other sites
carcleo

Ei HappyHippyHippo. Tudo bom?

Mas, me ajuda aí. Como resolvo esse meu problema? Pode me dar uma ajuda fazendo favor?

Share this post


Link to post
Share on other sites
HappyHippyHippo

session_start();

// ...

$admin = $AdminsDao->pesquisaAdmin($login, $senha);

if($admin == null) {
   echo "Usuário ou senha inválidos";
}
else {
   if($admin->getBloqueado() == "s"){
       echo $admin->get.": O Administrador geral bloqueou você!";
   } else {
       $_SESSION["admin"] = serialize($admin); // não usar $_SESSION['admin'] directamente !!!
   }
}

 require_once("controlls/models/Admins.php");

 session_start();

 $admim = unserialize($_SESSION["admin"]);

 print $admin->getIdAdmins()."<br />";
 print $admin->getTipo()."<br />";
 print $admin->getNome()."<br />";
 print $admin->getLogin()."<br />";
 print $admin->getSenha()."<br />";
 print $admin->getBloqueado()."<br />";

Edited by HappyHippyHippo
  • Vote 1

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

Share this post


Link to post
Share on other sites
carcleo

Entendi!

Mas sem usar serialize() / unserialize() está errado?.

Porque? Pode me explicar?

Seria porque o correto é colocar sessions_start() no inicio e dessa forma não iria funcionar?

Edited by carcleo

Share this post


Link to post
Share on other sites
HappyHippyHippo

Mas sem usar serialize() / unserialize() está errado?.

Porque? Pode me explicar?

sim está.

em sessão só é possível guardar valores "naturais" : valores booleanos, numéricos, texto, conjunto de bytes, etc ...

é por isso que é necessário converter a instância do objecto para que este seja guardado em sessão


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

Share this post


Link to post
Share on other sites
carcleo

Agora entendi. Obrigado!

No teu exemplo, a classe foi incluída antes do session_start().

Após usar serialize, coloquei a importação da classe depois do session_start() para que ele possa ser a primeira linha do arquivo e deu certo!

Muito obrigado!

<?php  
 session_start();
 require_once("controlls/models/Admins.php");  // É necessário que a Classe esteja antes da sessão
 $adminLogado = unserialize($_SESSION["admin"]);

 if(!isset($_SESSION["admin"]))  {
echo "<script>document.location='index.php?erroadmin=".urlencode('Você não esta logado. Por favor faça Login')."'</script>";
 }

 header  ("Content-Type: text/html; charset=utf-8");
 echo "Seja benvindo Administrador ". $adminLogado->getNome()." => <a href='logout.php'>Sair</a>";
 $menu = ($adminLogado->getTipo() == "s") ? "menu" : "menu2" ;

?>

Edited by carcleo

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.