Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 23

Discussione: Sessioni e databae

  1. #11
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    ecco un idea:

    Codice PHP:
    <?php
    /****************************************************************************
    * Copyleft meh. [[url]http://meh.doesntexist.org[/url] | [email]meh.ffff@gmail.com[/email]]           *
    *                                                                           *
    * This program is free software: you can redistribute it and/or modify      *
    * it under the terms of the GNU Lesser General Public License as published  *
    * by the Free Software Foundation, either version 3 of the License, or      *
    * (at your option) any later version.                                       *
    *                                                                           *
    * This program is distributed in the hope that it will be useful,           *
    * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
    * GNU General Public License for more details.                              *
    *                                                                           *
    * You should have received a copy of the GNU General Public License         *
    * along with this program.  If not, see <[url]http://www.gnu.org/licenses/[/url]>.     *
    *****************************************************************************
    * Sessions in database library.                                             *
    ****************************************************************************/

    /**
     * MySQL:
     * ---------
     * CREATE TABLE `sessions` (
     *     `id`   VARCHAR(128) NOT NULL,
     *     `data` TEXT         NOT NULL,
     *     `time` DATETIME     NOT NULL,
     *     
     *     PRIMARY KEY (`id`),
     *
     *     UNIQUE `id` (`id`)
     * );
     */

    class dbSession
    {
        public static 
    $Config = array(
            
    'host'     => 'localhost',
            
    'username' => 'root',
            
    'password' => 'root',
            
    'database' => 'sessions'
        
    );

        public static 
    $connection null;

        public static function 
    connect ()
        {
            if (!
    self::$connection || !mysql_ping(self::$connection)) {
                
    self::$connection mysql_connect(self::$Config['host'], self::$Config['username'], self::$Config['password']);
            }
        
            
    mysql_select_db(self::$Config['database'], self::$connection);
        
            return 
    self::$connection;
        }
        
        public static function 
    open ($path$name)
        {
            
    self::connect();
        
            return 
    true;
        }
        
        public static function 
    close ()
        {
            
    $db   self::connect();
            
    $id   mysql_real_escape_string(session_id());
            
    $data mysql_real_escape_string(serialize($_SESSION));
        
            
    $query "REPLACE INTO `sessions` VALUES('{$id}', '{$data}', NOW())";
            
    mysql_query($query$db);
        }
        
        public static function 
    read ($id)
        {
            
    $db self::connect();
            
    $id mysql_real_escape_string($id);
        
            
    $query  "SELECT data FROM sessions WHERE `id` = '{$id}'";
            
    $query  mysql_query($query$db);
        
            if (!
    $query) {
                
    $result serialize(array());
            }
            else {
                
    $result mysql_fetch_array($queryMYSQL_ASSOC);
                
    $result $result['data'];
            }
        
            
    $_SESSION unserialize($result);
        
            return 
    $result;
        }
        
        public static function 
    write ($id$data)
        {
            return 
    true;
        }
        
        public static function 
    destroy ($id)
        {
            
    $db self::connect();
            
    $id mysql_real_escape_string($id);
        
            
    $query "DELETE FROM `sessions` WHERE `id` = '{$id}'";
            return (bool) 
    mysql_query($query$db);
        }
        
        public static function 
    gc ($lifeTime)
        {
            
    $db self::connect();
        
            
    $query  "SELECT `id`, DATE_FORMAT(`time`, '%H=%i=%S=%m=%e=%Y') FROM `sessions`";
            
    $result mysql_query($query);
        
            while (
    $session mysql_fetch_array($resultMYSQL_ASSOC)) {
                
    $time explode('='$session['time']);
                
    $time mktime((int) $time[0], (int) $time[1], (int) $time[2], (int) $time[3], (int) $time[4], (int) $time[5]) + $lifeTime;
        
                if (
    $time time()) {
                    
    $query "DELETE FROM `sessions` WHERE `id` = '{$session['id']}'";
                    
    mysql_query($query);
                }
            }
        
            return 
    true;
        }
    }
        
    session_set_save_handler("dbSession::open""dbSession::close""dbSession::read""dbSession::write""dbSession::destroy""dbSession::gc");
    ?>

  2. #12
    Utente di HTML.it L'avatar di torrone
    Registrato dal
    Apr 2006
    residenza
    Padova
    Messaggi
    1,128
    grazie.. ma una spiegazione e esempi di funzionamento di questa classe??

  3. #13
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    Codice PHP:
    <?php

    class dbSession
    {
        public static 
    $Config = array(
            
    'host'     => 'localhost',
            
    'username' => 'root',
            
    'password' => '',
            
    'database' => 'zymic'
        
    );

        public static 
    $connection null;

        
    /**
         Effettua la connessione e la selezione del database
        */
        
    public static function connect ()
        {
            if (!
    self::$connection || !mysql_ping(self::$connection)) {
                
    self::$connection mysql_connect(self::$Config['host'], self::$Config['username'], self::$Config['password']);
            }
        
            
    mysql_select_db(self::$Config['database'], self::$connection);
        
            return 
    self::$connection;
        }
        
        
    /**
         Ci sta per necessita, basta che ritorna un valore positivo
        */
        
    public static function open ($path$name)
        {
            
    self::connect(); ## non serve a nulla si può anche cancellare questa riga
        
            
    return true# basta che ritorna true
        
    }
        
        
    /**
         Quando avviene una qualsiasi azione con le sessioni essa si "attiva" automaticamente
        */
        
    public static function close ()
        {
            
    $db   self::connect();
            
    $id   mysql_real_escape_string(session_id());
            
    $data mysql_real_escape_string(serialize($_SESSION));
        
            
    $query "REPLACE INTO `sessions` VALUES('{$id}', '{$data}', NOW())";
            
    mysql_query($query$db);
        }
        
        
    /**
         Es. prova1.php
         <?php
         session_start();
         $_SESSION["var"] = 1;  # si attiva dbSession::close e modifica il valore
         ?>
         
         chiudo il browser, riapro il borwser su quest'altra pagina: asdasd.php
         <?php
         session_start();
         print $_SESSION["var"]; # si attiva dbSession::read per trovare i valori
         ?>
        */
        
    public static function read ($id)
        {
            
    $db self::connect();
            
    $id mysql_real_escape_string($id);
        
            
    $query  "SELECT data FROM sessions WHERE `id` = '{$id}'";
            
    $query  mysql_query($query$db);
        
            if (!
    $query) {
                
    $result serialize(array());
            }
            else {
                
    $result mysql_fetch_array($queryMYSQL_ASSOC);
                
    $result $result['data'];
            }
        
            
    $_SESSION unserialize($result);
        
            return 
    $result;
        }
        
        public static function 
    write ($id$data)
        {
            return 
    true;
        }
        
        
    /**
         Cancella la sessione
        */
        
    public static function destroy ($id)
        {
            
    $db self::connect();
            
    $id mysql_real_escape_string($id);
        
            
    $query "DELETE FROM `sessions` WHERE `id` = '{$id}'";
            return (bool) 
    mysql_query($query$db);
        }
        
        
    /**
         Tempo di durata delle sessioni
        */
        
    public static function gc ($lifeTime)
        {
            
    $db self::connect();
        
            
    $query  "SELECT `id`, DATE_FORMAT(`time`, '%H=%i=%S=%m=%e=%Y') FROM `sessions`";
            
    $result mysql_query($query);
        
            while (
    $session mysql_fetch_array($resultMYSQL_ASSOC)) {
                
    $time explode('='$session['time']);
                
    $time mktime((int) $time[0], (int) $time[1], (int) $time[2], (int) $time[3], (int) $time[4], (int) $time[5]) + $lifeTime;
        
                if (
    $time time()) {
                    
    $query "DELETE FROM `sessions` WHERE `id` = '{$session['id']}'";
                    
    mysql_query($query);
                }
            }
        
            return 
    true;
        }
    }
        
    session_set_save_handler
    (
        
    "dbSession::open",  # <--- session_start(); # basta che restituisce true se si utilizza db
        
    "dbSession::close"#
        
    "dbSession::read",  # serve per trovare i valori di $_SESSION
        
    "dbSession::write"# basta che restituisce true
        
    "dbSession::destroy"# <-- session_destroy();
        
    "dbSession::gc" # tempo di durata delle sessioni
    );
    ?>
    spero sia chiaro

  4. #14
    Utente di HTML.it L'avatar di torrone
    Registrato dal
    Apr 2006
    residenza
    Padova
    Messaggi
    1,128
    ma come gestisco la durata della sessione?? non capisco come gestisce la durata... cioè quando decide di cancellarla..... qualcuno sa spiegarmi il funzionamento??

  5. #15
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    La durata della sessione va gestita con la funzione del garbage collector. Fra l'altro noto che quella che ti hanno postato è delirante, perché legge tutte le sessioni e va a calcolarsi in php quali sono da cancellare, per poi farlo una alla volta.
    La soluzione in realtà è molto più semplice, una query secca che cancella tutte le righe in cui l'ultima modifica risale a più di tot secondi fa. Nell'altro post che ti ho già indicato dovrebbe esserci.

    Poi devi tenere presente anche che ci sono delle impostazioni di php.ini che definiscono con quale probabilità viene chiamato il garbage collector. Se la probabilità è di 1 su 100, significa che, mediamente, ogni cento accessi alle sezioni ci sarà una "pulizia generale". E' ovvio che se il sito è poco frequentato questo può accadere anche di rado.

  6. #16
    Utente di HTML.it L'avatar di torrone
    Registrato dal
    Apr 2006
    residenza
    Padova
    Messaggi
    1,128
    Originariamente inviato da luca200
    La durata della sessione va gestita con la funzione del garbage collector. Fra l'altro noto che quella che ti hanno postato è delirante, perché legge tutte le sessioni e va a calcolarsi in php quali sono da cancellare, per poi farlo una alla volta.
    La soluzione in realtà è molto più semplice, una query secca che cancella tutte le righe in cui l'ultima modifica risale a più di tot secondi fa. Nell'altro post che ti ho già indicato dovrebbe esserci.

    Poi devi tenere presente anche che ci sono delle impostazioni di php.ini che definiscono con quale probabilità viene chiamato il garbage collector. Se la probabilità è di 1 su 100, significa che, mediamente, ogni cento accessi alle sezioni ci sarà una "pulizia generale". E' ovvio che se il sito è poco frequentato questo può accadere anche di rado.
    si si... quella sul server so come gestisco la durata.. di solito però faccio così

    Codice PHP:
    if(isset($_SESSION['ora_login']) && time()-$_SESSION['ora_login']>360$_SESSION=array(); // 1800 --> 30 Minuti $_SESSION['ora_login']=time(); 
    pensavo in qualche modo che venisse gestita anche su database... invece da come posso capire no..

    ma quindi per gestirle semplicemente su database basta che quando effettuo il login, creo le sessioni, e le registro anche sul database, creando un record... poi per vedere se l'utente è loggato (connesso al sito) confronto se le sessioni create dall'utente durante il login sono uguali a quelle registrate sul database? ...

    per esempio quando effettuo il login genero

    codice:
    $nickname_ses = mysql_escape_string($_POST[nickname]);
    $password_ses = mysql_escape_string(md5($_POST[password]));
    //genero un codice random
    $session_key = mysql_escape_string($codice);
    
    creo le sessioni
    $_SESSION['nickname_ses'] = $nickname_ses;
    $_SESSION['password_ses'] = $password_ses;
    $_SESSION['session_key'] = $session_key;
    
    e poi salvo nel database con una tabella (id-nick-pass-key) le sessioni per esempio
    -nell'id salvo session_id
    -nel nick salvo $_SESSION['nickname_ses']
    -nella pass salvo $_SESSION['password_ses']
    -nella key salvo $_SESSION['session_key']
    poi per vedere se uno è autenticato confronto le sessioni generate dal login con quelle nel database e se c'è un record dove corrispondono tutte e 4 vuol dire che l'utente è connesso altrimenti no.. giusto ?

  7. #17
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non ho capito niente di quello che hai scritto, e ora non ho tempo di mettermi lì a studiarlo. Una cosa è sicura: fai un gran casino inutile

  8. #18
    Utente di HTML.it L'avatar di torrone
    Registrato dal
    Apr 2006
    residenza
    Padova
    Messaggi
    1,128
    Originariamente inviato da luca200
    Non ho capito niente di quello che hai scritto, e ora non ho tempo di mettermi lì a studiarlo. Una cosa è sicura: fai un gran casino inutile
    ne sono certo e sono sicuro che la cosa sia mooolto più semplice di quanto quanto penso io

    in parole povere

    effettuo il login
    creo le sessioni
    le salvo sul database (creando un record con salvato per esempio il session_id() )

    per vedere se si è autenticati verifico se il proprio session_id() corrisponde a quello salvato sul database?


    quello che non riesco a comprendere è: come salvare sul database la sessione o cosa salvare, come verificare poi se l'utente in questione è collegato..

  9. #19
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    No, no, no e ancora no.

    Domandina semplice: hai mai lavorato con le sessioni?

  10. #20
    Utente di HTML.it L'avatar di torrone
    Registrato dal
    Apr 2006
    residenza
    Padova
    Messaggi
    1,128
    Originariamente inviato da luca200
    No, no, no e ancora no.

    Domandina semplice: hai mai lavorato con le sessioni?
    mm.. ora mi sto mettendo.. ci ho lavorato un pò ma non salvandole su database...

    cmq poco...

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.