Session
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
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 |
+---------+--------------+--------------+--------------+----------+
+---------+--------------+-------------+
| 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)
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
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);
?>
// 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);
?>
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
?>
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)
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
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
?>
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.
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
?>
$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
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?
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..)
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)
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
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) |
| ... | | ... |
+--------------------------+ +-----------------------------+
| <<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) |
| ... | | ... |
+--------------------------+ +-----------------------------+
Dus ik moet eerst een class schrijven waarmee ik dingen opsla?
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/
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)
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
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;
?>
// 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