Session handler
vandaag heb ik mijn eigen session handler geschreven (op basis van een bestaande, op de site te vinden). Een klein detailtje is echter dat hij niet doet wat ik wil dat hij doet. Hij doet namelijk niets, en hij zou de data in de database moeten opslaan.
Zo roep ik de handler op:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
session_set_save_handler('open','close','read', 'write', 'destroy', 'clean');
session_start();
$_SESSION['Do'] = 'Bloe'; //ff testen
//dit onderstaande returnt user, dus dat is juist.
echo ini_get('session.save_handler');
?>
session_set_save_handler('open','close','read', 'write', 'destroy', 'clean');
session_start();
$_SESSION['Do'] = 'Bloe'; //ff testen
//dit onderstaande returnt user, dus dat is juist.
echo ini_get('session.save_handler');
?>
Er komt niet in de database te staan.
Btw session_set_save_handler('open','close','read', 'write', 'destroy', 'clean'); geeft een true terug. en als ik if($_SESSION['Do'] = 'Bloe'){echo 'goed';} doe krijg ik goed op mijn scherm dus dat klopt ook.
Dan nu de handler itself:
Code (php)
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
function open($sPath = '', $sName = '')
{
$sGebruikersnaam = 'root';
$sWachtwoord = '***********';
$sHost = 'Localhost';
$sDb = 'session_handler';
if($iLink = mysql_connect($sHost, $sGebruikersnaam, $sWachtwoord))
{
return mysql_select_db($sDb, $iLink);
}
else
{
return false;
}
}
function close()
{
return mysql_close();
}
function read($iId)
{
$qLeesSession = "SELECT waarde FROM sessions WHERE id = '".mysql_real_escape_string($iId)."';";
$rLeesSession = mysql_query($qLeesSession);
if($rLeesSession)
{
if(mysql_num_rows($rLeesSession) == 1)
{
$aLeesSession = mysql_fetch_row($rLeesSession);
return $aLeesSession[0];
}
else
{
return false;
}
}
else
{
return false;
}
}
function write($iId, $sData)
{
$qSchijfSession = "INSERT INTO sessions (s_id, maak_datum, waarde) VALUES (".mysql_real_escape_string($iId).", NOW(), '".mysql_real_escape_string($sData)."');";
$rSchijfSession = mysql_query($qSchijfSession);
if($rSchijfSession)
{
if(mysql_affected_rows() == 1)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
function destroy($iId)
{
$qVerwijderSession = "DELETE FROM sessions WHERE s_id = ".mysql_real_escape_string($iId).";";
$rVerwijderSession = mysql_query($qVerwijderSession);
if($rVerwijderSession)
{
if(mysql_affected_rows() == 1)
{
return true;
}
else
{
echo mysql_error();
}
}
else
{
echo mysql_error();
}
}
function clean()
{
$qOpschonen = "DELETE FROM sessions WHERE maak_datum < (NOW() - INTERVAL 15 MINUTE);";
return mysql_query($qOpschonen) or die(mysql_error());
}
?>
function open($sPath = '', $sName = '')
{
$sGebruikersnaam = 'root';
$sWachtwoord = '***********';
$sHost = 'Localhost';
$sDb = 'session_handler';
if($iLink = mysql_connect($sHost, $sGebruikersnaam, $sWachtwoord))
{
return mysql_select_db($sDb, $iLink);
}
else
{
return false;
}
}
function close()
{
return mysql_close();
}
function read($iId)
{
$qLeesSession = "SELECT waarde FROM sessions WHERE id = '".mysql_real_escape_string($iId)."';";
$rLeesSession = mysql_query($qLeesSession);
if($rLeesSession)
{
if(mysql_num_rows($rLeesSession) == 1)
{
$aLeesSession = mysql_fetch_row($rLeesSession);
return $aLeesSession[0];
}
else
{
return false;
}
}
else
{
return false;
}
}
function write($iId, $sData)
{
$qSchijfSession = "INSERT INTO sessions (s_id, maak_datum, waarde) VALUES (".mysql_real_escape_string($iId).", NOW(), '".mysql_real_escape_string($sData)."');";
$rSchijfSession = mysql_query($qSchijfSession);
if($rSchijfSession)
{
if(mysql_affected_rows() == 1)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
function destroy($iId)
{
$qVerwijderSession = "DELETE FROM sessions WHERE s_id = ".mysql_real_escape_string($iId).";";
$rVerwijderSession = mysql_query($qVerwijderSession);
if($rVerwijderSession)
{
if(mysql_affected_rows() == 1)
{
return true;
}
else
{
echo mysql_error();
}
}
else
{
echo mysql_error();
}
}
function clean()
{
$qOpschonen = "DELETE FROM sessions WHERE maak_datum < (NOW() - INTERVAL 15 MINUTE);";
return mysql_query($qOpschonen) or die(mysql_error());
}
?>
Totslot nog de database dump:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
CREATE TABLE `sessions` (
`s_id` char(26) NOT NULL,
`maak_datum` datetime NOT NULL,
`waarde` mediumblob NOT NULL,
PRIMARY KEY (`s_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
`s_id` char(26) NOT NULL,
`maak_datum` datetime NOT NULL,
`waarde` mediumblob NOT NULL,
PRIMARY KEY (`s_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Ik krijg geen foutmeldingen..
Wie help mij, alvast bedankt!
Groetjes Freek
Gewijzigd op 01/01/1970 01:00:00 door Citroen Anoniem Graag
Code (php)
1
INSERT INTO sessions (s_id, maak_datum, waarde) VALUES (".mysql_real_escape_string($iId).", NOW(), '".mysql_real_escape_string($sData)."');";
Code (php)
1
INSERT INTO sessions (s_id, maak_datum, waarde) VALUES ('".mysql_real_escape_string($iId)."', NOW(), '".mysql_real_escape_string($sData)."');";
Want het id bestaat ook uit letters, en niet uitsluitend uit cijfers.
Wat ik wel raar vind is dat ik geen error krijg, want hij geef wel zeker een false terug. Ik wil gewoon graag een foutmelding krijgen als het niet lukt....
Hmm krijg idee, ga ff aan de slag met trigger_error() wie weet....
NB. Ik had een ideetje als ik in de database een rij met ip (van de gebruiker) erbij maak, dan sluit ik session hijacking toch uit. Want als je de cookie dan weet te veranderen in een geldig session_id dan match het ip adres ook niet. Dan zou je eventueel ook nog de browser kunnen opslaan. o.i.d. Klopt mijn theorie dat ik session hijacking dan uitsluit??
Graag jullie meningen.
Als je het ip ook opslaat kan alleen de persoon met dat ip de sessie opvragen, klopt dus.
Quote:
Flikker MySQL dan weg, die geeft standaard slechts zelden een foutmelding. MySQL zal zijn uiterste best doen om jouw data naar de klote te helpen en pas wanneer dat niet lukt, geeft MySQL een foutmelding. Waarschijnlijk uit pure frustratie!Wat ik wel raar vind is dat ik geen error krijg, want hij geef wel zeker een false terug. Ik wil gewoon graag een foutmelding krijgen als het niet lukt....
Maar alle gekheid op een stokje, MySQL geeft zelden een foutmelding, dat mag je eerst zelf instellen. Zie deze tutorial.
Het gebruik van een betere database is altijd aan te raden, denk bv. aan PostgreSQL een écht gratis opensource database (i.t.t. MySQL!) en wat mogelijkheiden betreft vergelijkbaar met Oracle.
MySQL geeft keurig een foutmelding als ik de functie mysql_error gebruik. maar ik wil dat php een foutmelding geeft als het schrijven van bv de session niet lukt. Als de functie write dus false retourneerd, wat gebeurt bij een mislukte query, wil ik dat php gaat protesteren.
bumbje
Er zijn natuurlijk vele andere manieren waarop je een foutmelding kunt geven (denk aan trigger_error en het gebruik van exceptions), maar dat is helemaal aan jou. Wellicht dat je deze tutorial over foutafhandeling er even op na wilt slaan...
Quote:
As of PHP 5.0.5 the write and close handlers are called after object destruction and therefore cannot use objects or throw exceptions. The object destructors can however use sessions.
Die oplossing die jij geeft kan ook niet, want ten eerste weet je het id niet (owjah toch wel session_id()) Maar dan wat moet er bij data komen te stan iets als NaamS:|waarde o.i.d
Ik wil gewoon dat als ik dit doe.
$_SESSION['iets'] = 'waarde';
en er gaat een query fout, dat php dan zegt, hé stop eens ff ik kreeg een false terug. Er ging iets mis!