-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclassMySQL.php
More file actions
381 lines (332 loc) · 7.91 KB
/
classMySQL.php
File metadata and controls
381 lines (332 loc) · 7.91 KB
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
<?php
/**
* @file classMySQL.php
* @brief Datenbanklayer
* @author Hinrich Donner
*
* Dieser Quellcode ist urheberrechtlich geschuetzt. Er kann unter den Lizenzbedingungen der
* GPL oder LGPL verwendet werden.
* 27.03.2017 Update auf mysqli
*/
/**
* @brief Abstrakte Interface-Definition
*/
interface IDatabase
{
/**
* @brief Datenbankverbindung aufbauen
*
* @param string $host IP oder Domain des Servers
* @param string $user Berechtigter Benutzer
* @param string $passwd Kennwort des Benutzers
*/
public function connect($host, $user, $passwd, $name, $port);
/**
* @brief Datenbankverbindung loesen
*/
public function close();
/**
* @brief Datenbank auswaehlen
*
* @param string $name Name der Datenbank
*/
public function select($name);
/**
* @brief Datenbankanweisung ausfuehren
*
* @param string $sql Die Anweisung an die Datenbank
*
* @return mixed
*/
public function execute($sql);
/**
* @brief Datenbankabfrage
*
* @param string $sql Die Anweisung
* @param int $offset Relativer Beginn der Ergebnismenge
* @param int $limit Maximale Anzahl der Zeilen in der Ergebnismenge
*
* @return TDatabaseResultSet
*/
public function query($sql, $offset = 0, $limit = -1);
}
/**
* @brief Basis-Exception für Datenbank-Anfragen
*/
class EDatabase extends Exception
{
}
/**
* @brief Basis-Exception fuer MySQL-Abfragen
*/
class EMySql extends EDatabase
{
/**
* @brief Konstruktor
*/
function __construct($link)
{
$message = sprintf('%04d: %s', mysqli_errno($link), mysqli_error($link));
parent::__construct($message, mysqli_errno($link));
}
}
/**
* @brief Ergebnismenge einer Datenbank-Abfrage
*/
abstract class TDatabaseResultSet implements Iterator
{
/**
* @brief Anzahl der Zeilen in der Ergebnismenge
* @var int
*/
protected $_num_rows = 0;
/**
* @brief Die Ergebnismenge
* @var array
*/
protected $_rows = [];
/**
* @brief Konstruktor
*
* @param resource $resource Datenbank-Resource
*/
abstract function __construct($resource);
public function getCount()
{
return $this->_num_rows;
}
/**
* @brief Das naechste Element (Iterator)
* @return array
*/
public function next()
{
return next($this->_rows);
}
/**
* @brief Das letzte Element
* @return array
*/
public function end()
{
return end($this->_rows);
}
/**
* @brief Der Index des aktuellen Elements (Iterator)
* @return array
*/
public function key()
{
return key($this->_rows);
}
/**
* @brief Das erste Element (Ruecksetzen des Zeigers, Iterator)
* @return array
*/
public function rewind()
{
return reset($this->_rows);
}
/**
* @brief Pruefen des aktuellen Elements (Iterator)
* @return bool
*/
public function valid()
{
return (bool)is_array($this->current());
}
/**
* @brief Das aktuelle Element (Iterator)
* @return array
*/
public function current()
{
return current($this->_rows);
}
}
/**
* @brief Ergebnismenge einer MySQL-Abfrage
*/
class TMySqlResult extends TDatabaseResultSet
{
/**
* @brief Konstruktor
*
* @param resource $resource MySQL-Ergebnis-Resource
*/
function __construct($resource)
{
while ($row = @mysqli_fetch_assoc($resource)) {
$this->_rows[] = $row;
++$this->_num_rows;
}
}
}
/**
* @brief Abstrakte Basis des Datenbank-Layers
*/
abstract class TDatabase implements IDatabase
{
/**
* @brief Name der aktuellen Datenbank
* @var string
*/
protected $database = '';
/**
* @brief Datenbankhandle
* @var resource
*/
protected $resource = false;
/**
* @brief Container mit den ausgefuehrten Anweisungen
* @var array
*/
protected $statements = [];
/**
* @brief Erste Zelle der ersten Zeile einer Abfrage
*
* @param string $sql Die Abfrage
*
* @return mixed Der Wert des Feldes
*/
public function queryOne($sql)
{
$row = $this->queryRow($sql);
return reset($row);
}
/**
* @brief Erste Zeile einer Abfrage ermitteln
*
* @param string $sql Anweisung
* @param int $offset Relativer Offset
*
* @return TDatabaseResultSet
*/
public function queryRow($sql, $offset = 0)
{
$dbr = $this->query($sql, $offset, 1);
return $dbr->current();
}
}
/**
* @brief MySQL-Layer
*/
class TMySql extends TDatabase
{
var $lastRequest;
/**
* @brief Konstruktor
*
* @param string $host IP oder Domain des Servers
* @param string $name Der Name der Daenbank
* @param string $user Berechtigter Benutzer
* @param string $passwd Kennwort des Benutzers
*
* @throws EMySql
*/
public function __construct($host, $name, $user, $passwd, $port)
{
$this->connect($host, $user, $passwd, $name, $port);
// $this->select($name);
$this->database = $name;
}
/**
* @brief Datenbankverbindung aufbauen
*
* @param string $host IP oder Domain des Servers
* @param string $user Berechtigter Benutzer
* @param string $passwd Kennwort des Benutzers
*
* @throws EMySql
*/
public function connect($host, $user, $passwd, $name, $port)
{
$this->close();
if (!$this->resource = mysqli_connect($host, $user, $passwd, $name, $port)) {
throw new EMySql($this->resource);
}
/*
// $__er = error_reporting(E_ERROR);
if (!$this->resource = mysql_connect($host, $user, $passwd)) {
// error_reporting($__er);
throw new EMySql();
}
echo "hallo";
//error_reporting($__er);
*/
}
/**
* @brief Datenbankverbindung loesen
*/
public function close()
{
if (!$this->resource) {
return;
}
mysqli_close($this->resource);
$this->resource = false;
}
/**
* @breif Destruktor
*/
public function __destruct()
{
$this->close();
}
/**
* @brief Datenbank auswaehlen
*
* @param string $name Name der Datenbank
*
* @throws EMySql
*/
public function select($name)
{
if (!mysqli_select_db($this->resource, $name)) throw new EMySql($this->resource);
$this->database = $name;
}
public function real_escape_string($str)
{
return mysqli_real_escape_string($this->resource, $str);
}
/**
* @brief Datenbankabfrage
*
* @param string $sql Die Anweisung
* @param int $offset Relativer Beginn der Ergebnismenge
* @param int $limit Maximale Anzahl der Zeilen in der Ergebnismenge
*
* @return TDatabaseResultSet
* @throws EMySql
*/
public function query($sql, $offset = 0, $limit = -1)
{
$this->lastRequest = $sql;
if ($limit != -1) $sql .= sprintf(' LIMIT %d, %d', $offset, $limit);
return new TMySqlResult($this->execute($sql));
}
/**
* @brief Datenbankanweisung ausfuehren
*
* @param string $sql Die Anweisung an die Datenbank
*
* @return mixed
* @throws EMySql
*/
public function execute($sql)
{
$this->statements[] = $sql;
if (!($result = mysqli_query($this->resource, $sql, MYSQLI_USE_RESULT))) {
throw new EMySql($this->resource);
}
return $result;
}
public function getInsertID()
{
return mysqli_insert_id($this->resource);
}
public function getLastRequest()
{
return $this->lastRequest;
}
}