Versio

Session handler

Overzicht Reageren

Citroen Anoniem Graag

Citroen Anoniem Graag

23/12/2007 23:14:00
Quote Anchor link
Beste mensen,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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');
?>


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)
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
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());
}

?>


Totslot nog de database dump:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;


Ik krijg geen foutmeldingen..

Wie help mij, alvast bedankt!

Groetjes Freek
Gewijzigd op 01/01/1970 01:00:00 door Citroen Anoniem Graag
 
PHP hulp

PHP hulp

25/05/2012 15:37:17
Gesponsorde koppelingen:
 
Citroen Anoniem Graag

Citroen Anoniem Graag

24/12/2007 12:34:00
Quote Anchor link
Ik ben er zelf al uit. De queries gingen fout. Dit :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
INSERT INTO sessions (s_id, maak_datum, waarde) VALUES (".mysql_real_escape_string($iId).", NOW(), '".mysql_real_escape_string($sData)."');";


Code (php)
PHP script in nieuw venster Selecteer het PHP script
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.
 
Jan geen

Jan geen

24/12/2007 12:41:00
Quote Anchor link
Als je het ip ook opslaat kan alleen de persoon met dat ip de sessie opvragen, klopt dus.
 
Frank -

Frank -

24/12/2007 12:45:00
Quote Anchor link
Quote:
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....
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!

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.
 
Citroen Anoniem Graag

Citroen Anoniem Graag

24/12/2007 12:49:00
Quote Anchor link
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.
 
Citroen Anoniem Graag

Citroen Anoniem Graag

25/12/2007 13:50:00
Quote Anchor link
bumbje
 
Joren de Wit
Beheerder

Joren de Wit

25/12/2007 13:58:00
Quote Anchor link
Dat kun je natuurlijk afvangen in je script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if(write($iId, $sData) === false))
{

    echo 'Ik protesteer!';
}

?>

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...
 
Citroen Anoniem Graag

Citroen Anoniem Graag

25/12/2007 16:51:00
Quote Anchor link
Hmm, exceptions gaat niet lukken want php.net zegt:
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!
 
Joren de Wit
Beheerder

Joren de Wit

25/12/2007 18:44:00
 



Overzicht Reageren