MySQL Sessionhandler

Door Jurgen assaasas, 14 jaar geleden, 3.663x bekeken

Dit is een script waarmee je zelf je sessies kan onderhouden. Wat hier nu he voordeel van is:

1. Het is veiliger, als je een sharedhost gebruikt staan alle bestanden van alle klanten in dezelfde folder (/tmp). Makkelijk dus om dan een sessie over te nemen.

2. De mogelijkheid een sessie terug te kunnen geven aan een gebruiker.

Ook is er de mogelijkheid om te kijken welke gebruikers online zijn door een extra kolom aan te maken en de session tabel uit te lezen.

*Om je script wat te optimaliseren kun je het beste nadat je alle sessies hebt gemaakt/geupdate de functie session_write_close() aanroepen. Deze zorgt er voor dat de sessie wordt opgeslagen en de verbinding met de database gesloten.

Voor extra informatie:
http://www.php.net/session_set_save_handler
http://www.php.net/session_write_close
http://nl.php.net/sessions

Ik sta open voor commentaar en suggesties.

er komt ook een pgSQL versie.

Gesponsorde koppelingen

PHP script bestanden

  1. mysql-sessionhandler

 

Er zijn 16 reacties op 'Mysql sessionhandler'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Lode
Lode
14 jaar geleden
 
0 +1 -0 -1
1) Je kan er beter een class van maken. Dan heb je die globals niet nodig
1a) in je destructor kan je die write_close dan kwijt ook.
1b) en in je constructor de session_set_save_handler() uitvoeren..
2) mysql_real_escape_string(); en/of sprintf(); toepassen
3) database verbinding buiten class/functies initieren.
4) session_regenerate_id(); implementeren.
5) volgens mij gebruik je nog steeds een cookie. dus headers_sent(); gebruiken.
Jurgen assaasas
Jurgen assaasas
14 jaar geleden
 
0 +1 -0 -1
Ik heb al geprobeerd met PDO, maar voor zover ik gelezen hebt slikt session_set_save_handler() geen objecten. En mysql_real_escape string is volgens mij niet nodig aangezien er geen userinput van te pas komt.
Jelmer -
Jelmer -
14 jaar geleden
 
0 +1 -0 -1
Hint voor het gebruik van callbacks in combinatie met objecten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$instance
= new SessionHandler();
session_set_save_handler(
    array($instance, 'open'),
    array($instance, 'close'),
    //...
);
?>


Verder vraag ik mij af of $session_data nooit een enkele quote zal bevatten. Zou dat wel het geval zijn, dan gaat je query mis. En waarom roep je overal die global $db aan, terwijl je die in geen van de functies eigenlijk gebruikt behalve bij open?
Jurgen assaasas
Jurgen assaasas
14 jaar geleden
 
0 +1 -0 -1
De data wordt geserialized in de database gezet, ik dacht dus dat dit nooit een enkele quote kon bevatten. Ik ga er eens een class van schrijven, dan doe ik dat meteen met PDO. Ik had eerst al PDO gebruikt, alleen toen kreeg ik elke keer de melding dat de functie PDO::query niet bestond.
Lode
Lode
14 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
class session{
  
   protected static $instance = NULL;
   protected $database = NULL;

   static public function start($db){
        if(!self::instance instanceof self){
             self::instance = new self($db);
        }
   }

   protected function __construct(database $db){
       $this->database = $db;
       session_set_save_handler(array($this, 'open'), array($this, 'close')); //etc...  
   }
   public function __destruct(){
        session_write_close();
   }

   public function open(){
       $this->database->query();
   }
}


$db = new database(); //class ofzo?
session::start($db);
?>


singleton is hier voor de vwerandering niet gek denk ik...
Jelmer -
Jelmer -
14 jaar geleden
 
0 +1 -0 -1
Helaas, serialized data kan wel degelijk enkele quotes bevatten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo serialize("Hello ' World");
?>

geeft
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
s:13:"Hello ' World";
Arend a
Arend a
14 jaar geleden
 
0 +1 -0 -1
Inhoeverre voegt dit script iets toe tov het al bestaande script?
http://www.phphulp.nl/php/scripts/3/1085/
Lode
Lode
14 jaar geleden
 
0 +1 -0 -1
kan allebei veel beter....
Steff   an
Steff an
14 jaar geleden
 
0 +1 -0 -1
Quote:
kan allebei veel beter....

Wat allemaal al niet meer kan.
Mark Pieper
Mark Pieper
14 jaar geleden
 
0 +1 -0 -1
Lode, wij zijn helaas nog niet allemaal zover gevorderd als jou. Met een opmerking als "kan veel beter" kunnen we weinig. Misschien kan je een voorbeeld geven i.p.v een oneliner?
(lichtelijk ironisch)


14 jaar geleden
 
0 +1 -0 -1
Quote:
Quote:
kan allebei veel beter....
Wat allemaal al niet meer kan.
Koekjes eten tijdens het programmeren.
Koekjes eten tijdens het plaatsen van stompzinnige reacties op een script.

Quote:
1. Het is veiliger, als je een sharedhost gebruikt staan alle bestanden van alle klanten in dezelfde folder (/tmp). Makkelijk dus om dan een sessie over te nemen.
Zo opgelost: session_save_path
Jurgen assaasas
Jurgen assaasas
14 jaar geleden
 
0 +1 -0 -1
Helaas zijn er genoeg mensen die niet bij de PHP.ini kunnen, en dit is volgens mij ook niet mogelijk met ini_set.


14 jaar geleden
 
0 +1 -0 -1
Jurgen het is een PHP functie die je aanroept voordat je session_start() doet.
Jurgen assaasas
Jurgen assaasas
14 jaar geleden
 
0 +1 -0 -1
Ja, lol zie het net sorry ;)
Johnny
Johnny
13 jaar geleden
 
0 +1 -0 -1
Het script werkt bij mij prima, ook het checken of iemand is ingelogd werkt goed. Alleen blijft de database heel lang gevuld met oude session data, wanneer er niet is uitgelogd, maar alleen de browser is gesloten. Dus ook al is iemand allang offline, op mijn site staat ie nog steeds als online. Eigenlijk is mijn vraag: Kun je door een andere sessionhandler voorkomen dat wanneer iemand niet uitlogd en wel de browser sluit niet meer in de sessiondata staat? Of heeft dit met mijn php-instellingen te maken?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Henkie
Henkie
13 jaar geleden
 
0 +1 -0 -1
Quote:
4) session_regenerate_id(); implementeren.
5) volgens mij gebruik je nog steeds een cookie. dus headers_sent(); gebruiken.


Zou je die twee punten voor me uit willen leggen Lode?

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. mysql-sessionhandler

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.