Session

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Junior Outsystems developer

Functie Als junior Outsystems developer wordt jij onderdeel van een multidisciplinair team van 23 software engineers. Ons team werkt agile en termen als Continuous Integration en Continuous Delivery zijn bij ons dagelijkse koek. Wij werken aan uitdagende en afwisselende projecten met als doel onze klanten een totaal oplossing aan te bieden. Als junior Outsystems developer krijg jij bij ons de kans om jezelf te ontwikkelen naar een volwaardige ervaren en gecertificeerde Outsystems developer. Jij een team met ervaren mensen (10+ ervaring) om je heen. Zo heb jij niet het gevoel dat jij meteen in het diepe wordt gegooid en uiteraard

Bekijk vacature »

Front-end developer (Medior/Senior)

Functie Het front-end team bestaat momenteel uit 4 collega’s en is hard aan het groeien! Samen leveren jullie een essentiële bijdrage aan de applicaties die ze voor hun klanten realiseren. Je werkt in het front-end team samen met de back-end teams en product owners om te zorgen dat de applicaties een fijne gebruikerservaring opleveren. Jouw expertise zorgt ervoor dat de juiste keuzes gemaakt worden qua techniek en ontwerp, van back-end tot aan gebruiker. In samenspraak met je team bepalen jullie de beste keuze voor techniek. Ook is er altijd ruimte om nieuwe technieken te ontdekken. Eisen • Je hebt gedegen

Bekijk vacature »

SQL database ontwikkelaar

Functie omschrijving Ben jij niet bang voor complexe algoritmes? Schikt het schrijven van procedures in T-SQL jouw niet af en heb jij al de nodige informatie in SQL, dan is functie precies wat voor jou! Jouw werkzaamheden gaan er als volgt uit zien: Je gaat werken aan de complexere projecten waar jij van A tot Z bij betrokken bent. Je gaat zorg dragen voor het ontwerp, de ontwikkeling en het updaten van SQL databases. Dit doe je op basis van T-SQL. Jij bent van start tot finish betrokken bij de projecten die jij leidt. Je houdt contact met klanten en

Bekijk vacature »

.NET Developer

Dit ga je doen Tot jouw takenpakket behoort onder andere: Webapplicaties ontwerpen, bouwen, testen en implementeren in .NET/C#.; Ontwikkelen, implementeren en beheren van maatwerkapplicaties; Onderhouden en beheren van standaardpakketten; Onderzoeken en beoordelen van nieuwe technieken. Hier ga je werken Als .NET ontwikkelaar kom je te werken bij een grote semioverheidsinstelling in Nijmegen. De organisatie staat garant voor het leveren van onderwijs en les- en onderzoeksmateriaal voor duizenden betrokkenen. De organisatie wil bijdragen aan een gezonde, vrije wereld met gelijke kansen voor iedereen. Binnen de teams hangt een open en collegiale cultuur met veel aandacht voor een prettige en sociale werksfeer.

Bekijk vacature »

Medior/senior front end developer React Sportsoftw

Functie Voor deze functie ben ik op zoek naar een enthousiaste front end developer die communicatief vaardig is. Jij wordt onderdeel van een enthousiast jong team dat werkt aan grote websites. Binnen jouw rol ben jij diegene die de vertaling maakt van design naar functionele code en zorg jij voor goede experience op meerdere platformen. Dit doe je natuurlijk door gebruik te maken van onze stack; Javascript, HTML, CSS en React. Daarnaast wordt er gebruik gemaakt van Webcomponents en verschillende authenticatie tools. Doordat er hier gestreefd wordt naar de beste gebruikerservaringen, wordt het product constant doorontwikkeld. Hierdoor blijven ze voor

Bekijk vacature »

Oracle APEX developer

Wat je gaat doen: Als Oracle APEX ontwikkelaar bij DPA werk je samen met collega’s aan de meest interessante opdrachten. Je zult je ervaring met SQL, PL/SQL, JavaScript, HTML en CSS inzetten om wensen van opdrachtgevers te vertalen naar technische oplossingen. Je werk is heel afwisselend, omdat DPA zich niet beperkt tot een specifieke branche. Zo ben je de ene keer bezig binnen de zorgsector, de andere keer is dit bij de overheid. Wat we vragen: Klinkt goed? Voor deze functie breng je het volgende mee: Je hebt een hbo- of universitaire opleiding afgerond Je hebt 2 tot 5 jaar

Bekijk vacature »

Creatieve Front-end developer gezocht!

Functie Het front-end team bestaat momenteel uit 4 collega’s en is hard aan het groeien! Samen leveren jullie een essentiële bijdrage aan de applicaties die ze voor hun klanten realiseren. Je werkt in het front-end team samen met de back-end teams en product owners om te zorgen dat de applicaties een fijne gebruikerservaring opleveren. Jouw expertise zorgt ervoor dat de juiste keuzes gemaakt worden qua techniek en ontwerp, van back-end tot aan gebruiker. In samenspraak met je team bepalen jullie de beste keuze voor techniek. Ook is er altijd ruimte om nieuwe technieken te ontdekken. Eisen • Je hebt gedegen

Bekijk vacature »

.NET Developer

Functie omschrijving In deze functie ga je werken als C# Developer. Jij gaat aan de slag met de volgende taken: Maatwerk software bouwen; Huidige softwareprojecten verder uitbouwen en optimaliseren; Ideeën van de klant omzetten naar handige oplossingen en tools; Bovenstaande doe je middels de Microsoft- stack: C#, ASP.NET en MVC/ Entity Framework. Ben je net afgestudeerd aan een HBO opleiding Informatica, aarzel dan niet om te solliciteren. Dit is namelijk de ideale startersfunctie! Bedrijfsprofiel Deze organisatie is gevestigd in de regio van Boxtel. Het is van oorsprong een familiebedrijf, die gestart zijn met het bouwen van websites. Dit is door

Bekijk vacature »

Senior Front-end Developer

Sogeti is een organisatie met een goede werksfeer en zo min mogelijk hiërarchische verhoudingen. Ga je bij ons als Senior Front-end Developer aan de slag? Dan werk je dagelijks met collega’s aan de mooiste IT-projecten. Deze snelgroeiende groep collega’s krijgt energie van hun vak en dat merk je op de werkvloer. Onze klantenkring is groot en divers, dat vraagt om flexibiliteit van jou. Tegelijkertijd betekent dit dagelijks nieuwe dingen leren én dat geen werkdag hetzelfde is. Natuurlijk krijg jij de mogelijkheid je te certificeren. We organiseren regelmatig technische Meet-ups en doen we veel aan kennisdeling waarbij iedereen welkom is, zowel

Bekijk vacature »

Junior/medior Back end developer PHP, Laravel

Functie Jij als ontwikkelaar komt te werken in een team bestaande uit 4 back end programmeurs, 2 vormgevers/ Front end developers en een online marketeer. Qua persoonlijkheden is het team erg gevarieerd van sportfanaten tot gameliefhebbers en Golfers. Een ding heeft iedereen hier gemeen; Passie voor goede code. In jouw rol zul je voor veel van je tijd je bezig houden met het ontwikkelen van maatwerk features en applicaties. Daarnaast hebben wij op aanvraag ook wel eens een website of onderhoudsklusje, die opgepakt moet worden en hier ben jij ook niet vies van. Jij als full stack developer zult dus

Bekijk vacature »

UX Writer (m/v/d)

UX Writer (m/v/d) Everything we do, starts with you. Together with you, we build the most human-centric fintech. We have the ambition to create the next. And - with Bertelsmann - a strong foundation to start from. Let’s make it new – for society and for yourself. Wij zijn op zoek naar een UX Writer (m/v/d) Fulltime - Op ons kantoor in Amsterdam of Heerenveen / deels vanuit huis Als UX Writer bij Riverty hou jij je bezig met onze strategie om daar te zijn waar onze gebruikers zijn en op de manier waarop zij ons nodig hebben, terwijl wij

Bekijk vacature »

Front-end React developer

Functie Het frontend team bestaat momenteel uit 4 dedicated front-enders en is hard aan het groeien! Ook werken er diverse designers waar je veel mee schakelt. Samen leveren jullie een essentiële bijdrage aan de applicaties die ze voor hun klanten realiseren, jij bent hierin de schakel tussen de eindgebruiker en de slimme backend. Je werkt in het frontend team samen met de backend teams en product owners om te zorgen dat onze applicaties een fijne gebruikerservaring opleveren. Ze werken o.a. met: React, Atomic design, Styled components, JavaScript / TypeScript, NPM, Webpack Blade templates, HTML, SCSS, Git flow. Eisen • HBO

Bekijk vacature »

Frontend Developer

Dit ga je doen Door ontwikkelen van het online platform Deel uitmaken van verschillende ontwikkelteams Meedenken over UI/UX vraagstukken Uitdragen van Front-end binnen de organisatie Hier ga je werken Deze organisatie, gevestigd in de omgeving van Amsterdam, is een grote onderwijs instelling met meerdere vestigingen en een groot aantal studenten. Zo telt deze organisatie +/- 35.000 gebruikers. Bij deze organisatie staat jouw ontwikkeling centraal en is er veel ruimte voor eigen initiatieven. In samenwerking met jouw team ga jij de online omgeving verder ontwikkelen. In de rol van Front end Developer zal jij 50% van jouw tijd werken in het

Bekijk vacature »

Full-stack developer

Als Full-stack developer bij KUBUS houd je je bezig met het ontwikkelen van de (web)applicatie en services van BIMcollab. Samen met je SCRUM team werk je aan zowel de front- als de back-end. Als softwarebedrijf bevindt KUBUS zich in een unieke positie. We bouwen aan onze eigen producten die wereldwijd door tienduizenden gebruikers worden gebruikt. Ons bedrijf heeft precies de juiste grootte: groot genoeg om echt impact te maken in de markt, maar klein genoeg om als individuele ontwikkelaar invloed uit te kunnen oefenen en echt het verschil te kunnen maken. Ons ontwikkelteam bestaat uit ruim 40 ontwikkelaars, testers, scrum

Bekijk vacature »

C# developer

Sogeti is een organisatie met een goede werksfeer en zo min mogelijk hiërarchische verhoudingen. Ga je bij ons als C# Developer aan de slag? Dan werk je dagelijks met collega’s aan de mooiste IT-projecten. Deze snelgroeiende groep collega’s krijgt energie van hun vak en dat merk je op de werkvloer. Natuurlijk krijg jij de mogelijkheid je te certificeren. We organiseren regelmatig technische Meet-ups en doen we veel aan kennisdeling. Mede hierdoor zij wij dit jaar Microsoft Partner of the Year geworden. Sogetisten staan klaar voor elkaar, hebben lol met elkaar en daarmee behalen we de mooiste resultaten! Werken bij Sogeti

Bekijk vacature »
Lord Gaga

Lord Gaga

24/09/2012 23:18:06
Quote Anchor link
Hallo,

Ik heb vandaag een class geschreven waarin ik het session systeem een beetje heb geprobeerd na te maken. Ik heb het getest en voor zover ik weet werkt het nu, maar ik weet niet of het nu wel veilig genoeg is.

Hierbij de vraag of jullie er eens naar zouden willen kijken en zeggen wat er beter / anders moet. (Ik maak nog niet zo lang gebruik van OOP).

Database:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<< SESSIONS >>
+---------+--------------+-------------+
|   ID    |  sessionID   |     IP      |
+---------+--------------+-------------+
| int(11) | varchar(172) | varchar(32) |
+---------+--------------+-------------+

<< SESSION_VALUES >>
+---------+--------------+--------------+--------------+----------+
|   ID    |  sessionID   |     name     |    value     |  expire  |
+---------+--------------+--------------+--------------+----------+
| int(11) | varchar(172) | varchar(255) | varchar(255) | datetime |
+---------+--------------+--------------+--------------+----------+


Code:
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<?php
// Session
class Session
{    
    // MySQLi
    public $mysqli;
    public $unknown;
    public $IP;

    // Constructor
    public function __construct(mysqli $mysqli)
    {

        $this->mysqli = $mysqli;
        
        $this->unknown['varchar'] = 'Onbekend';
    
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        {

            $this->IP = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }

        else
        {
            $this->IP = $_SERVER['REMOTE_ADDR'];
        }
    }

    
    // Create Session
    public function create($expire = 0)
    {

        $select = 'SELECT ID FROM sessions WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND IP = "' . $this->IP . '" ';
        $query = $this->mysqli->query($select);
        
        if ($query->num_rows == 0)
        {
  
            $sessionID = sha1(time());
            $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
            
            for ($i = 0; $i < 132; $i++)
            {

                $sessionID .= $characters[mt_rand(0, strlen($characters))];
            }

            
            $insert = 'INSERT INTO sessions (sessionID, IP) VALUES ("' . $this->mysqli->real_escape_string($sessionID) . '", "' . $this->mysqli->real_escape_string($this->IP) . '")';
            $this->mysqli->query($insert);
            
            setcookie('sessionID', $sessionID, time() + $expire, '/');
            
            return true;
        }

        else
        {
            return false;
        }
    }

    
    // Destroy All Sessions
    public function destroyAll()
    {

        $select = 'SELECT ID FROM sessions WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND IP = "' . $this->mysqli->real_escape_string($this->IP) . '" ';
        $query = $this->mysqli->query($select);
        
        if ($query->num_rows == 1)
        {

            $delete = 'DELETE FROM sessions WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" ';
            $query = $this->mysqli->query($delete);
            
            $delete = 'DELETE FROM session_values WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" ';
            $query = $this->mysqli->query($delete);
            
            setcookie('sessionID', '', time() - 3600, '/');
            
            return true;
        }

        else
        {
            return false;
        }
    }

    
    // Destroy Session
    public function destroy($name)
    {

        $select = 'SELECT ID FROM sessions WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND IP = "' . $this->mysqli->real_escape_string($this->IP) . '" ';
        $query = $this->mysqli->query($select);
        
        if ($query->num_rows == 1)
        {
            
            $delete = 'DELETE FROM session_values WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND name = "' . $this->mysqli->real_escape_string($name) . '" ';
            $query = $this->mysqli->query($delete);
                        
            return true;
        }

        else
        {
            return false;
        }
    }

        
    // Add Session
    public function add($name = '', $value = '', $expire = 0)
    {

        $select = 'SELECT ID FROM sessions WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND IP = "' . $this->mysqli->real_escape_string($this->IP) . '" ';
        $query = $this->mysqli->query($select);
        
        if ($query->num_rows == 1)
        {

            $select = 'SELECT ID FROM session_values WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND name = "' . $this->mysqli->real_escape_string($name) . '" ';
            $query = $this->mysqli->query($select);
            
            if ($query->num_rows == 0)
            {

                $insert = 'INSERT INTO session_values (sessionID, name, value, expire) VALUES ("' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" , "' . $this->mysqli->real_escape_string($name) . '", "' . $this->mysqli->real_escape_string($value) . '", NOW() + INTERVAL ' . $this->mysqli->real_escape_string($expire) . ' SECOND)';
                $this->mysqli->query($insert);
                
                return true;
            }

            else
            {
                return false;
            }
        }

        else
        {
            return false;
        }
    }

        
    // Get Value
    public function getValue($name = '')
    {

        $select = 'SELECT ID FROM sessions WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND IP = "' . $this->mysqli->real_escape_string($this->IP) . '" ';
        $query = $this->mysqli->query($select);
        
        if ($query->num_rows == 1)
        {

            $select = 'SELECT value FROM session_values WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND name = "' . $this->mysqli->real_escape_string($name) . '" ';
            $query = $this->mysqli->query($select);
            $qSession = $query->fetch_object();
            
            if ($query->num_rows == 1)
            {

                return $qSession->value;
            }

            else
            {
                return $this->unknown['varchar'];
            }
        }

        else
        {
            return $this->unknown['varchar'];
        }
    }

    
    // Get Expire
    public function getExpire($name = '')
    {

        $select = 'SELECT ID FROM sessions WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND IP = "' . $this->mysqli->real_escape_string($this->IP) . '" ';
        $query = $this->mysqli->query($select);
        
        if ($query->num_rows == 1)
        {

            $select = 'SELECT expire FROM session_values WHERE sessionID = "' . $this->mysqli->real_escape_string($_COOKIE['sessionID']) . '" AND name = "' . $this->mysqli->real_escape_string($name) . '" ';
            $query = $this->mysqli->query($select);
            $qSession = $query->fetch_object();
            
            if ($query->num_rows == 1)
            {

                return $qSession->expire;
            }

            else
            {
                return $this->unknown['varchar'];
            }
        }

        else
        {
            return $this->unknown['varchar'];
        }
    }
}


$session = new Session($mysqli);
?>
 
PHP hulp

PHP hulp

10/01/2025 14:36:11
 
Wouter J

Wouter J

26/09/2012 19:30:48
Quote Anchor link
Database
Waarom heb je 2 tabellen? Het is gewoon eigenlijk 1 tabel en die heb je veel te veel genormaliseerd.

Code technisch
Je jezelf af om alle parameters die je maakt optioneel te maken. Alle parameters in deze code zijn niet optioneel, maak ze dat dan ook niet. Wat is bijv. een getExpire() method zonder de naam van de sessie?
Later als je grote OO systemen gaat maken, eventueel met een framework, dan raak je op deze manier helemaal de weg kwijt. Zorg dat je meteen een error krijgt als er iets niet gaat zoals jij dat wilt.

Publieke properties gebruik je bijna nooit. Je wilt in een klasse zelf zoveel mogelijk controle hebben over wat er gebeurd. Met publieke properties heb je dit niet:
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
<?php
class Foo
{
    public $bar;

    public function setBar($bar)
    {

        // stel bar mag maar 10 tekens lang zijn
        if (10 > ($length = strlen($bar))) {
            $this->bar = $bar;
        }
else {
            throw new \InvalidArgumentException(sprintf('Foo::bar has to be less then 10 characters, %s given.', $length));
        }
    }
}


$foo = new Foo();
$foo->setBar('12345678910'); // exception
$foo->bar = '12345678910'; // geen exception
?>

Daar gaat je controlle!

Maak bij voorkeur de properties zelfs private met hun eigen getters/setters, offtopic: Ja, erwin je hebt me eindelijk overtuigd :)
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 Foo
{
    private $bar;

    public function __construct($bar = '')
    {

        $this->setBar($bar); // gebruik altijd de getters/setters, alleen die mogen de propertie gebruiken
    }

    public function setBar($bar)
    {

        // ...
    }

    public function getBar()
    {

        return $this->bar;
    }
}


$foo = new Foo('12345678910'); // exception
$foo = new Foo();
$foo->setBar('12345678910'); // exception
$foo->bar = '12345678910'; // error, bar is private
?>


Object technisch
1 hele simpele vraag: Geef eens van elke klasse en van elke method de omschrijving wat hij doet, plaatst dat hier.
 
Lord Gaga

Lord Gaga

26/09/2012 20:18:25
Quote Anchor link
Dus ik moet de variabelen op private zetten.

En de tabel zou er dan ongeveer zo uit moeten komen te zien?:

ID | IP | hash | name | value | expire

En over getExpire(), ik maak in de functie 'create' zeg maar 1 hoofd-sessie die de koppeling legt naar de gebruiker, en in session_values staan dus eigenlijk alle sessies.

Edit:
Als reactie op je laatste opmerking:

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
<?php
$session
->start(); // Creeërt een random hash, zet die in een cookie, en returned hem
$session->getHash(); // Returned de random hash

$session->create($hash, $name, $value, $expire); // Creeërt een nieuwe sessie

$session->setValue($hash, $name, $value); // Veranderd de waarde van de sessie
$session->setExpire($hash, $name, $expire); // Veranderd de verlooptijd van de sessie

$session->getValue($hash, $name); // Returned de waarde van de sessie
$session->getExpire($hash, $name); // Returned de verlooptijd van de sessie

$session->destroy($hash, $name); // Verwijderd de sessie
$session->destroyAll($hash); // Verwijderd alle sessies
?>


Zou het er dan ongeveer zo uit moeten komen te zien? (Al weet ik niet zeker of je bij het verwijderen van iets beter destroy of delete kunt gebruiken..)
Gewijzigd op 26/09/2012 20:43:30 door Lord Gaga
 
Wouter J

Wouter J

26/09/2012 22:46:22
Quote Anchor link
Je hebt nu opgeschreven wat de method's van de buitenkant zouden moeten doen. Vergelijk dit nu eens met wat er echt gebeurd. Ik neem als voorbeeld de create method: Creëert een sessie en plaatst deze in de database en in een sessie
Nu heb je, als het goed is, geleerd dat in OO geen 1 klasse en geen 1 method 2 verantwoordelijkheden/functies moet hebben. De create method heeft er al 3 (!). Denk eens aan de sessie object: die moet de waarde van een heleboel sessie bewaren; sessie CRUD (create, read, update, delete); database connecties verhandelen; data van een enkele sessie verkrijgen.

Wat je nu moet doen is elke verantwoordelijkheid splitsen in verschillende klassen. De create functie bijv. zou dan een SessionStorage klasse gebruiken voor het opslaan in de sessie, een DatabaseStorage klasse voor de DB en zou zelf in de SessionMapper staan.

Probeer dit nu ook eens te doen voor de verantwoordelijkheden van de Sessie, welke zijn die allemaal en welke klassen krijg je dus allemaal?
 
Lord Gaga

Lord Gaga

26/09/2012 22:55:52
Quote Anchor link
Zoals ik het nu in mijn vorige post heb staan, maakt $session->start() een random hash en zet die in de database + een cookie.

Dus dit zou dan in 2 verschillende functies moeten..? Dat is toch juist veel ingewikkelder? :/

(Ik maak nog niet zolang gebruik van OOP, dus ik snap er nog niet erg veel van..)
 
Wouter J

Wouter J

26/09/2012 23:21:57
Quote Anchor link
Nee, het lijkt veel ingewikkelder. Maar je gebruikt nu de MySQLi extensie. Stel je voor dat je morgen besluit het op te slaan in een bestand of PDO te gaan gebruiken.
Dan moet je met je huidige code 57 regels code veranderen. En dat voor 1 klasse, stel je hebt er meer dan ben je nog even bezig. Maar gebruiken we een goede architectuur dan hoeven we maar 3 dingen te veranderen: Een nieuwe Storage klasse te schrijven (PDODatabaseStorage of FileStorage) en deze in elke klasse in te voegen. Als we het dan nog mooier maken en gebruik maken van DI en service containers hoeven we op slechts 1 plek de klasse te veranderen en alles werkt!

Een voorbeeldje van hoe zo'n goede storage structuur eruit ziet:
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
                                            +---------------+
                                            | <<interface>> |
                                            |    Storage    |
                                            +---------------+
                                            | save($data)   |
                                            | delete($data) |
                                            | update($data) |
                                            | read($data)   |
                                          > +---------------+ <-----
                                         /                          \
                                        /                            \
                    +----------------------+                        +---------------+
                    |      <<abstract>>    |                        |  FileStorage  |
                    |    DatabaseStorage   |                        +---------------+
                    +----------------------+                        | save($data)   |
                    | DatabaseStorage($db) |                        | delete($data) |
                    | save($data)          |                        | update($data) |
                    | delete($data)        |                        | read($data)   |
                    | update($data)        |                        +---------------+
                    | read($data)          |                                ^
                  > +----------------------+                                |
                 /                  ^                               +----------------+
                /                   |                               | XMLFileStorage |
+--------------------------+    +-----------------------------+     +----------------+
|    PDODatabaseStorage    |    |    MysqliDatabaseStorage    |     | save($data)    |
+--------------------------+    +-----------------------------+     | ...            |
| PDODatabaseStorage($pdo) |    | MySQLiDatabaseStorage($pdo) |     +----------------+
| save($data)              |    | save($data)                 |
| ...                      |    | ...                         |
+--------------------------+    +-----------------------------+
 
Lord Gaga

Lord Gaga

27/09/2012 11:51:05
Quote Anchor link
Dus ik moet eerst een class schrijven waarmee ik dingen opsla?
 
Wouter J

Wouter J

27/09/2012 12:19:06
Quote Anchor link
Denk eerst eens na wat je allemaal wilt, ik heb nu iets voorgedaan, maar je hebt nog veel meer in je sessie project.

Schrijf gewoon eens op wat voor verantwoordelijkheden je allemaal hebt (heb er al een aantal gegeven). Geef dan elke verantwoordelijkheid een eigen klasse en geef elke subverantwoordelijkheid zijn eigen method in die klasse. Dat laat je hier zien. Doe dat op zo'n zelfde manier als ik hierboven heb gedaan, maar dan eventueel echt getekend, dit noemen we een UML diagram. Schrijf dus nog geen code en denk niet eens aan PHP

Wil je er iets meer over leren? Dan raad ik je aan mijn serie eens te lezen: wouterj.nl/serie/orienteer-je-in-objecten/
 
Lord Gaga

Lord Gaga

27/09/2012 13:34:50
Quote Anchor link
Ik kom uit op dit:

Afbeelding

In Storage geef je dus aan op welke manier je het wilt opslaan, dat is nu dus MySQLi, en dan maak je daarna dus gebruik van StorageMySQLi om alles op te slaan.

Edit:
Ik heb nog wat rond gezocht op internet, en kwam uit op een tutorial waarin een voorbeeld staat van hoe je nou een class maakt waarbij je meerdere opslag mogelijkheden kon gebruiken, ik heb toen iets geprobeerd en dit is wat ik er van heb gemaakt:

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
97
98
99
<?php
// Storage Interface
interface Storage
{
    public function connect();
    public function error();
    public function errno();
    public function escape($string);
    public function query($query);
    public function fetch_array($result);
    public function fetch_row($result);
    public function fetch_assoc($result);
    public function fetch_object($result);
    public function num_rows($result);
    public function close();
}


// Storage MySQLi
class StorageMySQLi implements Storage
{
    // Variables
    private $link;
    
    // Connect
    public function connect($host = NULL, $username = NULL, $password = NULL, $database = NULL)
    {

        $this->link = mysqli_connect($host, $username, $password, $database);
    }

    
    // Error
    public function error()
    {

        return mysqli_error($this->link);
    }

    
    // Errno
    public function errno()
    {

        return mysqli_errno($this->link);  
    }

    
    // Escape
    public function escape($string = NULL)
    {

        return mysqli_real_escape_string($this->link, $string);  
    }

    
    // Query
    public function query($query = NULL)
    {

        return mysqli_query($this->link, $query);  
    }

    
    // Fetch Array
    public function fetch_array($result = NULL, $type = MYSQL_BOTH)
    {

        return mysqli_fetch_array($result, $type);  
    }

    
    // Fetch Row
    public function fetch_row($result = NULL)
    {

        return mysqli_fetch_row($result);  
    }

    
    // Fetch Assoc
    public function fetch_assoc($result = NULL)
    {

        return mysqli_fetch_assoc($result);
    }

    
    // Fetch Object
    public function fetch_object($result = NULL)
    {

        return mysqli_fetch_object($result);  
    }

    
    // Num Rows
    public function num_rows($result = NULL)
    {

        return mysqli_num_rows($result);
    }

    
    // Close
    public function close()
    {

        return mysqli_close($this->link);
    }
}


$storage = new StorageMySQLi();
$storage->connect('host', 'username', 'password', 'database');

$select = 'SELECT username FROM users';
$result = $storage->query($select);
$qUser = $storage->fetch_object($result);

echo $qUser->username;
?>
Gewijzigd op 27/09/2012 16:06:37 door Lord Gaga
 



Overzicht Reageren

 
 

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.