1
0
Fork 0
This repository has been archived on 2024-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
Accommodation_Management/src/model.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;
}