Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 30
  1. #1

    $_SESSION in campo BLOB

    Ciao!

    Salvo sul DB nella tabella "sessions" nel campo "data" di tipo BLOB:
    serialize($_SESSION)

    Per prelevare questo campo utilizzo:
    $_SESSION = unserialize($data)

    $_SESSION è una array di elementi "mix" (oggetti, interi, stringhe, ...).
    L'istruzione unserialize($data) mi restituisce una stringa, non l'array di partenza.
    Come posso risolvere questo bug? Forse invece di serialize mi conviene utilizzare json?

    Grazie!

  2. #2
    Ancora nessun risposta?

    Riformulo la domanda:

    1) Per salvare $_SESSION sul DB creo una tabella con un campo di tipo BLOB.
    2) Alle query che eseguono l'inserimento o l'aggiornamento della sessione passo come parametro serialize($_SESSION).
    3) Una volta prelevata la sessione dal DB, devo eseguire $_SESSION=unserialize($session).

    I punti 1 e 2 dovrebbero essere corretti.
    Invece, perchè il punto 3 mi restituisce la stringa che rappresenta la sessione, e non il vero e proprio array di sessione? Come posso ottenere l'array invece della stringa?

  3. #3
    It is not possible to serialize PHP built-in objects.
    Inoltre non puoi serializzare le risorse.

    Detto questo, perchè devi serializzare le session? Qual'è il motivo per fare un'operazione fondamentalmente....quasi inutile?
    Le variabili di sessione, se proprio devi, te le salvi nelle sessioni...non nel db...

  4. #4
    vedere: http://php.net/manual/en/function.se...ve-handler.php

    Il seguente script, quando lo eseguo la PRIMA volta mi restituisce correttamente la stringa:
    SESSION =
    sessione NON settata
    Invece, quando dal browser premo F5 (aggiorna), mi restituisce la stringa ERRATA:
    SESSION = test|s:4:"TEST";
    sessione GIA settata t
    INVECE DI:
    SESSION = test|s:4:"TEST";
    sessione GIA settata TEST
    Sapresti spiegarmi dove sbaglio? (l'errore credo sia nella callback "update").
    Forse non capito bene la logica di "session_set_save_handler"?
    Forse le sessioni sul DB andrebbero salvate in un altro modo?

    Codice PHP:
    <?php
    ini_set
    ('display_errors',true);


    // ************************************************************
    // session_set_save_handler CALLBACK 
    // ************************************************************

    function open($savePath$sessionName) {
        return 
    true;
    }

    function 
    close() {
        return 
    true;
    }

    function 
    read($id) {
        
    update($id);
    }

    function 
    write($id$data) {
        
    update($id$data);
    }

    function 
    destroy($id) {
        
    delete("id='$id'");
    }

    function 
    gc($maxlifetime) {
        
    delete("Sessions.creationDate + $maxlifetime < ".time());
    }

    // ************************************************************
    // QUERY
    // ************************************************************

    function connect() {
        
    mysql_connect("localhost""root""XXX")
            or die(
    "Could not connect: " mysql_error());
        
    mysql_select_db("TEST");
    }

    function 
    update($id$data=null) {
        
        
    connect();
        
    $result mysql_query("SELECT * FROM Sessions WHERE id='".$id."';");
        if(!
    $result) die('Invalid query: ' mysql_error());
        
        
    $id_tmp null;
        
    $s '';
        while(
    $row mysql_fetch_array($result)) {
            
    $id_tmp $row["id"];
            
    $s $row["data"];
        }
        if(
    $data != null$s serialize($data);
        
        
    $q '';
        if(
    $data == null) {
            
    $q = ($id_tmp == null)
            ? 
    "INSERT INTO Sessions (id, creationDate) VALUES ('$id',".time().");"
            
    "UPDATE Sessions SET creationDate = ".time()." WHERE id='$id';";
        } else {
            
    $q = ($id_tmp == null)
            ? 
    "INSERT INTO Sessions (id, creationDate, data) VALUES ('$id',".time().",'".serialize($data)."');"
            
    "UPDATE Sessions SET creationDate = ".time().", data='".serialize($data)."' WHERE id='$id';";
        }
        
        
    $result mysql_query($q);
        if(!
    $result) die('Invalid query: ' mysql_error());
        
        
    $_SESSION unserialize($s);
    }

    function 
    delete($where) {
        
    connect();
        
    $result mysql_query("DELETE FROM Sessions WHERE $where;");
        if(!
    $result) die('Invalid query: ' mysql_error());
    }

    // ************************************************************
    // SESSION START
    // ************************************************************

    session_set_save_handler("open""close""read""write""destroy""gc");

    session_start();

    // ************************************************************
    // SESSION TEST
    // ************************************************************

    if(isset($_SESSION['test'])) {
        echo 
    'SESSION = '.$_SESSION.'
    '
    ;
        echo 
    'sessione GIA settata '.$_SESSION['test'].
    '
    ;
    } else {
        echo 
    'SESSION = '.$_SESSION.'
    '
    ;
        echo 
    'sessione NON settata
    '
    ;
        
    $_SESSION['test'] = "TEST";
    }

    ?>

  5. #5
    Riscrivo lo script in modo più semplice e chiaro:

    Codice PHP:
    <?php
    ini_set
    ('display_errors',true);

    // ************************************************************
    // DATABASE
    // ************************************************************

    function connect() {
        
    mysql_connect("localhost""root""XXX")
            or die(
    "Could not connect: " mysql_error());
        
    mysql_select_db("TEST");
    }

    // ************************************************************
    // CALLBACK session_set_save_handler
    // ************************************************************

    function open($savePath$sessionName) {
        return 
    true;
    }

    function 
    close() {
        return 
    true;
    }

    function 
    read($id) {
        
    connect();
        
    $result mysql_query("SELECT data FROM Sessions WHERE id='$id';");
        
    $data serialize(array());
        while(
    $row mysql_fetch_array($result))
            
    $data serialize($row["data"]);
        
    mysql_query("UPDATE Sessions SET creationDate=".time()." WHERE id='$id';");    
        
    $_SESSION unserialize($data);
        return 
    true;
    }

    function 
    write($id$data) {
        
    connect();
        
    $result mysql_query("SELECT id FROM Sessions WHERE id='$id';");
        
    $b false;
        while(
    $row mysql_fetch_array($result))
            
    $b true;
        if(
    $b) return mysql_query("UPDATE Sessions SET creationDate=".time().", data='$data' WHERE id='$id';");
        return 
    mysql_query("INSERT INTO Sessions (id, creationDate, data) VALUES ('$id',".time().",'$data');");
    }

    function 
    destroy($id) {
        
    connect();
        return 
    mysql_query("DELETE FROM Sessions WHERE id='$id';");
    }

    function 
    gc($maxlifetime) {
        
    connect();
        return 
    mysql_query("DELETE FROM Sessions WHERE Sessions.creationDate + $maxlifetime < ".time().";");
    }

    // ************************************************************
    // SESSION START
    // ************************************************************

    session_set_save_handler("open""close""read""write""destroy""gc");

    session_start();

    // ************************************************************
    // SESSION TEST
    // ************************************************************

    if(isset($_SESSION['test'])) {
        echo 
    'SESSION = '.$_SESSION.'
    '
    ;
        echo 
    'sessione GIA settata '.$_SESSION['test'].
    '
    ;
    } else {
        echo 
    'SESSION = '.$_SESSION.'
    '
    ;
        echo 
    'sessione NON settata
    '
    ;
        
    $_SESSION['test'] = "TEST";
    }

    ?>
    Sul DB ho la tabella Sessions così strutturata:
    codice:
    id (VARCHAR 32) -> id sessione
    creationDate (INT 11) -> timestamp ultima modifica
    data (BLOB) -> contenuto sessione

  6. #6
    Beh, è sbagliata la logica che utilizzi...
    Il sistema per come l'hai impostato funziona così:

    start_session -> deve leggere, quindi read, che rimanda a update.
    Update esegue la query, non trova record, $data è null come $i_temp quindi la query è "INSERT INTO Sessions (id, creationDate) VALUES ('81dc84722eab5d14dfd34473ea73c4a1',1325159746);"
    Al termine della query c'è $_SESSION = unserialize($s); $s è null, session diventa false.

    Dopo la lettura c'è il controllo che stampa "non settata" e imposti la sessione, quindi viene eseguita write che rimanda a update. In questo caso abbiamo $id = '81dc84722eab5d14dfd34473ea73c4a1' e $data = "test|s:4:"TEST";"
    Esegue la select e trova il record, quindi $id_temp = '81dc84722eab5d14dfd34473ea73c4a1' e $s = "" (stringa vuota).
    $data è diverso da null, quindi serializza...ma serializza una stringa, che quindi diventa "s:16:"test|s:4:"TEST";";"
    $data != null quindi la query diventa UPDATE Sessions SET creationDate = 1325160163, data='s:16:"test|s:4:"TEST";";' WHERE id='81dc84722eab5d14dfd34473ea73c4a1';
    A questo punto ancora abbiamo $_SESSION = unserialize($s); dove $s = "s:16:"test|s:4:"TEST";";" quindi session diventa (da array che era prima) "test|s:4:"TEST";" (cioè una stringa)


  7. #7
    Urco mi hai cambiato le funzioni sotto il naso

    Vabbeh cambia poco, la logica è sbagliata lostesso, anche con le nuove funzioni...

    Codice PHP:
    function read($id) {
        
    connect();
        
    $result mysql_query("SELECT data FROM Sessions WHERE id='$id';");
        
    $data serialize(array());
        while(
    $row mysql_fetch_array($result)){
            
    $data $row["data"]; // Perchè qui serializzavi? Sei in lettura dal db... 
        
    }
        
    mysql_query("UPDATE Sessions SET creationDate=".time()." WHERE id='$id';");
        
    $_SESSION unserialize($data);
        return 
    true;
    }

    function 
    write($id) {
        
    $data serialize($_SESSION); // Questo è il modo corretto per serializzare le session...
        
    connect();
        
    $result mysql_query("SELECT id FROM Sessions WHERE id='$id';");
        if(
    mysql_num_rows($result)){
            return 
    mysql_query("UPDATE Sessions SET creationDate=".time().", data='$data' WHERE id='$id';");
        } else {
            return 
    mysql_query("INSERT INTO Sessions (id, creationDate, data) VALUES ('$id',".time().",'$data');");
        }


  8. #8
    Con le tue funzioni "read" e "write" lo script sembra funzionare bene!
    Non capisco una cosa però, la funzione "write" riceve i due parametri "id_sessione" e "data",
    quindi, invece di questo:
    Codice PHP:
    function write($id) { 
        
    $data serialize($_SESSION); // Questo è il modo corretto per serializzare le session... 
    non potrei fare semplicemente così? :
    Codice PHP:
    function write($id$sess) { 
        
    $data $sess

  9. #9
    La mia domanda resta valida però...
    Perchè salvare nel db le variabili di sessione?
    Mi spiego meglio. Se lo scopo è solo di verificare il corretto login di un utente, non è necessario fare tutto questo lavoro: basta salvare l'id di sessione e salvarlo anche in un cookie, aggiungendo la logica di controllo tra cookie e dato nel db (comprese eventuali date di scadenza) nella tabella delle sessioni.
    Idem se si tratta di un carrello della spesa, si salvano solo i dati del carrello.

    Salvare indiscriminatamente tutti i valori di $_SESSION può creare svariati problemi oltre che ovviamente essere superfluo, spesso.

  10. #10
    Originariamente inviato da ajaxSensitive
    Con le tue funzioni "read" e "write" lo script sembra funzionare bene!
    Non capisco una cosa però, la funzione "write" riceve i due parametri "id_sessione" e "data",
    quindi, invece di questo:
    Codice PHP:
    function write($id) { 
        
    $data serialize($_SESSION); // Questo è il modo corretto per serializzare le session... 
    non potrei fare semplicemente così? :
    Codice PHP:
    function write($id$sess) { 
        
    $data $sess
    No, se la read la lasci come l'hai fatta tu no.
    Se invece cambi la read in
    Codice PHP:
    function read($id) {
        
    connect();
        
    $result mysql_query("SELECT data FROM Sessions WHERE id='$id';");
        
    $data serialize(array());
        while(
    $row mysql_fetch_array($result)){
            
    $data $row["data"];
        }
        
    mysql_query("UPDATE Sessions SET creationDate=".time()." WHERE id='$id';");
        return 
    $data;

    allora puoi usare la write
    Codice PHP:
    function write($id$sess) {
        
    $data $sess;
        
    connect();
        
    $result mysql_query("SELECT id FROM Sessions WHERE id='$id';");
        if(
    mysql_num_rows($result)){
            return 
    mysql_query("UPDATE Sessions SET creationDate=".time().", data='$data' WHERE id='$id';");
        } else {
            return 
    mysql_query("INSERT INTO Sessions (id, creationDate, data) VALUES ('$id',".time().",'$data');");
        }

    (come dicevo...è la logica che è sbagliata...)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.