178 lines
No EOL
5.7 KiB
PHP
178 lines
No EOL
5.7 KiB
PHP
<?php
|
|
|
|
class Model {
|
|
|
|
protected static $db = null;
|
|
private static $column;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->initDatabase();
|
|
}
|
|
public static function initDatabase(){
|
|
if(!Model::$db){
|
|
try {
|
|
/*
|
|
* Init connection to the DB
|
|
*/
|
|
Model::$db = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASSWORD);
|
|
Model::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
} catch(Exception $e){
|
|
die($e);
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
* Fetch
|
|
*/
|
|
public static function fetch($filters = []): array
|
|
{
|
|
$query = 'SELECT * FROM ' . get_called_class();
|
|
$args = [];
|
|
$c = 0;
|
|
$output = [];
|
|
$_col = get_called_class()::getColumns();
|
|
forEach($filters as $filter){
|
|
if (is_array($filter) && count($filter) === 3 && array_key_exists($filter[0], $_col) && in_array($filter[1], ['=','<','>','<>','LIKE'])){
|
|
if($c === 0){
|
|
$query .= ' WHERE';
|
|
}else{
|
|
$query .= ' AND';
|
|
}
|
|
$query .= ' ' . $filter[0] . ' ' . $filter[1] . ' ?';
|
|
$args[] = $filter[2];
|
|
}else{
|
|
throw new Exception('Invalid SQL filters');
|
|
}
|
|
$c++;
|
|
}
|
|
$q = Model::$db->prepare($query);
|
|
$q->execute($args);
|
|
$d = $q->fetchAll(PDO::FETCH_ASSOC);
|
|
forEach($d as $row){
|
|
$class=get_called_class();
|
|
$output[] = new $class($row);
|
|
}
|
|
return $output;
|
|
}
|
|
|
|
/*
|
|
* Insert
|
|
*/
|
|
public static function insert($data){
|
|
$query = 'INSERT INTO ' . get_called_class() . ' (';
|
|
$_col = get_called_class()::getColumns();
|
|
$c = 0;
|
|
$args = [];
|
|
if($data !== null){
|
|
forEach($data as $key=>$value){
|
|
if(!key_exists($key, $_col)){
|
|
throw new Exception('Invalid data entry: ' . $key);
|
|
}else{
|
|
$args[] = $value;
|
|
if($c+1 === sizeof($data)){
|
|
$query .= $key . ') VALUES ( ' . join(',',array_fill(0, sizeof($data), '?')) . ' );';
|
|
}else{
|
|
$query .= $key . ', ';
|
|
}
|
|
$c++;
|
|
}
|
|
}
|
|
$q = Model::$db->prepare($query);
|
|
return ($q->execute($args) == true);
|
|
}
|
|
return false;
|
|
}
|
|
/*
|
|
* Update
|
|
*/
|
|
public static function update($data,$filters = []){
|
|
$query = 'UPDATE ' . get_called_class() . ' SET ';
|
|
$_col = get_called_class()::getColumns();
|
|
$c = $z = 0;
|
|
$args = [];
|
|
if($data !== null){
|
|
forEach($data as $key=>$value){
|
|
if(!key_exists($key, $_col)){
|
|
throw new Exception('Invalid data entry: ' . $key);
|
|
}else{
|
|
$args[] = $value;
|
|
if($c+1 === sizeof($data)){
|
|
$query .= $key . ' = ?';
|
|
}else{
|
|
$query .= $key . ' = ?, ';
|
|
}
|
|
$c++;
|
|
}
|
|
}
|
|
forEach($filters as $filter){
|
|
if (is_array($filter) && count($filter) === 3 && array_key_exists($filter[0], $_col) && in_array($filter[1], ['=','<','>','<>','LIKE'])){
|
|
if($z === 0){
|
|
$query .= ' WHERE';
|
|
}else{
|
|
$query .= ' AND';
|
|
}
|
|
$query .= ' ' . $filter[0] . ' ' . $filter[1] . ' ?';
|
|
$args[] = $filter[2];
|
|
}else{
|
|
throw new Exception('Invalid SQL filters');
|
|
}
|
|
$z++;
|
|
}
|
|
$q = Model::$db->prepare($query);
|
|
return ($q->execute($args) == true);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
* DELETE
|
|
*/
|
|
public static function delete($filters = []): bool
|
|
{
|
|
$query = 'DELETE FROM ' . get_called_class();
|
|
$args = [];
|
|
$c = 0;
|
|
$output = [];
|
|
$_col = get_called_class()::getColumns();
|
|
forEach($filters as $filter){
|
|
if (is_array($filter) && count($filter) === 3 && array_key_exists($filter[0], $_col) && in_array($filter[1], ['=','<','>','<>','LIKE'])){
|
|
if($c === 0){
|
|
$query .= ' WHERE';
|
|
}else{
|
|
$query .= ' AND';
|
|
}
|
|
$query .= ' ' . $filter[0] . ' ' . $filter[1] . ' ?';
|
|
$args[] = $filter[2];
|
|
}else{
|
|
throw new Exception('Invalid SQL filters');
|
|
}
|
|
$c++;
|
|
}
|
|
$q = Model::$db->prepare($query);
|
|
return ($q->execute($args) == true);
|
|
}
|
|
|
|
protected function getColumns(): array
|
|
{
|
|
if(!isset(get_called_class()::$column[get_called_class()])) {
|
|
get_called_class()::$column[get_called_class()] = [];
|
|
$q = Model::$db->prepare('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ?');
|
|
$q->execute(array(get_called_class()));
|
|
$d = $q->fetchAll(PDO::FETCH_ASSOC);
|
|
$out = [];
|
|
foreach ($d as $col) {
|
|
$out[$col['COLUMN_NAME']] = $col;
|
|
}
|
|
get_called_class()::$column[get_called_class()] = $out;
|
|
}
|
|
return get_called_class()::$column[get_called_class()];
|
|
}
|
|
}
|
|
/*
|
|
* Load our models
|
|
*/
|
|
foreach (glob(MODELS_PATH . '/*.php') as $filename)
|
|
{
|
|
require_once $filename;
|
|
} |