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 wil helemaal niet dat dat script zich daar mee bemoeit..
hoe kan ik dat uit zetten?
ik wil helemaal niet dat dat script zich daar mee bemoeit..
hoe kan ik dat uit zetten?


sorry internet viel uit en toen ging hij weer aan..
Jelmer rrrr op 29/05/2010 12:53:10

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']) . '>';
?>


Hoi Jelmer,

Was voor Mitch meer dat zijn code niet juist stond. Ik gebruik zelf in een dergelijke form (met voorgedefinieerde waarde):

<?php echo $_SESSION['POSTC']; ?>

Fouten worden bij mij niet weergegeven ivm $debug=false en mijn errors.php begint met:

<?php exit(); ?>

Daarnaast kun je het errors bestand op een plek plaatsen met de rechten zoals je die zelf wilt hebben.

Is dat niet goed dan?
ik wil niet dat de error bestand over mijn $_POST warders gaat.
ik wil dat hij alleen met mijn sessies mag bemoeien..
Op welke wijze je de errorafhandelingen wilt is een eigen keuze.

Maar ben je al wat wijzer geworden met je melding. Je wilt namelijk een echo geven van iets dat niet bestaat cq waaraan niets is toegekend.

Zie ook Jelmer zijn reactie.
Ik snap de foutmelding.
maar hoe kan ik verzorgen dat hij niet meer dat controleert?
Dan kun je bijv. gebruiken wat Jelmer schrijft:

variabele controleren met isset
of
functie zoals beschreven

Lees het stukje van Jelmer nog eens goed door ;-)

Een andere mogelijkheid is bijv een init bestand includen (met vooraf gedeclareerde standaard waarden) waarin je bijv het volgende hebt staan:

$_SESSION['frmField01'] = "";

Wanneer je een post ontvangt (praat ik even niet over escape-string etc...) en deze post-waarde ($_POST['username']) toekent aan bv. $_SESSION['frmField01'] en wilt de postwaarde nog ergens laten zien o.i.d. dan gebruik je echo $_SESSION['frmField01'] in je "value"-gedeelte

Je krijgt geen foutmelding in het formulier waar nog niets is ingevuld aangezien hier dan immers echo $_SESSION['frmField01'] staat en deze variabele reeds is gedeclareerd.

Ik wil alleen maar aangeven dat er dus verschillende mogelijkheden zijn. Aan jou de keuze.

Mijn keuze is gemaakt.
Ik wil dat deze functie uit gaat..
maar hoe?
Wat ik ook altijd doe is bijv:

<?php
class SessionException extends Exception{}

class Session{

...
}
?>

In je class doe je dan bijv:

<?php

$result = $this->db->query('INSERT INTO..');

if($this->db->affectedRows() == 0){
throw new SessionException('Kan sessie niet schrijven');
}


//en dan op je pagina

try{
$_SESSION['test'] = 1;
}catch(SessionException $e){

//Doe iets met je error.

}
?>
Mitchel V op 30/05/2010 01:17:08

Mijn keuze is gemaakt.
Ik wil dat deze functie uit gaat..
maar hoe?


Waarom wil je een errorhandler uitzetten (zeker bij testen handig, lijkt me).
Wil je dan dat er errors in je scripting blijven? In dit geval is het een fout die je zelf schrijft en de errorhandler doet gewoon zijn werk.

Als je het toch persé wilt kun je de set_error_handler("ErrorLogger"); uitzetten in de handler.inc (of hele functie weggooien). De gebruikelijke errorhandler is dan weer van kracht.

Reageren