-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCRUD.class.php
419 lines (339 loc) · 10.7 KB
/
CRUD.class.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
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
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
<?php
/**
* CRUD is the create/request/update/delete base class to extend for various
* classes and objects
*
* PHP version 7
*
* ------
* These files are part of the empiresPHPframework;
* The original framework core (specifically the mysql.php
* the router.php and the errorlog) was started by Timo Ewalds,
* and rewritten to use APC and extended by Julian Haagsma,
* for use in Earth Empires (located at http://www.earthempires.com );
* it was spun out for use on other projects.
*
* The general.php contains content from Earth Empires
* written by Dave McVittie and Joe Obbish.
*
* The example website files were written by Julian Haagsma.
*
* @category Core
* @package EmPHyre
* @author Julian Haagsma <jhaagsma@gmail.com>
* @license All files are licensed under the MIT License.
* @link https://github.com/jhaagsma/emPHyre
* @since April 2016
*/
namespace EmPHyre;
abstract class CRUD
{
protected static $db; //the database
protected static $tableName = null;
protected static $primaryKey = 'id';
protected $data;
/**
* GET the primary key
* this from FuelPHP
*
* @return string The name of the primary key column
*/
protected static function primaryKey()
{
return isset(static::$primaryKey) ? static::$primaryKey : 'id';
}//end primaryKey()
/**
* The construct!! takes a primary key
*
* @param integer $primary_key The primary key
*
* @return The object... obviously..?
*/
public function __construct($primary_key = 0)
{
//do nothing, for now
$pk = static::$primaryKey;
$this->$pk = $primary_key;
}//end __construct()
/**
* Set the database...
*
* @param Object $db A MysqlDb object
*
* @return null
*/
public function setDb($db = null)
{
if ($db == null) {
static::$db = Container::getDb();
}
static::$db = $db;
}//end setDb()
/**
* Set the database, simplified version
* (simple version for basic classes)
*
* @return [type] [description]
*/
public static function db()
{
if (!static::$db) {
static::$db = Container::getDb();
}
}//end db()
public function initialize()
{
if (!static::$tableName) {
trigger_error('TABLE NAME NOT SET IN '.get_class($this));
}
$pk = static::$primaryKey;
//changed $info to $this->_data; adopting FuelPHP ideas
$this->_data = static::$db->pquery(
'SELECT `'.static::$tableName.'`.* '.'FROM `'.static::$tableName.'` WHERE `'.static::$primaryKey.'`=?',
$this->$pk
)->fetchRow();
$this->setVars();
}//end initialize()
protected function setVars()
{
if (!isset($this->_data)) {
return;
}
//implements array_to_obj_values from general.php; by Slagpit
foreach ($this->_data as $key => $value) {
$this->$key = $value;
}
}//end setVars()
/**
* Commit the things that have been changed
*
* @return boolean Returns if an update was successful
*/
protected function commit()
{
$update = [];
$pk = static::$primaryKey;
foreach ($this->_data as $key => $value) {
if (!isset($this->$pk) || $key == $this->$pk || $this->$pk != $this->_data[$pk]) {
//never commit a change to the primary key, that would be weird
continue;
}
if (!isset($this->$key)) {
//make sure the key exists
continue;
}
if ($value != $this->$key) {
$update[$key] = $this->$key;
}
}
if (empty($update)) {
return;
}
$call_args = $bits = [];
$call_args[0] = null;
foreach ($update as $key => $value) {
$bits[] = "`$key` = ?";
$call_args[] = $value;
}
$query = "UPDATE `".static::$tableName
."` SET ".implode(", ", $bits)
.' WHERE `'.static::$primaryKey.'`=?';
$call_args[0] = $query;
$call_args[] = $this->$pk;
$updated = static::$db->pqueryArray($call_args)->affectedRows();
if ($updated) {
$this->initialize();
return true;
} else {
return false;
}
}//end commit()
protected static function addByArray($keyValue = [])
{
static::db();
if (empty($keyValue)) {
return;
}
$call_args = $bits = [];
$call_args[0] = null;
foreach ($keyValue as $key => $value) {
$bits[] = "`$key` = ?";
$call_args[] = $value;
}
$query = "INSERT INTO `".static::$tableName."` SET ".implode(", ", $bits);
$call_args[0] = $query;
//return insertid; not sure what to do for insert fail...
return static::$db->pqueryArray($call_args)->insertid();
}//end addByArray()
public static function primaryList($limit = null, $offset = 0, $asc = true)
{
static::db();
$dir = ($asc ? 'ASC' : 'DESC');
return static::$db->pquery(
'SELECT `'.static::$primaryKey.'` FROM `'.static::$tableName.'` ORDER BY `'.static::$primaryKey.'` '.$dir
)->fetchFieldSet();
}//end primaryList()
/**
* This returns primary keys FROM table WHERE $column = $value
*
* @param string $column The column you want to specify a value of
* @param mixed $value The value you want to specify for column
* @param integer $limit The limit; this is not enabled??
* @param integer $offset The offset; this is not implemented??
* @param boolean $asc The sort direction
*
* @return array Primary Keys!!
*/
public static function filterColumn($column, $value, $limit = 0, $offset = 0, $asc = true)
{
static::db();
$dir = ($asc ? 'ASC' : 'DESC');
return static::$db->pquery(
'SELECT `'.static::$primaryKey.'` FROM `'
.static::$tableName.'` WHERE `'.$column.'`=?'
.' ORDER BY `'.static::$primaryKey.'` '.$dir,
$value
)->fetchFieldSet();
}//end filterColumn()
/**
* This returns the primary key FROM table WHERE (UNIQUE!!) $column = $value
* ASSUMES that the column is, in fact, unique
*
* @param string $column The column you want to specify a value of
* @param mixed $value The value you want to specify for column
*
* @return array Primary Key!!
*/
public static function getUniqueId($column, $value)
{
static::db();
return static::$db->pquery(
'SELECT `'.static::$primaryKey.'` FROM `'
.static::$tableName.'` WHERE `'.$column.'`=?',
$value
)->fetchField();
}//end getUniqueId()
public static function filterPKArray($keys, $column, $value, $limit = null, $offset = 0, $asc = true)
{
static::db();
$dir = ($asc ? 'ASC' : 'DESC');
if (empty($keys)) {
return [];
}
return static::$db->pquery(
'SELECT `'.static::$primaryKey
.'` FROM `'.static::$tableName
.'` WHERE `'.static::$primaryKey.'` IN(?) AND `'.$column.'`=?'
.' ORDER BY `'.static::$primaryKey.'` '.$dir,
$keys,
$value
)->fetchFieldSet();
}//end filterPKArray()
public static function primaryListNotDisabled($limit = null, $offset = 0, $asc = true)
{
return static::filterColumn('disabled', 'false');
}//end primaryListNotDisabled()
/**
* Disable the object
* THIS KINDOF ASSUMES THERE'S A "DISABLED" COLUMN
*
* @return boolean If it worked or not
*/
public function disable()
{
$this->disabled = true;
return $this->commit();
}//end disable()
/**
* Enable the object; this probaly won't get used...?
* THIS KINDOF ASSUMES THERE'S A "DISABLED" COLUMN
*
* @return boolean If it worked or not
*/
public function enable()
{
$this->disabled = false;
return $this->commit();
}//end enable()
public static function verifyExists($primary_key)
{
if (!static::$db) {
static::$db = Container::getDb();
}
return static::$db->pquery(
'SELECT `'.static::$primaryKey.'` FROM `'.static::$tableName.'` WHERE `'.static::$primaryKey.'`=?',
$primary_key
)->fetchField();
}//end verifyExists()
protected static function newUUID($check = true, $uuidColumn = 'uuid')
{
static::db();
$uuid = static::$db->newUUID();
while ($check && static::checkUUIDCollision($uuid, $uuidColumn)) {
$uuid = static::$db->newUUID();
}
return $uuid;
}//end newUUID()
protected static function checkUUIDCollision($uuid = null, $uuidColumn = 'uuid')
{
static::db();
$check = static::$db->pquery(
"SELECT `".$uuidColumn."` FROM `".static::$tableName."` WHERE uuid = ?",
$uuid
)->fetchField();
return $check || $uuid === null ? true : false;
}//end checkUUIDCollision()
/**
* Finds all records.
* Modified from FuelPHP
*
* @param array $config array containing query settings
*/
/*
public static function find($config = array())
{
$config = $config + array(
'select' => array(static::$tableName.'.*'),
'where' => array(),
'order_by' => array(),
'limit' => null,
'offset' => 0,
);
extract($config); //this is okay because we know exactly what it has
//this is a clever way of doing this.
is_string($select) && $select = array($select);
$query = 'SELECT ' . implode(',',$select);
$query .= ' FROM ' . static::$tableName;
if (!empty($where)) {
$query .= ' WHERE ';
$first = true;
foreach ($where as $w) {
if (!$first) {
$query .= ' AND ';
}
$query .= '`' . $w[0] '`' . $w[1] . '?';
}
}
}
*/
/**
* A basic display type function
*
* @return integer The (primaryKey) value
*/
public function display()
{
//default return the primary key
return $this->getId();
}//end display()
/**
* A basic display type function
*
* @return integer The (primaryKey) value
*/
public function getId()
{
$pk = static::$primaryKey;
return $this->$pk;
}//end getId()
}//end class