Session

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

C# .NET Ontwikkelaar ASP.NET

Samengevat: Deze werkgever is een inkooporganisatie. Ben jij een ervaren .Net ontwikkelaar? Heb je ervaring met .Net en C#? Vaste baan: C# .NET Developer .Net MBO HBO €3.100 - €4.300 Onze missie is: “Een essentiële bijdrage leveren aan het verlagen van de integrale kostprijs van de aangesloten groothandels, middels het bundelen van inkoopvolume en het creëren van synergie met en tussen de groothandels en leveranciers, met scherpe inkoopprijzen, goede handelscondities en gerichte dienstverlening als resultaat” Zij werken voor MKB klanten. Deze werkgever heeft veel verschillende projecten. Houd jij van afwisseling? Dan zit je bij hun goed! De branche van dit

Bekijk vacature »

Ambitieuze medior developer

Wat je gaat doen: Heb jij al een paar jaar ervaring als developer maar wil jij naar the next level? In ons NextLevelDev Programma helpen wij jou om de volgende stap te zetten: een mooi programma aan trainingen op het gebied van Java, hippe frameworks, Agile/Scrum, OCP-certificering en optioneel: andere JVM-talen als Kotlin en Scala; Cloud (AWS, Azure, GCP) Soc Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun

Bekijk vacature »

SQL developer

Functieomschrijving Voor een erkende werkgever in de omgeving van Tilburg zijn wij op zoek naar een ervaren SQL ontwikkelaar. Hier wordt jij mede verantwoordelijk voor zowel de design en implementatie van SQL-databases als voor het verstaan van de processen van klanten naar het vertalen van deze processen naar IT-oplossingen. Jouw takenpakket komt er als volgt uit te zien: Het ontwerpen en implementeren van databaseschema's: Je bent in staat om een database te ontwerpen en de structuur van tabellen, relaties, indexen en andere objecten te definiëren; Het schrijven van complexe SQL-query's: Je kunt complexe query's schrijven om gegevens uit de database

Bekijk vacature »

Full stack developer

Wat ga je doen als Full stack .NET developer Microsoft 365? Je stelt je op als sparringpartner voor het team en PO over toekomstige functionaliteiten, architectuur en mogelijke nieuwe producten. Je bent mede-verantwoordelijk voor het vertalen en omzetten van een user story in een passend technisch design. Je implementeert functionaliteiten op basis van een technisch design en user story. Je bent mede-verantwoordelijk voor het beheer van Azure DevOps, waaronder het beheer van GIT, Build Pipelines, Release Pipelines en geautomatiseerde testen. Hier herken jij jezelf in Hbo werk- en denkniveau of hoger aangevuld met relevante certificeringen en/of cursussen; Minimaal 3 jaar

Bekijk vacature »

Machine Software Developer

Bij een bedrijf in de machinebouw, regio Roosendaal, zijn we op zoek naar een: Machine Software Developer Waar ga je werken? Onze opdrachtgever is gespecialiseerd in de grondverzetmachines. Al meer dan 50 jaar leveren ze zowel nationaal als internationaal diverse machines. Het is een familiebedrijf met een informele werksfeer. Wat ga je doen? Als Machine Software Developer ben je verantwoordelijk voor: - Je ontwerpt, ontwikkelt en debugt software voor machinebesturingssystemen en complexe landbouwmachines; - Je stelt gebruikersinterfaces op (cabinedisplays); - Op termijn ga je softwareprojecten leiden voor specifieke machines; - Inclusief planning, documentatie en validatie; - Om specificaties te verifiëren

Bekijk vacature »

Junior Front end developer

Functie Jij als developer gaat ons helpen onze producten verder te ontwikkelen en in te zetten in de markt. Op dit moment bestaat ons SaaS product uit 3 componenten die zowel los als in een pakket gekocht kunnen worden. Het gaat hier om een online kaartapplicatie, een workflow tool en een monitoring tool. Momenteel zijn wij 3 jaar geleden gestart met de ontwikkeling. De tech-stack waarmee we werken is voornamelijk Javascript, Vue.js en Python. Daarnaast gebruiken wij FaundaDB als database en werken we veel met GIS applicaties. De uitdaging die we momenteel hebben is dat we momenteel een intern team

Bekijk vacature »

C# .NET Software Ontwikkelaar

Functie omschrijving C# .NET Developer gezocht. Ben jij een full stack developer die op zoek is naar een nieuwe uitdaging binnen een leuk snel groeiend bedrijf? Lees dan snel verder! Wij zijn op zoek naar een Developer met ervaring op het gebied van .NET die een organisatie in de regio Arnhem gaat versterken. Jij gaat je binnen dit bedrijf vooral bezighouden met het verbeteren van de functionaliteiten van hun dataplatform. Samen met andere ontwikkelaars denk je mee in oplossingsrichtingen, architectuur en nieuwe technologieën. Als C# .NET Developer binnen dit bedrijf houd je je niet alleen bezig met het verbeteren van

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

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 »

Lead javascript developer Node.js React

Functie Als fullstack JavaScript developer vind jij het uitdagend om op basis van concrete klantvragen nieuwe functionaliteiten te ontwikkelen. Bij voorkeur worden deze functionaliteiten op een bepaalde manier geprogrammeerd, zodat ze door meerdere klanten te gebruiken zijn. Je hebt dus vaak te maken met abstracte vraagstukken. Om dit te kunnen realiseren sta je nauw in contact met de product owner en/of klant. Je bent niet alleen onderdeel van het development team, maar hebt ook vaak contact met de product-owner en/of klanten om daardoor inzichten te verzamelen die leiden tot productverbeteringen. • Inzichten verzamelen bij de klant en/of product owner •

Bekijk vacature »

Ervaren Magento developer gezocht!

Functie Je komt te werken in een zelfsturend team waarin vertrouwen voorop staat en inbreng en ideeën worden gewaardeerd. Ook staat innovatie centraal. Ze bieden jou de mogelijkheid om jezelf door te ontwikkelen. Denk hierbij aan cursussen en een persoonlijk ontwikkelplan. Je komt terecht in het team van momenteel 4 (ervaren) collega’s en zal meewerken aan de doorontwikkeling en nieuwbouw van de Magento platformen van meerdere opdrachtgevers volgens Agile/Scrum. Denk hierbij aan nieuwe functionaliteiten, UX en koppelingen met verschillende back-end systemen. Als ervaren developer zul je hiernaast ook andere developers assisteren en waar nodig de leiding nemen in het project.

Bekijk vacature »

Java Programmeur

Functie Heb jij altijd al samen willen werken met ervaren java ontwikkelaars dan hebben wij hier de ultieme kans voor jou! Voor een opdrachtgever in omgeving van Naaldwijk zijn wij op zoek naar uitbreiding van het vaste ontwikkel team. Je zult je hier voornamelijk bezig gaan houden met; Wijzigingsverzoeken van klanten uitvoeren, hier wordt je diep in betrokken; Samen met consultants sluit je aan bij gesprekken met klanten, voor alle projecten; Je schakelt veel met consultants, wat is de behoefte van de klant? Hoe kan je hierop integreren?; Het framework moet naar de Cloud gebracht worden, je wordt betrokken bij

Bekijk vacature »

Front-end developer gezocht

Functie Je komt in een team met ambitieuze developers die de passie voor Front-End met jou delen. Samen ga je aan de slag met leuke en leerzame opdrachten. Het team heeft een eigen budget en financiën en zij bepalen zelf hoe dat besteed en investeert wordt. Je gebruikt tools als JavaScript, Node.js, React, Angular, Typescript en Vue.js wanneer je werkt aan de opdrachten. Daarnaast zul je veel leren van je collega’s en gezamenlijk een leuke tijd doorbrengen tijdens activiteiten zoals wintersport, hackatons en conferentiebezoeken. Je krijgt niet alleen de mogelijkheid Front-End te ontwikkelen, maar ook vooral jezelf. Dit kan behaald

Bekijk vacature »

Senior Java Ontwikkelaar

Dit ga je doen Werken aan uiteenlopende interne projecten voor grote (internationale) organisaties; Ontwikkelen van diverse (web)applicaties en platformen met technieken als Java, Azure en ASP.NET; Complexe vraagstukken tackelen met jouw expertise en ervaring; Waar nodig help jij je collega's om samen tot de juiste oplossing te komen. Hier ga je werken Als Java Developer kom je te werken bij een internationale organisatie in regio Amsterdam die zich richt op procesoptimalisatie door middel van zeer complexe IT oplossingen. Dit doen zij op het allerhoogste niveau met vestigingen over heel de wereld en met een groot aantal aansprekende, maatschappelijk betrokken klanten.

Bekijk vacature »

Mendix Developer

For our client in Amsterdam, we are looking for a Senior Mendix Developer. Company description Our client is an IT Consultancy company who’s been active for 10 years now. With their ambitious team, they are working with different clients in order to help them with analyzing their data and giving advice to them, regarding how they can use their data in the smartest ways, or to make sure that their mobile or web applications are working efficiently. As you get a glimpse of various industries, it is guaranteed that no day will be the same. Job description As a Mendix

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

28/11/2024 15:52:23
 
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.