Ir para conteúdo

Arquivado

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

TheNight

Função de logout usando PHP PDO Orientado a objetos

Recommended Posts

Estou com um grande problema com a função de deslogar do painel, fiz uma public function Logout()

Arquivo Login.class.php:

public function Logout(){
if($this->isLogged()) {
unset($_SESSION[$this->prefix.['email']]);
unset($_SESSION[$this->prefix.['password']]);
session_destroy();

return true;
} else {
return false;
}
} 

E no meu arquivo panel.php está assim:

session_start();
$Logins = new Logins();
if (!$Logins->isLogged()) {
header("Location: ?pag=login");
} else {}
if(isset($_GET['action']) == 'logout') {
if($Logins->Logout()) {
header("Location: ?pag=login");
}
} 

Agora que estou tendo problemas, estou a exatamente 8 horas empacado nisso, quando clico em Logout ele volta para home.php mas a session não destrói, não acontece absolutamente nada. O que estou fazendo de errado?

Obs: Meu link estás assim:

<a href="?action=logout">Logout</a>

Compartilhar este post


Link para o post
Compartilhar em outros sites
public function Logout(){
if($this->isLogged()) {
unset($_SESSION[$this->prefix.['email']]);
unset($_SESSION[$this->prefix.['password']]);
session_destroy();

return true;
} else {
return false;
}
} 

Guardando dados de acesso a aplicação em Sessão amigo?

 

Faça um Debug na $_SESSION e veja se não tem erro de sintaxe abaixo.

$_SESSION[$this->prefix.['email']]

Debug

print_r( $_SESSION )

Ps.: Guarde outra coisa, ID, token, menos os dados de acesso.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concertei o erro na sintaxe porem nada ainda acontece. ficou desta forma:

 

$_SESSION[$this->prefix.'email'];

$_SESSION[$this->prefix.'password'];

Compartilhar este post


Link para o post
Compartilhar em outros sites

Passe a session_start neste método e veja o que acontece.

<?php

public function Logout(){
	
	if($this->isLogged()) {
		
		if (session_status() == PHP_SESSION_NONE) {
			session_start();
		}
		
		unset($_SESSION[$this->prefix.'email']);
		unset($_SESSION[$this->prefix.'password']);
		session_destroy();

		return true;
		
	} else {
		
		return false;
		
	}
} 

De uma olhada aqui

Compartilhar este post


Link para o post
Compartilhar em outros sites

Infelizmente a maioria dos servidores ainda utilizam o php 5.2... por tanto, fora do ambiente de produção, muito cuidado ao utilizar funções novas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei que é fora das regras, mas vou reviver isso aqui...

 

Seguinte, como eu não gosto de deixar nada pra traz e gosto de resolver meus problemas, eu vou dizer o que acontece... Estou trabalhado com URL amigável, segue meu script em PHP que faz acontecer a mágica:

<?php
                $url = (isset($_GET['url'])) ? $_GET['url'] : '';
                $explode = explode('/', $url);

                $paginas = array(
                    "home",
                    "login",
                    "register",
                    "painel",
                    "sair"
                );

                if (isset($explode[0]) && $explode[0] == '') {
                    include "pages/home.php";
                } elseif ($explode[0] != '') {
                    if (isset($explode[0]) && in_array($explode[0], $paginas)) {
                        include "pages/" . $explode[0] . ".php";
                    } else {
                        include "pages/home.php";
                    }
                }
                ?>

E também meu .htaccess

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1

Quando dou um print_r no meu $_GET veja o que aparece:

Array
(
    [url] => painel/
)

Uma imagem fala mais que mil palavras :D

 

DbThBq6.png

 

Obs: Este site é pra treino meu com PHP PDO OO.

 

Entenderam? Meu $_GET não está sendo recuperado de forma alguma, alguém teria conhecimento do que é? :google:

 

Pesquisei a respeito e nada encontrado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloca ?sair=true

 

e recupera via filter_input validando via boolean se for true desloga.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Seguinte, como eu não gosto de deixar nada pra traz e gosto de resolver meus problemas, eu vou dizer o que acontece... Estou trabalhado com URL amigável, segue meu script em PHP que faz acontecer a mágica:

<?php
                $url = (isset($_GET['url'])) ? $_GET['url'] : '';
                $explode = explode('/', $url);

                $paginas = array(
                    "home",
                    "login",
                    "register",
                    "painel",
                    "sair"
                );

                if (isset($explode[0]) && $explode[0] == '') {
                    include "pages/home.php";
                } elseif ($explode[0] != '') {
                    if (isset($explode[0]) && in_array($explode[0], $paginas)) {
                        include "pages/" . $explode[0] . ".php";
                    } else {
                        include "pages/home.php";
                    }
                }
                ?>

Essa mágica é php estruturado, a dúvida ainda persiste sobre o as sessions?

 

Se ainda persiste, tem que passar pela a url o nome do método que encerra a sessão.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre as sessions já resolvi, era só incluir no arquivo a chamada da class, agora eu não consigo deslogar por conta da URL amigável, ela não captura o valor do meu $_GET['sair']...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está passando o parâmetro como query string valor null

../painel/?sair

correto:

../painel/sair

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu criei também um arquivo sair pois não é bem o jeito que eu quero, um exemplo:

 

Veja:

 

GUMYzKA.png

 

Pra entender melhor o exemplo, eu to passando por $_GET:

if (isset($_GET["sair"]) && $_GET["sair"] == true) {
    if($Logar->Deslogar()) {
        header("Location: login");
    }
    
}

Minha url está assim:

 

<a href="?sair=true"> Sair </a>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então amigo decide o que vai usar, se url amigável com htaccess, ou :hehehe: query string

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá eu quero com url amigável mas se for com url amigavel terei que criar um arquivo separado né? com por exemplo:

 

Arquivo sair.php e colocar la dentro a função pra deslogar...?

 

#editado====

 

Resolvido, não da forma que eu queria, pois vou ter problemas pra recurar os valores do $_GET no futuro, :/ o jeito foi criar um arquivo sair.php e dentro dele chamar :

<?php
session_start();
require_once(dirname(__DIR__) . "/modules/class/Connection.class.php");
require_once(dirname(__DIR__) . "/modules/class/Logar.class.php");

$Logar = new Logar();
$Logar->Deslogar();

header("Location: login");

e no link:

<a href="<?php echo URL_BASE; ?>/sair" onclick="return confirm('Deseja mesmo sair do painel?');">
            Sair
        </a>

É no futuro vou ter problemas pra passar o get...

Compartilhar este post


Link para o post
Compartilhar em outros sites

De uma olhada aqui, e aqui, e evite essa gambiarra toda!!

 

Para chamar as classes automaticamente, use Autoload

Inclua este arquivo abaixo dentro da pasta que contem as classes, depois é só chamar a autoload

Exemplo:

<?php
session_start();
require_once(dirname(__DIR__) . "/modules/class/MyAutoload.php");

$Logar = new Logar();
<?php

function MyAutoload($classname)
{
    $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
    if (is_readable($filename)) {
        require $filename;
    }
}


if (version_compare(PHP_VERSION, '5.1.2', '>=')) {


    if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
        spl_autoload_register('MyAutoload', true, true);
    } else {
        spl_autoload_register('MyAutoload');
    }
} else {


    function __autoload($classname)
    {
        MyAutoload($classname);
    }
}

http://php.net/manual/pt_BR/function.spl-autoload-register.php

para funcionar renomeie para class.nomedaclasse

ou altere aqui

 $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Troquei minha função antiga de autoload pra essa que você me passou, mas como o tópico que vc postou é antigo, nao posso restaura-lo, eu nao entendi aquele tópico!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que está começando, já faça seus códigos nos padrões do MVC

 

Entende inglês?

Comece por aqui é bem didático.

Aquele tópico já um pouco avançado, mas se seguir as aulas conseguira entender.

 

Este AutoLoad abaixo, já carrega as classes dentro deste padrão.

<?php
$paths = array(
	__DIR__ . DIRECTORY_SEPARATOR,
	MODEL,
	CONTROLLER,	
	VIEW
);

set_include_path(implode(PATH_SEPARATOR, array_unique($paths)));

/*
*Autoloader que implementa o PSR-0 especificações para a interoperabilidade entre software PHP. */
spl_autoload_register(
    function($className) {
		
        $fileParts = explode('\\', ltrim($className, '\\'));

        if (false !== strpos(end($fileParts), '_'))
            array_splice($fileParts, -1, 1, explode('_', current($fileParts)));

        $file = implode(DIRECTORY_SEPARATOR, $fileParts) . '.php';

        foreach (explode(PATH_SEPARATOR, get_include_path()) as $path) {
            if (file_exists($path = $path . DIRECTORY_SEPARATOR . $file))
                return require $path;
        }
    }
);

Só definir as contantes do diretório.

<?php
$paths = array(
	__DIR__ . DIRECTORY_SEPARATOR,
	MODEL,
	CONTROLLER,	
	VIEW
);

PS.: Ganhe uma semana estudando as videos aulas, e entenda o conceito e me agradecera no futuro.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estava até hoje tentando arrumar, por que eu sou assim, enquanto eu não arrumo tal coisa eu não sossego, e consegui, no meu .htaccess estava assim:

 

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1
apenas troquei para
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA] 
<- repare no QSA agora consigo passar query string com url amigável.

Compartilhar este post


Link para o post
Compartilhar em outros sites


<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

</IfModule>

 

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.