Op dit moment ben ik bezig met een webapplicatie die gebruik maakt van 2 databases. In mijn eerdere applicaties heb ik altijd gebruik gemaakt van een Singleton pattern die voor alle database interactie zorgt.
Het grote nadeel hiervan is dat een Singleton pattern geen oplossing bied voor het werken met meerdere databases.
Mijn database class ziet er op dit moment zo uit, het werkt voor mij erg prettig, op deze manier kan ik bijvoorbeeld snel wisselen tussen het updaten en het inserten van data, zonder de data zelf aan te passen, daar zorgt deze class namelijk voor.
Het werkt voor mij erg prettig, ik kan het bijvoorbeeld in classes gebruiken waarmee ik formulieren verwerk (weergeven op het scherm, valideren en het processen naar de database).
Helaas heb ik zelf nooit echt les gehad in OOP en ben ik dus zelf bezig met het leren ervan, vooral door het veel te doen. Ik weet niet of deze methode uberhaupt goed is, of dat er misschien een hele andere manier (of denkwijze) is om dit aan te pakken (zoals een functie in een class die een SQL query teruggeeft).
Zijn er ergens goede naslagwerken die de architectuur van OOP in PHP uitleggen? Dus niet het opbouwen van classes en dergelijke, maar meer de gedachte erachter. Wanneer je bijvoorbeeld een class aanmaakt, wat deze doet, hoe je deze aan elkaar koppelt, etc.
EDIT: Het belangrijkste is dus dat ik bij m'n database class kan in een andere class. Singletons voldoen hieraan, maar dat werkt nu dus niet omdat ik m'n database class meerdere keren wil instantieren
.
Het grote nadeel hiervan is dat een Singleton pattern geen oplossing bied voor het werken met meerdere databases.
Mijn database class ziet er op dit moment zo uit, het werkt voor mij erg prettig, op deze manier kan ik bijvoorbeeld snel wisselen tussen het updaten en het inserten van data, zonder de data zelf aan te passen, daar zorgt deze class namelijk voor.
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
| <?php /* * database class for accessing the database. Uses MySQLi for the connection, can be accessed by a Singleton pattern. * The connection information is also stored here. */ class database { private static $instance; private $db_host = 'localhost'; private $db_name = 'intranet'; private $db_user = 'root'; private $db_pass = ''; private $hash = 'blaat'; public $mysqli; private function __construct(){ $this->mysqli = new mysqli($this->db_host, $this->db_user, $this->db_pass, $this->db_name); if ($this->mysqli->connect_errno) { echo "Failed to connect to MySQL: " . $this->mysqli->connect_error; exit(); } $this->mysqli->autocommit(TRUE); $this->mysqli->query("SET NAMES 'utf8';"); } public static function getInstance(){ if (!isset(self::$instance)) { self::$instance = new database(); } return self::$instance; } /* * Custom functions for easier development */ // Fetch a single row public function fetchSingle($where, $values, $table){ if($result = $this->select($where.' LIMIT 1', $values, $table)){ return $result; } else { return false; } } // Returns the number of affected rows public function numRows($where, $table){ if($this->mysqli->query('SELECT id FROM '.$table.' WHERE '.$where)){ return $this->mysqli->affected_rows; } else { echo $this->mysqli->error; return false; } } // Returns true if there is only 1 row affected, else false public function unique($where, $table){ if($this->numRows($where, $table) == 1){ return true; } else { return false; } } // This function outputs a hashed string used for passwords. public function password($password){ return sha1(sha1($password).$this->hash); } /* * Default SQL functions, they use the same input and output so it's easy to switch between them (inserting / updating). * Remember to use a $db->mysqli->real_escape_string() before using these functions to prevent database insertion. */ public function select($where, $table, $select = array('*'), $orderby = 'id', $limit = false){ // Create a string to be used in the query with all the data $select_string = implode(', ', $select); if(!$limit){ $limitstr = ''; } else { $limitstr = ' LIMIT '.$limit; } //echo 'SELECT '.$select_string.' FROM '.$table.' WHERE '.$where.' ORDER BY '.$orderby.$limitstr.'<br/>'; if($result = $this->mysqli->query('SELECT '.$select_string.' FROM '.$table.' WHERE '.$where.' ORDER BY '.$orderby.$limitstr)){ if($result->num_rows){ while ($row = $result->fetch_assoc()) { $return[] = $row; } return $return; } else { return false; } } else { echo $this->mysqli->error; return false; } } // Returns true on succes, or false on failure. public function update($where, $values, $table){ // Create a string to be used in the query with all the data foreach($values as $key => $value){ $value_array[] = $key.' = "'.$value.'"'; } $value_string = implode(', ', $value_array); if($this->mysqli->query('UPDATE '.$table.' SET '.$value_string.' WHERE '.$where)){ return true; } else { echo $this->mysqli->error; return false; } } public function delete($where, $table){ if($this->mysqli->query('DELETE FROM '.$table.' WHERE '.$where)){ return true; } else { echo $this->mysqli->error; return false; } } public function insert($values = array(), $table){ // Create a value and key string, used in the query foreach($values as $key => $value){ $value_array[] = $value; $key_array[] = $key; } $value_string = implode('", "', $value_array); $key_string = implode("`, `", $key_array); if($this->mysqli->query('INSERT INTO '.$table.' (`'.$key_string.'`, date_created, date_modified) VALUES ("'.$value_string.'", NOW(), NOW())')){ return $this->mysqli->insert_id; } else { echo $this->mysqli->error; return false; } } } |
Het werkt voor mij erg prettig, ik kan het bijvoorbeeld in classes gebruiken waarmee ik formulieren verwerk (weergeven op het scherm, valideren en het processen naar de database).
Helaas heb ik zelf nooit echt les gehad in OOP en ben ik dus zelf bezig met het leren ervan, vooral door het veel te doen. Ik weet niet of deze methode uberhaupt goed is, of dat er misschien een hele andere manier (of denkwijze) is om dit aan te pakken (zoals een functie in een class die een SQL query teruggeeft).
Zijn er ergens goede naslagwerken die de architectuur van OOP in PHP uitleggen? Dus niet het opbouwen van classes en dergelijke, maar meer de gedachte erachter. Wanneer je bijvoorbeeld een class aanmaakt, wat deze doet, hoe je deze aan elkaar koppelt, etc.
EDIT: Het belangrijkste is dus dat ik bij m'n database class kan in een andere class. Singletons voldoen hieraan, maar dat werkt nu dus niet omdat ik m'n database class meerdere keren wil instantieren