Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Codeigniter - architettura e problema sessioni

    Buona sera a tutti,
    dopo qualche anno di smanettamento con PHP "puro" ho deciso di passare ad un framework per poter essere un po più produttivo.
    Tra i framework che possono essere installati senza console (senza riga di comando, perchè uso hosting semicondivisi) ho scelto codeigniter.

    Vorrei innanzi tutto mettervi a conoscenza dell'architettura del mio sito:
    ho creato, in Application->Core la classe My_loader che si occupa di cercare nel database una variabile ($page) che riceve in GET (ovviamente pulita e controllata) e di caricare la view header, la view footer ed il controller della pagina presa in GET (il quale poi caricherà il view).

    Ci sto smanettando da qualche giorno e sto cercando di creare un semplicissimo login con area privata, ho attivato anche il salvataggio nel database delle sessioni.
    Mi sono accorto però che ogni qualvolta carico la libreria "sessions" il sistema mi crea un record nel database (e come se mi creasse due sessioni diverse) e dunque il controllo nel login non ha successo (scrivo una sessione con un certo session_id che contiene l'username dell'utente e ne controlla un' altra con tutt'altro session_id e senza username ed altri dati).

    Ovviamente stessa cosa se faccio caricare la libreria in autoload.
    Dovrei quindi avere un unico $this->load->library("sessions") per tutto il sito, ma con l'architettura attuale del sito non è possibile. Come posso risolvere? Grazie in anticipo

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Cambiando l'architettura del tuo sito.
    Stai facendo una cosa non prevista dal framework, per questo non funziona.
    Se vuoi usare un framework, devi stare alle sue regole, non puoi fare come vuoi.

  3. #3
    Grazie per la risposta
    Potresti suggerirmi una buona architettura da applicare?

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Per inserire header e footer basta che ti fai 2 view specializzate, per esempio

    header_vew.php contenente il codice per l'header
    footer_vew.php contenente il codice per il footer

    poi in tutte le view
    Codice PHP:
    <html>
        <head>
            ....
        </head>
        <body>
            <?php echo $this->load-view('header_view'?>

            codice della pagina tra header e footer

            <?php echo $this->load-view('footer_view'?>
        </body>
    </html>
    La gestione delle sessioni lasciala a CI ed usa le sue funzioni per aggiungere, leggere e cancellare dati:
    - $this->session->set_userdata(...)
    - $this->session->userdata(...)
    - $this->session->unset_userdata(...)
    ecc...


    Poi cosa ti serve?

  5. #5
    Ok, direi che mi sono perso in un bicchiere d'acqua per la struttura... ho fatto la cosa molto più complicata di quanto non sia.
    Premetto che non lo sto provando ora, questa sera appena sarò a casa lo testerò, ma anche con la struttura che mi hai dato dovrei avere due $this->load->library("sessions") (uno dove scrivo la sessione ed uno, nella pagina protetta, dove controllo la sessione) e dunque 2 record nel database no?

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    No, nel file application\config\autoload.php metti

    $autoload['libraries'] = array('database','session','encrypt');
    (in realtà dovrebbe già esserci)

    e la sessione ci pensa CodeIgniter a caricarla, tu non devi fare niente, usi le funzioni di cui ti ho parlato prima e basta.

  7. #7
    Niente da fare... non vuole saperne di funzionare. Ho provato ad utilizzare solo i cookie, senza salvare nulla nel database e funziona tutto. Se provo ad utilizzare il database, il var_export di $this->session->all_userdata() è il seguente:
    Codice PHP:
    array ( 'session_id' => '37c895e5db711ca567ea5a7b83ef6090''ip_address' => '127.0.0.1''user_agent' => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36''last_activity' => 1388867530'user_data' => '', ) 
    Questo è il contenuto di checklogin.php (il controller che scrive la sessione):
    Codice PHP:
    ...
    ...
    $newdata = array('username' => 'johndoe''email' =>'a@b.it''logged_in' =>TRUE);
    $this->session->set_userdata($newdata);
    redirect('/pannello_utente/''refresh');
    ...
    ... 
    Questo il contenuto di pannello_utente.php (il controller che controlla la sessione):
    Codice PHP:
    ...
    ...
    public function 
    index(){
    var_export($this->session->all_userdata());
    }
    ...
    ... 
    Questo il contenuto di autoload.php
    Codice PHP:
    ...
    $autoload['libraries'] = array('database''session''encrypt');
    ... 
    Grazie per l'aiuto
    Ultima modifica di SalvoDiMa; 04-01-2014 a 23:22

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Hai configurato correttamente CI per usare il database per tenere la sessione creando la tabella nel db ed indicandola nel file di configurazione?
    http://ellislab.com/codeigniter/user.../sessions.html

    la tabella creala così
    codice:
    CREATE TABLE IF NOT EXISTS  `crd_sessions` (
    	session_id		varchar(64)			NOT NULL 	DEFAULT '0',
    	ip_address		varchar(45)			NOT NULL 	DEFAULT '0',
    	user_agent		varchar(255)		NOT NULL,
    	last_activity	int(10) UNSIGNED	NOT NULL	DEFAULT 0,
    	user_data		TEXT				NOT NULL,
    	PRIMARY KEY (session_id),
    	KEY `last_activity_idx` (`last_activity`)
    ) DEFAULT CHARSET=utf8;

  9. #9
    Risolto! Erano giorni che ci perdevo la testa... grazie 1000!
    Sembra proprio che il problema fosse la tabella (il config.php era ok, ma la tabella no).
    Giusto per precisione, la tabella era stata creata con questa query:
    codice:
    CREATE TABLE IF NOT EXISTS `ci_sessions` ( session_id varchar -
    (40) DEFAULT '0' NOT NULL, ip_address varchar(16) DEFAULT ' -
    0' NOT NULL, user_agent varchar(50) NOT NULL, last_activity -
    int(10) unsigned DEFAULT 0 NOT NULL, user_data text NOT  -
    NULL, PRIMARY KEY (session_id) );
    Presa in un documento pdf (una guida in italiano di codeigniter).
    Grazie ancora, si può chiudere [Risolto]

  10. #10
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Il problema era qui

    user_agent varchar(50)

    questo valeva per CI1, CI2 ha bisogno di varchar(120) per tenere tutta la stringa dell'identificativo del browser (io ci ho messo 255 per stare sicuro per il futuro).

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 © 2025 vBulletin Solutions, Inc. All rights reserved.