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 == ){
        
        
// 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 ) < ) {
                
$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
            
setcookiesession_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.