CSY2028-assignment-2/CSY2028/DatabaseTable.php

76 lines
2.5 KiB
PHP

<?php
namespace CSY2028;
class DatabaseTable {
private $table;
private $pk;
private $entityClass;
private $entityConstructor;
public function __construct($table, $pk = 'id', $entityClass = 'stdclass', $entityConstructor = []) {
$this->table = $table;
$this->pk = $pk;
$this->entityClass = $entityClass;
$this->entityConstructor = $entityConstructor;
}
private function startDB() { //TODO: Maybe move
$server = 'mysql';
$username = 'student';
$password = 'student';
$schema = 'job';
return new \PDO('mysql:dbname='.$schema.';host='.$server, $username, $password);
}
private function insert($record) {
$keys = \array_keys($record);
$columns = \implode(', ', $keys);
$values = \implode(', :', $keys);
$this->startDB()->prepare('INSERT INTO '. $this->table . ' (' . $columns . ') VALUES (:' . $values . ')')->execute($record);
}
private function update($record) {
$params = [];
foreach ($record as $key => $value) {
$params[] = $key . ' = :' .$key;
}
$record['primaryKey'] = $record[$this->pk];
$this->startDB()->prepare('UPDATE '. $this->table .' SET '. \implode(', ', $params) .' WHERE '. $this->pk .' = :primaryKey')->execute($record);
}
public function find($column, $value) {
$values = [
'value' => $value
];
$stmt = $this->startDB()->prepare('SELECT * FROM '. $this->table . ' WHERE '. $column . ' = :value');
$stmt->setFetchMode(\PDO::FETCH_CLASS, $this->entityClass, $this->entityConstructor);
$stmt->execute($values);
return $stmt->fetchAll();
}
public function findAll() {
$stmt = $this->startDB()->prepare('SELECT * FROM ' . $this->table);
$stmt->setFetchMode(\PDO::FETCH_CLASS, $this->entityClass, $this->entityConstructor);
$stmt->execute();
return $stmt->fetchAll();
}
public function delete($column, $value) {
$values = [
'value' => $value
];
startDB()->prepare('DELETE FROM '. $this->$table .' WHERE '. $column .' = :value')->execute($values);
}
public function save($record) {
if (empty($record[$this->pk])) {
unset($record[$this->pk]);
}
try {
$this->insert($record);
}
catch (\Exception $e) {
$this->update($record);
}
}
}
?>