PDA

View Full Version : [PHP]Problema con un logout


canepazzojoe
02-08-2013, 16:48
Buonasera a tutti.
Ho un grosso problema con un logout;
Premessa:
Non ho potuto sfruttare i consigli che avete già dato perchè il mio problema riguara un sito internet un pò più complesso rispetto a gli altri.
perchè più complesso?Perchè uso MVC e in più invece di "buttare" tutto il codice in 2-3 pagine uso "classi e oggetti" , tipo programmazione object oriented quindi diciamo che è lungo da trovare come errore e secondo me è anche un errore stupido che ho commesso.
Il codice è molto grezzo perchè prima vorrei farlo funzionare poi magari andrei a raffinarlo.Per ora anche per questo motivo, non uso il DB preferisco che funzioni tutto senza per poi convertire tutto.
Veniamo al codice:
Per fare il logout uso questa funzione:
protected function logout($lc){

$_SESSION = array();

if (session_id() != '' || isset($_COOKIE[session_name()])) {

setcookie(session_name(), '', time() - 2592000, '/');
}
session_unset(); //
session_destroy();
$this->showLoginPage($lc);

}
Ovviamente credo che senza la funzione per fare il login non mi sappiate dire dove sbaglio quindi vi inserisco un pò di codice e spero di farvi capire come funziona e se funziona quello che sto facendo; per prima cosa ovviamente questa funzione è usata solo dalla classe dove è contenuta o dalle figlie; seconda cosa che vi può essere utile , vi do un pò di codice:
Questa è la classe che sceglie che come "riempire" la pagina indice:
<?php
include_once basename(__DIR__).'/../Modello/CreatoreUtenti.php';
include_once basename(__DIR__).'/../Modello/Utente.php';
include_once basename(__DIR__).'/../Vista/LayoutCreator.php';
//classe di controllo che gestisce le parti in comune tra tutti
//i controlli e gestisce gli utenti non registrati
class SuperControl{

public function __construct() {

}

//questa funzione gestisce le pagine richieste dall'utente
public function requestGestor(&$request,&$session){

//creo il creatore di layout ( O_o)
$lc=new LayoutCreator();

//controllo se è stato ricevuto un comando
if(isset($request["cmd"])){
//se il comando ricevuto è "login" allora...
if($request["cmd"]=='login'){
if(isset($session["user"])){
$user=$session["user"];

//una volta controllato se la richiesta per l'utente è
////stata settata poso controllare se è un utente valido
if($user->isAUser())
$this->setHomeUtente($lc);

//in tutti gli altri casi mostro la pagina di login
else
$this->setLoginPage($lc);
}else {

$this->setLoginPage($lc);

}

}
else if($request["cmd"]=='login'){
$this->logout($lc);
}
else
$this->setLoginPage($lc);


}else {
if($this->logged())
$this->setHomeUtente($lc);
else
$this->setLoginPage($lc);

}
require basename(__DIR__) . '/../Vista/masterpage.php';

}
protected function setHomeUtente($lc) {
$user = $_SESSION['user'];
switch ($user->getRuolo()) {
case User::compratore:
$lc->setTitle("Benvenuto/a nella home compratore!");
$lc->setHeader(basename(__DIR__).'/../Vista/compratore/logo.php');
$lc->setCenter(basename(__DIR__).'/../Vista/compratore/quadroc.php');
$lc->setLeftBar(basename(__DIR__).'/../Vista/compratore/lside.php');
$lc->setFooter(basename(__DIR__).'/../Vista/compratore/ppagina.php');
break;

case User::commerciante:
$lc->setTitle("Benvenuto/a nella home commerciante!");
$lc->setHeader(basename(__DIR__).'/../Vista/commerciante/logo.php');
$lc->setCenter(basename(__DIR__).'/../Vista/commerciante/quadroc.php');
$lc->setLeftBar(basename(__DIR__).'/../Vista/commerciante/lside.php');
$lc->setFooter(basename(__DIR__).'/../Vista/commerciante/ppagina.php');
break;

case User::amministratore:
$lc->setTitle("Benvenuto/a nella home amministratore!");
$lc->setHeader(basename(__DIR__).'/../Vista/amministratore/logo.php');
$lc->setCenter(basename(__DIR__).'/../Vista/amministratore/quadroc.php');
$lc->setLeftBar(basename(__DIR__).'/../Vista/amministratore/lside.php');
$lc->setFooter(basename(__DIR__).'/../Vista/amministratore/ppagina.php');
break;
default :
$this->setLoginPage($lc);
}
}
public function setLoginPage(&$lc){

$lc->setTitle("Effettua il login! ");
$lc->setHeader(basename(__DIR__).'/../Vista/login/logo.php');
$lc->setCenter(basename(__DIR__).'/../Vista/login/quadroc.php');
$lc->setLeftBar(basename(__DIR__).'/../Vista/login/lside.php');
$lc->setFooter(basename(__DIR__).'/../Vista/login/ppagina.php');



}
//questa funzione controlla se l'utente è già loggato
protected function logged(){
if(isset($_SESSION["user"])){
$user=$_SESSION["user"];
if($user->isAUser())
return true;
else {
return false;
}

}else
return false;

}
protected function logout($lc){

$_SESSION = array();

if (session_id() != '' || isset($_COOKIE[session_name()])) {

setcookie(session_name(), '', time() - 2592000, '/');
}
session_unset();
session_destroy();
$this->showLoginPage($lc);

}
}
?>

C'è una "masterpage" che viene esclusivamente riempita diciamo che è poco importante
spero vi basti come codice, altrimenti cerco di darvi tutto quello che vi serve
edit:forse vi serve anche come lo chiamo il logout:
<div class="logout">
<a href="indice.php?cmd=logout">Logout</a>
</div>

skyline90
04-08-2013, 16:09
public function session_destroy();

tutto il codice in una funzione non esce fuori di essa se non è messa come "public" avevo anche io un problema del genere... provaci

è come un tipo di UAC... non ha i permessi per modificare del codice fuori alla funzione stessa

canepazzojoe
05-08-2013, 12:54
public function session_destroy();

tutto il codice in una funzione non esce fuori di essa se non è messa come "public" avevo anche io un problema del genere... provaci

è come un tipo di UAC... non ha i permessi per modificare del codice fuori alla funzione stessa

Uhm, bhe su session_destroy è uan funzione standard ci posso fare ben poco, posso provare a fare quella di logout public ma non credo che funzioni. Ripeto Logout viene usata solo da oggetti di tipo SuperControl o che ereditano da quella classe. Comunque grazie ora provo

canepazzojoe
05-08-2013, 13:17
public function session_destroy();

tutto il codice in una funzione non esce fuori di essa se non è messa come "public" avevo anche io un problema del genere... provaci

è come un tipo di UAC... non ha i permessi per modificare del codice fuori alla funzione stessa

non ha funzionato infatti :/ trovato l'errore era quà :

else if($request["cmd"]=='login'){
$this->logout($lc);
}
else
$this->setLoginPage($lc);


}
ovviamente al postto di $request["cmd"]=='login' ci va $request["cmd"]=='logout'.
Grazie per l'aiuto se l'amministratore/moderatore vuole può anche chiudere, grazie ancora