PDA

Visualizza la versione completa : Problema CGI::SESSION


ringhio_8
02-02-2010, 14:28
Caio a tutti ragazzi, sto creando una pagina di log_in e da questa devo fare in modo che se esiste l'utente nel DB, apro una sessione per lui, in caso contrario lo faccio registrare.

Girando per la rete ho trovato una parte di script di esempio di utilizzo delle CGI::SESSION, ho anche seguito un tutorial e devo dire che funzionano, ma non sono sicuro che sia giusto cos, ed inoltre non riesco a tirare fuori i dati dalla sessione.

Il package Sessioni_CGI::Sessioni l'ho creato io perch devo aprire una sessione per ogni utente ed anche perch mi piacerebbe in un futuro separarlo dal main e richiamarlo come programma esterno (ma questa un altra storia).

Il mio script si presenta cos:

{
package Sessioni_CGI::Sessioni;
use strict;
use warnings;
use CGI;
use CGI::Session;

sub SetLogIn {
my $User_id= shift;
my $Username= shift;
my $Password= shift;
my $Nome= shift;
my $Cognome= shift;
my $Email= shift;
#print "$User_id, $Username, $Password, $Nome, $Cognome, $Email";
my $session = new CGI::Session("driver:File", undef, {Directory=>'/tmp'});

# getting the effective session id:
my $CGISESSID = $session->id();

# storing data in the session

$session->param('User_id', $User_id);
$session->param('Username', $Username);
$session->param('Password', $Password);
$session->param('Nome', $Nome);
$session->param('Cognome', $Cognome);
$session->param('Email', $Email);
$session->flush();
# clearing a certain session parameter
$session->clear(["_IS_LOGGED_IN"]);
# prova ad utilizzare il campo email
my $email = $session->param('Email');
print "email: $email";

# expire '_IS_LOGGED_IN' flag after 10 idle minutes:
$session->expire(_IS_LOGGED_IN => '+10m');

# expire the session itself after 1 idle hour
$session->expire('+1h');

# delete the session for good
$session->delete();

}


}







#recupero dati dal form
my $ut_username=$cgi->param('username');
my $ut_password=$cgi->param('password');

# se ci sono i dati faccio la select e controllo cos che ci sia l' utente nel DB
if($ut_username && $ut_password){
my $sql = "SELECT Utente.Id, Utente.Username, Utente.Password, Utente.Nome, Utente.Cognome, Utente.Email
FROM Utente
WHERE Username = '$ut_username' AND Password = '$ut_password'
";
my $sth = $dbh->prepare($sql);
$sth->execute or die "SQL Error: $DBI::errstr\n";
my $numRows = $sth->rows;
# se il NUm_rows > di 1 significa che presente e quindi procedo con la creazione della sessione
if ($numRows != 0){
my @Array_Utente_Info=$sth->fetchrow_array; #gli passo un array contenente il risultato della query
Sessioni_CGI::Sessioni::SetLogIn(@Array_Utente_Inf o);# richiamo la funzione passandogli un array di dati
#print @Array_Utente_Info;



}else {

print "chi sei?";

}

#
#DA QUI IN POI DOVREI UTILIZZARE LE VARIABILI DI SESSIONE MA COME ????????
#

Le mie domande sono:

- qiusto cancellare subito una sessione subito dopo averla creata?? i dati non credo che rimangano, ma se tolgo il $session->delete(); si aprono pi sessioni per uno stesso utente

-perch non riesco ad accedere ai dati della sessione all'esterno della mia funzione?? s che con my dichiaro una variabile locale, ma come in php i dati non vengono memorizzati in array superglobale, oppure (visto che sono memorizzati nel file) non dovrei accedere ai dati della sessione da qualunque punto del mio programma??


Ho le idee un p confuse!!!

Grazie a tutti per l'aiuto.

shishii
24-02-2010, 11:00
Le mie domande sono: - qiusto cancellare subito una sessione subito dopo averla creata?? i dati non credo che rimangano, ma se tolgo il $session->delete(); si aprono pi sessioni per uno stesso utente

Se la cancelli perdi i dati di sessione. Per evitare la creazione di pi sessioni per lo stesso utente contemporanee sufficiente che controlli l'esistenza di una sessione identificata tramite il cookie di sessione, se esiste utilizzi la stessa, altrimenti ne apri un'altra.


-perch non riesco ad accedere ai dati della sessione all'esterno della mia funzione?? s che con my dichiaro una variabile locale, ma come in php i dati non vengono memorizzati in array superglobale, oppure (visto che sono memorizzati nel file) non dovrei accedere ai dati della sessione da qualunque punto del mio programma??

non ho capito bene cosa vuoi dire. In Perl se usi "use strict" e "my" non puoi vedere le variabili all'esterno del blocco (nono solo della funzione) in cui stanno e devi usare meccanismi di esportazione.

Loading