Ho un problema che a me sembra incomprensibile.
Ho fatto un sistema per la gestione del login degli utenti, formato principalmente da 3 file:
Login.php
Codice PHP:
<?php
// Richiama il file con le funzioni per la connessione al DB
require_once( 'config.inc.php' );
// Include il file con le funzioni per il login
require_once( 'login_funcs.php' );
//richiamo il file in cui vengono assegnati gli indirizzi delle cartelle, e creo un'istanza di smarty
require_once('smarty/setup.php');
$smarty = new Smarty;
// Connessione e selezione del DB
$conn = connetti_db();
// Controlla se c'è una corrispondenza nel DB. Se effettivamente è presente una corrispondenza ritorna 1,
// altrimenti un messaggio d'errore. Questa funzione si occupa anche di settari i valori di sessione
$login = user_login();
// Se la funzione user_login() ha tornato 1-> aggiorno il valore di last_login nel DB e reindirizzo l'utente
if( $login == 1 ){
// Definisco le variabili inserite in automatico
// Definisce il fuso orario utilizzato
date_default_timezone_set('Europe/Rome');
// Valorizzo una variabile con la data e l'ora corrente, nel formato YYYY-MM-DD HH:MM:SS
$data = date( "o-m-d H:i:s" );
// Inserisco nel database la data dell'ultimo login dell'utente
$sql = "UPDATE users_reda SET last_login = '$data' WHERE reda_id = '" . $_SESSION['id'] . "'";
$result = mysql_query( $sql ) or die( mysql_error());
switch( $_SESSION[ 'gruppo' ] ){
case 1:
header( 'Location:login_ok.php' );
break;
case 2:
header( 'Location:prova.php' ); // Mettere la pagina principale per i redattori
break;
case 3:
header( 'Location:prova.php' ); // Mettere la pagina principale per gli amministratori
break;
}
} else {
// Se il login non è andato a buon fine stampo un messaggio d'errore
$smarty-> assign( 'msg', $login );
$smarty-> display( 'accesso2.tpl' );
}
?>
login_funcs.php
Codice PHP:
function user_login(){
// Controlla se sono stati inseriti sia Username che Password
if( !$_POST[ 'uname' ] || !$_POST[ 'pass' ] ) {
// Se non sono stati inseriti restituisce una stringa d'errore
$feedback = 'ERRORE - Mancano Username e/o Password';
return $feedback;
} else {
// Altrimenti passa a controllare i dati inseriti con quelli presenti nel database
$uname = strtolower( $_POST[ 'uname' ] );
$pass = strtolower( $_POST[ 'pass' ] );
// Controllo se esiste un utente con quel username e quella password
$sql = "SELECT * FROM users_reda WHERE reda_uname='$uname' AND reda_pass='$pass'";
$result = mysql_query( $sql );
if( !$result || mysql_num_rows( $result ) < 1 ) {
$feedback = 'ERRORE- Username non trovato o Password sbagliata';
return $feedback;
} else {
$row = mysql_fetch_array( $result );
set_session( $row[ 'reda_id' ], $row[ 'reda_nome' ], $row[ 'reda_group' ] );
return 1;
}
}
}
function set_session( $id, $nome, $gruppo ){
global $supersecret_hash_padding;
// Controllo che siano settati tutti i parametri
if( !$id || !$nome || !$gruppo ){
$feedback = 'ERRORE- C\'è stato un errore nella trasmissione dei dati';
return $feedback;
} else {
// Valorizzo i campi dell'array $_SESSION
$_SESSION['id'] = $id;
$_SESSION['nome'] = $nome;
$_SESSION['gruppo'] = $gruppo;
$_SESSION['id_hash'] = md5( $nome . $supersecret_hash_padding );
// Valorizzo il cookie
setcookie( session_name(), md5( $nome . $supersecret_hash_padding ), time() + 3600, '/' );
//setcookie( 'id_hash', , time() + 3600, '/' );
}
}
login_ok.php
Codice PHP:
session_start();
//richiamo il file in cui vengono assegnati gli indirizzi delle cartelle, e creo un'istanza di smarty
require('smarty/setup.php');
$smarty = new Smarty;
if( isset( $_SESSION['nome'] ) ) {
$msg = 'Benvenuto ' . $_SESSION['nome'] . '. Adesso sei correttamente loggato';
}
$smarty->assign('msg', $msg);
$smarty->display('accesso2.tpl');
I dati vengono inviati tramite POST a login.php, il quale per controllarli richiama user_login() che è contenuto in login_funcs.php. Fin qui tutto ok, se non fosse per quando user_login() richiama set_session. Qui c'è la prima anomalia, infatti riesce a scrivere sull'array $_SESSION anche senza che sia stata iniziata nessuna sessione, e non da nessun errore!
Andando avanti quando login.php mi reindirizza a login_ok.php si crea la cosa più strana, infatti il messaggio che mi viene stampato mi scrive il nome sbagliato!
In DB ho 2 utenti e se mi loggo come il primo mi da il benvenuto come se fossi il secondo e viceversa, però i dati sul DB vengono aggioranti correttamente! Non capisco come faccia ad accedere alla linea del DB sbagliata....
Se invece aggiungo session_start() nella funzione user_login() mi visualizza il nome corretto solo al secondo accesso consecutivo dello stesso utente... In pratica la sequenza è: accedo come ut1 e vedo il nome di ut1
accedo come ut2 e vedo il nome di ut1
accedo come ut2 e vedo il nome di ut2
Se invece alterno gli accessi vedo sempre il nome sbagliato, come se mi leggesse i valori salvati nella sessione precedente.
A rendere il tutto più misterioso c'è il fatto che prima avevo fatto un sistema di login in un unico file, e li funziona tutto correttamente, ma le istruzioni sono praticamente le stesse, solo che invece di essere sotto forma di funzioni sono istruzioni sequenziali.
Altra domanda, se definisco un nome di sessione, come faccio a dire a PHP che deve andare a controllare il cookie con quel nome? Invece di cercare quello col nome standard? Perchè se provo a settare il nome, o non mi valorizza l'array $_SESSION o non so cosa, dato che in login_ok.php mi dice che la cella di $_SESSION che utilizzo non è settata!
Dopo di questo volevo chiedere qual'è la procedura corretta per ricordare un utente tramite sessione, cosa devo controllare effettivamente in ogni pagina protetta? Non so se mi risponderete come intendo io, perchè da nessuna parte ho trovato la risposta che cerco.