Hallo.

ik ben even aan het kijken hoe het zit.
ik volgde deze pagina:

sessie.php
<?php
class SessionManager {
   var $life_time;
   function SessionManager() {
      // Read the maxlifetime setting from PHP
      $this->life_time = get_cfg_var("session.gc_maxlifetime");
      // Register this object as the session handler
      session_set_save_handler( 
        array( &$this, "open" ), 
        array( &$this, "close" ),
        array( &$this, "read" ),
        array( &$this, "write"),
        array( &$this, "destroy"),
        array( &$this, "gc" )
      );
   }
}

function open( $save_path, $session_name ) {
        global $sess_save_path;
        $sess_save_path = $save_path;
        // Don't need to do anything. Just return TRUE.
        return true;
     }

function close() {
        return true;
}

function read( $id ) {
           // Set empty result
           $data = '';
           // Fetch session data from the selected database
           $time = time();
           $newid = mysql_real_escape_string($id);
           $sql = "SELECT `session_data` FROM `sessions` WHERE `session_id` = '$newid' AND `expires` > $time";
           $rs = db_query($sql);                           
           $a = db_num_rows($rs);
           if($a > 0) {
             $row = db_fetch_assoc($rs);
             $data = $row['session_data'];
           }
                       return $data;
}

function write( $id, $data ) {
         // Build query                
         $time = time() + $this->life_time;
         $newid = mysql_real_escape_string($id);
         $newdata = mysql_real_escape_string($data);
         $sql = "REPLACE `sessions` (`session_id`,`session_data`,`expires`) VALUES('$newid', '$newdata', $time)";
         $rs = db_query($sql);
         return TRUE;
}

function destroy( $id ) {
         // Build query
         $newid = mysql_real_escape_string($id);
         $sql = "DELETE FROM `sessions` WHERE `session_id` = '$newid'";
         db_query($sql);
         return TRUE;
}

function gc() {
         // Garbage Collection
         // Build DELETE query.  Delete all records who have passed the expiration time
         $sql = 'DELETE FROM `sessions` WHERE `expires` < UNIX_TIMESTAMP();';
         db_query($sql);
         // Always return TRUE
         return true;
}


?>


Maar hoe maak ik nu een nieuwe sessie aan?
en hoe delete ik weer een sessie?
en hoe update ik een sessie?

bedankt xD
Ik neem aan dat de code in je openingspost de inhoud van session.php is? Zo ja, dan zal je nog ergens "new SessionManager()" aanroepen (ergens voor session_start()) want immers alleen dan wordt session_set_save_handler aangeroepen.
Wellicht kunnen de geleerden zich hier even over buigen: (ben nog niet aan testen toe gekomen- inmiddels al wel ;-))

Op regel43 van het eerste blok staat 'vraagteken' dit is natuurlijk ? (dit even gedaan ivm dat het er dan niet uitziet in deze post door afbreken)

handler.inc.php

<?php
/******************************************\
| Sessionhandler & Errorhandler |
\******************************************/

// ----------------------------------------------------------------------------------
// ****** Start: Functie Errorhandler *****
// ----------------------------------------------------------------------------------

function ErrorLogger($errno, $errstr, $errfile, $errline){
$bestand = "errors.php"; // Bestand waar de errors in komen
$debug = false; //true: laat errors zien, false errors worden gelogd
switch($errno){
case E_ERROR: $errtype="Error"; break;
case E_WARNING: $errtype="Warning"; break;
case E_PARSE: $errtype="Parse Error"; break;
case E_NOTICE: $errtype="Notice"; break;
case E_CORE_ERROR: $errtype="Core Error"; break;
case E_CORE_WARNING: $errtype="Core Warning"; break;
case E_COMPILE_ERROR: $errtype="Compile Error"; break;
case E_COMPILE_WARNING: $errtype="Compile Warning"; break;
case E_USER_ERROR: $errtype="User Error"; break;
case E_USER_WARNING: $errtype="User Warning"; break;
case E_USER_NOTICE: $errtype="User Notice"; break;
case E_STRICT: $errtype="Strict Notice"; break;
case E_RECOVERABLE_ERROR: $errtype="Recoverable Error"; break;
default: $errtype="Unknown error (".$errno.")"; break;
}
$referrer=(isset($_SERVER['HTTP_REFERER']))? $_SERVER['HTTP_REFERER'] : __FILE__ ;

/* De errors worden in het bestand opgeslagen als een array (errors[])
Als je een bestand wil maken dat al je errors toont, dan moet je je log includen
en simpelweg deze array (eerst nog declareren voor je include) aflopen in een lus */

$inhoud = "<?php \n\t".'$i++; $errors[$i]["tijd"]="' . date('d/m/Y - H:i:s') . "\";\n\t";
$inhoud.= '$errors[$i]["type"]="' . $errtype . "\";\n\t";
$inhoud.= '$errors[$i]["bestand"]="' . $errfile . "\";\n\t";
$inhoud.= '$errors[$i]["regel"]="' . $errline . "\";\n\t";
$inhoud.= '$errors[$i]["msg"]="' . $errstr . "\";\n\t";
$inhoud.= '$errors[$i]["ip"]="' . $_SERVER['REMOTE_ADDR'] . "\";\n\t";
$inhoud.= '$errors[$i]["request_uri"]="' . $_SERVER['REQUEST_URI'] . "\";\n\t";
$inhoud.= '$errors[$i]["referer"]="' . $referrer . "\";\n";
$inhoud.= "vraagteken>\n";
//Error loggen:
if($debug){
echo($errtype.": ".$errstr." op regel ".$errline." in ".$errfile."<br />\n");
return true;
}
if (file_put_contents($bestand, $inhoud, FILE_APPEND) === FALSE) {
exit("<h1>ErrorLogger kon error niet loggen !!!</h1>");
}
@header("Location: errors.php") or die("Er is een fout opgetreden bij het laden van de pagina.");
return true;
}

// ----------------------------------------------------------------------------------
// ****** Einde: Functie Errorhandler *****
// ----------------------------------------------------------------------------------

//Errorlogger instellen als errorhandler + timezone instellen naar onze tijd
set_error_handler("ErrorLogger");
date_default_timezone_set("Europe/Brussels");

// ----------------------------------------------------------------------------------
// ****** Start: Custom Sessionhandler *****
// ----------------------------------------------------------------------------------

$mysqli = new mysqli("localhost", "gebruikersnaam", "wachtwoord", "databasenaam");

// sessie.class wordt aangeroepen
require_once("sessie.class.php");

// Maak een nieuw sessie-object
$ses_obj = new Sessie($mysqli);

// Hier veranderen we de manier waarop sessies door php worden behandeld naar onze (mysql) manier
session_set_save_handler (array($ses_obj, 'open'),
array($ses_obj, 'sluit'),
array($ses_obj, 'lees'),
array($ses_obj, 'schrijf'),
array($ses_obj, 'vernietig'),
array($ses_obj, 'vuilnisman'));

// ----------------------------------------------------------------------------------
// ****** Einde: Custom Sessionhandler *****
// ----------------------------------------------------------------------------------

// Het eigenlijk starten van de sessies. Dit moet altijd ONDER session_set_save_handler komen
session_start();
?>

sessie.class.php

<?php
class Sessie{
private $mysqli;
private $tabel;
private $controle;
private $max_leven = 30; // Tijd in minuten dat een sessie houdbaar is

/*Constructor, geef mysqli connectie mee in OOP vorm, mogelijkheid tot tabel naam te veranderen*/
public function __construct(mysqli &$mysqli, $tabel="sessies"){
$this->tabel = $tabel;
$this->mysqli = &$mysqli;
$this->controle = sha1($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT']);
}

/* Sessie wordt hier normaal geopend, in ons geval moet er niets gebeuren */
public function open($pad, $naam){
return true;
}

/* Sessie wordt gesloten, even de vuilnisman laten langskomen om te oude sessies op te halen */
public function sluit(){
$this->vuilnisman(0);
return true;
}

/* inlezen van de sessie */
public function lees($sessie_id){
$sessie_leven = time() - ($this->max_leven * 60);
$sql = "SELECT ses_data FROM " . $this->tabel. " WHERE ses_id = '" . $sessie_id . "' AND ses_controle = '" . $this->controle . "'";
$sql.= " AND ses_tijd > " . $sessie_leven;
if($resultaat = $this->mysqli->query($sql)){
$waarde='';
if($resultaat->num_rows==1){
$waardes = $resultaat->fetch_row();
$waarde = $waardes[0];
}
$resultaat->close();
return $waarde;
}else{
return '';
}
}

/* Sessie waarde wordt veranderd */
public function schrijf($sessie_id, $sessie_data){

$sessie_data=$this->mysqli->real_escape_string($sessie_data);
$sql = "UPDATE " . $this->tabel . " SET ses_tijd='" . time() . "', ses_data='" . $sessie_data . "' ";
$sql.= "WHERE ses_id='" . $sessie_id . "' AND ses_controle = '" . $this->controle . "'";

if($this->mysqli->query($sql)){ // Update query uitvoeren
if ($this->mysqli->affected_rows){ // kijken of eer een rij is veranderd, zo niet de rij aanmaken (sql hieronder)
return true;
}
$sql = "INSERT INTO " . $this->tabel . " (ses_id, ses_tijd, ses_start, ses_data, ses_controle) ";
$sql.= "VALUES ('" . $sessie_id ."', '" . time() . "', '" . time() . "', '" . $sessie_data . "', '" . $this->controle . "')";

if($this->mysqli->query($sql)){
return true; // Rij succesvol aangemaakt
}else{
return false; //Rij niet aangemaakt
}
}else{
return false; //Fout bij eerste query
}
}

/* Functie die aangeroepen wordt bij session_destroy() */
public function vernietig($sessie_id){
$sql = "DELETE FROM " . $this->tabel . " WHERE ses_id = '" . $sessie_id . "'"; // Extra controle uitgelaten, niet echt nodig want je logt uit
if ($resultaat = $this->mysqli->query ($sql)) {
return true;
}else{
return false;
}
}

/* De vuilnisman zorgt er voor dat sessies die al te lang bestaan verwijdert worden */
function vuilnisman($leeftijd){
$sessie_leven = time() - ($this->max_leven * 60);

$sql = "DELETE FROM " . $this->tabel . " WHERE ses_tijd < " . $sessie_leven;

if ($this->mysqli->query($sql)){
return true;
}else{
return false;
}
}

}
?>
Oh raar genoeg doet de sessie het nu wel met de laatste gebruikte:

<?php 
function open_session() 
{ 
    //Global variable to be used within all the functions. 
    global $db; 
     
    //Connect to the database. 
    if($db = mysql_connect('localhost', 'username','password')) 
    { 
        //if succeeded select the database. 
        mysql_select_db('database'); 
        return true; 
    } 
    else 
    { 
        return false; 
    } 
} 

function close_session() 
{ 
    //Global variable to be used within all the functions. 
    global $db; 
     
    //Close the connection to the database server by setting the $db variable to NULL. 
    $db = NULL; 
    return true; 
} 

function read_session($session_id) 
{ 
    //Global variable to be used within all the functions. 
    global $db; 
     
    //Selecting the data from the database where the current session_id equals the one in the database. 
    $query = "SELECT 
                session_data 
          FROM 
                  session 
          WHERE 
                  session_id='".$session_id."' "; 
     
    //check if the query succeedes. 
    if($result = mysql_query($query)) 
    { 
        //If a row meets the requirement list the data and return it. 
        if(mysql_num_rows($result) == 1) 
        { 
            list($data) = mysql_fetch_array($result, MYSQL_NUM); 
            return $data; 
        } 
        else 
        { 
            //If there is no result, send back an empty string. 
            return ''; 
        } 
    } 
    else 
    { 
        //If the query fails, send back an empty string. 
        return ''; 
    }     
} 

function write_session($session_id, $session_data) 
{ 
    //Global variable to be used within all the functions. 
    global $db; 
         
    //Replace the session_data with the new data. 
     
    //* Replace is a SQL function that works as an INSERT/UPDATE. 
    //If there is no row, create a new one, else update the current. 
    $query = " REPLACE INTO 
                            session 
                            ( 
                            session_id, 
                            session_data, 
                            session_garbage 
                            ) 
                            VALUES 
                            ( 
                            '".$session_id."' , 
                            '".$session_data."',  
                            CURRENT_TIMESTAMP)"; 

     
        if(mysql_query($query)) 
        { 
            //if the query succeedes return the affected rows (should allways be 1). 
            return mysql_affected_rows();  
        } 
        else 
        { 
            return false; 
        } 
                         
} 

function destroy_session($session_id) 
{ 
    //Global variable to be used within all the functions. 
    global $db; 
     
    //Delete our session, this function will be called when we use session_destroy(). 
    $query = "DELETE FROM 
                        session 
              WHERE 
                      session_id='".$session_id."'"; 
     
    //If the query succeedes empty the $_SESSION array and return the affected rows. 
    if(mysql_query($query)) 
    { 
        $_SESSION = array(); 
        return mysql_affected_rows(); 
    } 
    else 
    { 
        return false; 
    } 
     
} 

function clean_session($seconds) 
{ 
    //Global variable to be used within all the functions. 
    global $db; 
     
    //Delete items older than the amount of seconds wich is defined in the php.ini file.  
    //Default is after the browser is closed(0 seconds). 
    $query = "DELETE FROM  
                    session 
              WHERE 
                     DATE_ADD(session_garbage, INTERVAL ".$seconds." SECOND) < NOW()"; 
     
    //Return the affected rows when the query succeedes. 
    if(mysql_query($query)) 
    { 
        return mysql_affected_rows(); 
    } 
    else 
    { 
        return false; 
    } 
     
} 


//Set our brand new sessionhandler to be used by PHP. 
session_set_save_handler('open_session','close_session', 'read_session', 'write_session', 'destroy_session', 'clean_session'); 

//Start the session as you would normally do. 
session_start(); 
?>


Maar nu het volgende.
Iemand heeft een sessie aangemaakt.
en ik wil dat die sessie alleen bij die persoon word gelezen, en die persoon mag maar 1 sessie hebben.
En als de sessie verlopen is dan moet de sessie ongeldig zijn...

hoe doe ik dat?
Hoi Mitch,

Ik denk dat het ook beter is om bij Inserts en Updates "mysql_real_escape_string" te gebruiken.

In mijn gebruikte script zorgt de "vuilnisman" voor het verwijderen van de sessie, dus:

- Na sluiten browser -> sessie verlopen
- Opnieuw browser starten -> nieuwe sessie = opnieuw inloggen
- Na "netjes" uitloggen (afh van je logout-script) -> sessie verlopen
- Autocontrole op verlopen sessies wanneer de class Sessie wordt aangeroepen

Ik heb een rar-bestand met de scripts voor sessionhandler, errorhandler, loginscript etc... misschien heb je daar wat aan. Bron komt van e2p-site.
Ok hoe kom ik aan je rar bestand ?:)
Ik heb even op de ep2-site gezocht voor je. Daar staat ook een duidelijk verhaal omtrent hetgeen ik je zojuist hierboven vertelde.Een veilig loginscript maken

Ik hoop dat ook jij er wat aan hebt. Je zult dan vast wel e.e.a. gaan omgooien richting OOP en dus met mysqli gaan werken. Om de bestanden te downloaden moet je daar wel eerst registreren. Ik ben hier nog niet zo lang op het forum en ken hier nog niet alle mogelijkheden, maar eventueel kun je me een PM sturen waar je het wilt ontvangen.

Ik gebruik nu het script wat jij had gezegt maar er gaat iets fout:

<?php 
	$i++; $errors[$i]["tijd"]="29/05/2010 - 02:04:29";
	$errors[$i]["type"]="Notice";
	$errors[$i]["bestand"]="/login.php";
	$errors[$i]["regel"]="117";
	$errors[$i]["msg"]="Undefined index:  username";
	$errors[$i]["ip"]="83.**.**.***";
	$errors[$i]["request_uri"]="/index.php?pagina=login";
	$errors[$i]["referer"]="/index.php?pagina=home";
?>

login.php: regel 117:
<td>Gebruikersnaam:</td><td><input type="text" name="username" value="<?= $_POST['username']?>"></td>


maar wat is er nou fout :S
Heb je de value letterlijk zo staan ?
Dit lijkt me beter:

<?php echo $_POST['username']; ?>
nog steeds:

$errors[$i]["regel"]="117";
	$errors[$i]["msg"]="Undefined index:  username";


regel 117:
<td>Gebruikersnaam:</td><td><input type="text" name="username" value="<?php echo $_POST['username']; ?>"></td>


wat is er dan fout?
Even tussendoor, Wolf Wolf,

Pas je wel op dat die foutafhandeling mij toelaat om PHP code uit te voeren? Ik zou zelf gemakkelijk de HTTP_REFERER header kunnen aanpassen, ervoor zorgen dat er een quote in staat. Vervolgens kan ik m'n eigen PHP code erachter zetten die dan wordt opgeslagen in je errors.php, en als ik dat bestand dan direct (of indirect, omdat je ergens include $_GET... hebt gebruikt) aanroep, wordt mijn code uitgevoerd.

edit: die error is een notice, undefined index. Je kan wel googlen wat dat precies betekent (het is zo'n beetje de meest voorkomende notice) maar het komt erop neer dat de $_POST array niet een item bevat met de index/key/naam 'username'. Met isset($_POST['username']) eerst controleren of dat item wel bestaat alvorens je hem probeert uit te lezen lost het probleem op. Of je gebruikt deze heerlijke korte functie:
<?php
function ifsetor(&$var, $alternative = null) {
return isset($var)
? $var
: $alternative;
}

echo '<input type="text" value="' . ifsetor($_POST['username']) . '>';
?>

Reageren