Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472

    [sessioni alternative] in localhost va bene, da remoto no dà errore Cannot modify...

    Per le sessioni alternative ho questi semplici 4 files che sono poi gli stessi suggeriti nella guida.

    Il file db.inc.php con i parametri di configurazione:
    codice:
    <?php
    $db_host = "sql.xxx.x";
    $db_user = "xxxx";
    $db_password = "yyyy";
    $db_name = "xxxx";
    $session_time = 0; // durata del cookie
    $session_gc_time = 1800; // tempo per l'esecuzione della garbage collection
    ?>
    Il dile db_session_class.php:
    codice:
    <?php
    require('db.inc.php');
    class my_session {
    
       var $my_session_id; // l'id di sessione
       var $session_time; // la durata della sessione
       var $session_gc_time; // il tempo per la garbage collection
    
       //il costruttore della classe, inizializza le variabili
       function my_session($session_time, $session_gc_time) {
          $this->my_session_id = (!isset($_COOKIE['my_session_id']))
              ? md5(uniqid(microtime()))
                  : $_COOKIE['my_session_id'];
          $this->session_time = $session_time;
          $this->session_gc_time = $session_gc_time;
       }
    
       // avvia o aggiorna la sessione
       function my_session_start() {
          $cookie_expire = ($this->session_time > 0) ? (time() + $this->session_time) : 0;
          if(!isset($_COOKIE['my_session_id'])) {
             setcookie('my_session_id', $this->my_session_id, $cookie_expire);
             mysql_query("INSERT INTO my_session VALUES('" . $this->my_session_id . "', '', " . time() . ")");
          } else {
             if($this->session_time > 0)
                setcookie('my_session_id', $this->my_session_id, $cookie_expire);
          }
       }
    
       /*   registra la variabili di sessione
          specificata nel database */
       function my_session_register($name, $value) {
          $_MY_SESSION = array();
          $session_query = mysql_query("SELECT session_vars FROM my_session
          WHERE sessid = '{$this->my_session_id}'");
          if(mysql_num_rows($session_query) > 0) {
             $result = mysql_fetch_array($session_query);
             $_MY_SESSION = unserialize($result['session_vars']);
             $_MY_SESSION[$name] = $value;
             mysql_query("UPDATE my_session SET session_vars = '" . serialize($_MY_SESSION) . "'
             WHERE sessid = '{$this->my_session_id}'");
          } else {
             $_MY_SESSION[$name] = $value;
             mysql_query("UPDATE my_session SET session_vars = '" . serialize($_MY_SESSION) . "'
             WHERE sessid = '{$this->my_session_id}'");
          }
       }
    
       /*   legge e restituisce le variabili di sessione
          (o la singola variabile specificata */
       function my_session_read($key = '') {
          $session_query = mysql_query("SELECT session_vars FROM my_session
          WHERE sessid = '{$this->my_session_id}'");
          if(mysql_num_rows($session_query) > 0) {
             $result = mysql_fetch_array($session_query);
             $session_vars = unserialize($result['session_vars']);
             return (isset($key) && $key) ? $session_vars[$key] : $session_vars;
          }
       }
    
       /*   distrugge la sessione, rimuovendo i relativi
          dati (non cancella il cookie) */
       function my_session_destroy() {
          mysql_query("UPDATE my_session SET session_vars = ''
          WHERE sessid = '{$this->my_session_id}'");
       }
       // procedura di garbage collection
       function my_session_gc() {
          mysql_query("DELETE FROM my_session
          WHERE session_date < " . (time() - $this->session_gc_time));
       }
    
    } // end class
    
    ?>

    Il file start_session.php:
    codice:
    <?php
    
    // inclusione del file che contiene la classe
    require('db_session_class.php');
    
    // connessione a MySql
    mysql_connect($db_host, $db_user, $db_password);
    
    // selezione del Database
    mysql_select_db($db_name);
    
    // Istanziamo l'oggetto
    $my_session = new my_session($session_time, $session_gc_time);
    
    // Avviamo la sessione inviando il cookie al client
    $my_session->my_session_start();
    
    // Richiamiamo la procedura di garbage collection
    $my_session->my_session_gc();
    
    // Registriamo tre variabili di prova
    $my_session->my_session_register('nick', 'nick');
    //$my_session->my_session_register('nome 2', 'valore 2');
    //$my_session->my_session_register('nome 3', 'valore 3');
    //ho commentato per farne passare solo una
    
    // Chiusura connessione
    mysql_close();
    
    ?>
    E il file test_session.php
    codice:
    <?php
    
    // inclusione del file che contiene la classe
    require('db_session_class.php');
    
    // connessione a MySql
    mysql_connect($db_host, $db_user, $db_password);
    
    // selezione del Database
    mysql_select_db($db_name);
    
    // Istanziamo l'oggetto
    $my_session = new my_session($session_time, $session_gc_time);
    
    // Aggiorniamo, se necessario, la sessione "allungando la vita" del cookie
    $my_session->my_session_start();
    
    // Inizializziamo l'array che conterrà i dati della sessione
    $_MY_SESSION_VARS = array();
    
    /* Richiamiamo il metodo che ci restituirà le variabili di sessione, e memorizziamo
    le stesse nell'array $_MY_SESSION_VARS; in alternativa avremmo potuto ottenere il
    valore di una sola variabile, specificandone il nome come argomento del metodo */
    $_MY_SESSION_VARS = $my_session->my_session_read();
    
    /* In questo semplice esempio ci limitiamo a stampare a video,
    formattandole, tutte le variabili di sessione registrate,
    ovviamente possiamo farne l'utilizzo desiderato */
    echo "<pre>\n";
    print_r($_MY_SESSION_VARS);
    echo "</pre>\n";
    
    // Chiusura connessione
    mysql_close();
    
    ?>

    In localhost funziona tutto perfettamente.
    In remoto cambia solo il file db.inc.php relativamente ai parametri di connessione al database. E se provo a lanciare start.session.php mi ritorna questo messaggio di errore:
    Warning: Cannot modify header information - headers already sent by (output started at /home/mhd-01/www.xxxx.x/htdocs/db_session_class.php:77) in /home/mhd-01/www.xxxx.x/htdocs/db_session_class.php on line 22


    Cosa c'è che non va? Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    218
    Prova trattenendo e liberando il buffer:

    Codice PHP:
    // Inizializzo il buffer dell'output

    ob_start();

    // Codice prima dell'Header

    ....

    // Header 

    header("Location:blabla.php");


    // Invio del buffer al client

    ob_end_flush();

    ?> 

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    472
    Ho modificato così il file start_session.php:

    codice:
    <?php
    ob_start();
    // inclusione del file che contiene la classe
    require('db_session_class.php');
    
    // connessione a MySql
    mysql_connect($db_host, $db_user, $db_password);
    
    // selezione del Database
    mysql_select_db($db_name);
    
    // Istanziamo l'oggetto
    $my_session = new my_session($session_time, $session_gc_time);
    
    // Avviamo la sessione inviando il cookie al client
    $my_session->my_session_start();
    
    // Richiamiamo la procedura di garbage collection
    $my_session->my_session_gc();
    
    // Registriamo tre variabili di prova
    $my_session->my_session_register('nick', 'nick');
    $my_session->my_session_register('pw', '1234');
    //$my_session->my_session_register('nome 3', 'valore 3');
    
    // Chiusura connessione
    mysql_close();
    ob_end_flush();
    ?>
    e sembra tutto andare bene! ma non ho ben capito come funziona 'sta cosa... Basta che lo metta qua? O devo metterlo pure a db_session_class , test_session e destroy_session?

    Grazie

  4. #4
    Utente di HTML.it L'avatar di brodik
    Registrato dal
    Jan 2009
    Messaggi
    765
    ad occhio mi sembra che il problema sia nel setcookie()..

    assicurati che non ci siano output prima di setcookie() in quanto i cookie sono inviati tramite l'header che deve precedere qualsiasi output..

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    218
    Lo metti dove ti da problemi

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.