-
Christoph Zysik authoredea519a27
Forked from
Eric Laufer / VMS-SUEE_2.0
89 commits behind, 27 commits ahead of the upstream repository.
database.php 8.63 KiB
<?php
// https://raw.githubusercontent.com/daveismyname/pdo-wrapper/master/database.php
require_once( __DIR__ .'/databaseTable.php' );
class DaveDatabase extends PDO
{
/**
* @var array Array of saved databases for reusing
*/
protected static $instances = array();
/**
* Static method get
*
* @param array $group
* @return \helpers\database
*/
public static function get($group = false)
{
// Determining if exists or it's not empty, then use default group defined in config
$group = !$group ? array (
'type' => DB_TYPE,
'host' => DB_HOST,
'name' => DB_NAME,
'user' => DB_USER,
'pass' => DB_PASS
) : $group;
// Group information
$type = $group['type'];
$host = $group['host'];
$name = $group['name'];
$user = $group['user'];
$pass = $group['pass'];
// ID for database based on the group information
$id = "$type.$host.$name.$user.$pass";
// Checking if the same
if (isset(self::$instances[$id])) {
return self::$instances[$id];
}
$instance = new Database("$type:host=$host;dbname=$name;charset=utf8", $user, $pass);
$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Setting Database into $instances to avoid duplication
self::$instances[$id] = $instance;
//return the pdo instance
return $instance;
}
/**
* run raw sql queries
* @param string $sql sql command
* @return none
*/
public function raw($sql)
{
$this->query($sql);
}
/**
* method for selecting records from a database
* @param string $sql sql query
* @param array $array named params
* @param object $fetchMode
* @param string $class class name
* @return array returns an array of records
*/
public function select($sql, $array = array(), $fetchMode = PDO::FETCH_OBJ, $class = '')
{
// Append select if it isn't appended.
if (strtolower(substr($sql, 0, 7)) !== 'select ') {
$sql = "SELECT " . $sql;
}
$stmt = $this->prepare($sql);
foreach ($array as $key => $value) {
if (is_int($value)) {
$stmt->bindValue("$key", $value, PDO::PARAM_INT);
} else {
$stmt->bindValue("$key", $value);
}
}
$stmt->execute();
if ($fetchMode === PDO::FETCH_CLASS) {
return $stmt->fetchAll($fetchMode, $class);
} else {
return $stmt->fetchAll($fetchMode);
}
}
/**
* Count method
* @param string $table table name
* @param string $column optional
*/
public function count($table, $column= 'id') {
$stmt = $this->prepare("SELECT $column FROM $table");
$stmt->execute();
return $stmt->rowCount();
}
/**
* insert method
* @param string $table table name
* @param array $data array of columns and values
*/
public function insert($table, $data)
{
ksort($data);
$fieldNames = implode(',', array_keys($data));
$fieldValues = ':'.implode(', :', array_keys($data));
$stmt = $this->prepare("INSERT INTO $table ($fieldNames) VALUES ($fieldValues)");
foreach ($data as $key => $value) {
$stmt->bindValue(":$key", $value);
}
$stmt->execute();
return $this->lastInsertId();
}
/**
* update method
* @param string $table table name
* @param array $data array of columns and values
* @param array $where array of columns and values
*/
public function update($table, $data, $where)
{
ksort($data);
$fieldDetails = null;
foreach ($data as $key => $value) {
$fieldDetails .= "$key = :$key,";
}
$fieldDetails = rtrim($fieldDetails, ',');
$whereDetails = null;
$i = 0;
foreach ($where as $key => $value) {
if ($i == 0) {
$whereDetails .= "$key = :$key";
} else {
$whereDetails .= " AND $key = :$key";
}
$i++;
}
$whereDetails = ltrim($whereDetails, ' AND ');
$stmt = $this->prepare("UPDATE $table SET $fieldDetails WHERE $whereDetails");
foreach ($data as $key => $value) {
$stmt->bindValue(":$key", $value);
}
foreach ($where as $key => $value) {
$stmt->bindValue(":$key", $value);
}
$stmt->execute();
return $stmt->rowCount();
}
/**
* Delete method
* @param string $table table name
* @param array $data array of columns and values
* @param array $where array of columns and values
* @param integer $limit limit number of records
*/
public function delete($table, $where, $limit = 1)
{
ksort($where);
$whereDetails = null;
$i = 0;
foreach ($where as $key => $value) {
if ($i == 0) {
$whereDetails .= "$key = :$key";
} else {
$whereDetails .= " AND $key = :$key";
}
$i++;
}
$whereDetails = ltrim($whereDetails, ' AND ');
//if limit is a number use a limit on the query
if (is_numeric($limit)) {
$uselimit = "LIMIT $limit";
}
$stmt = $this->prepare("DELETE FROM $table WHERE $whereDetails $uselimit");
foreach ($where as $key => $value) {
$stmt->bindValue(":$key", $value);
}
$stmt->execute();
return $stmt->rowCount();
}
/**
* truncate table
* @param string $table table name
*/
public function truncate($table)
{
return $this->exec("TRUNCATE TABLE $table");
}
}
class Database extends DaveDatabase
{
private $table_objects = array();
public function getTable( $table_name )
{
if( !isset($this->table_objects[$table_name]) )
{
$this->loadTableObject( $table_name );
}
return ( isset($this->table_objects[$table_name]) ) ? $this->table_objects[$table_name] : false;
}
private function loadTableObject( $table_name )
{
$result = false;
$filepath = __DIR__ .'/database/'.$table_name.'.ext.php';
if( !file_exists( $filepath ) )
{
$this->tryCreateTableDefinition( $table_name );
}
if( file_exists( $filepath ) )
{
require_once( $filepath );
$class_name = 'Table'. $table_name;
if( class_exists( $class_name ) )
{
$this->table_objects[$table_name] = new $class_name();
$result = true;
}
}
return $result;
}
private function tryCreateTableDefinition( $table_name )
{
$table_class = new DatabaseTable($this, $table_name);
$table_class->getColumnMeta();
var_dump($table_class->fields);
var_dump($table_class->field_meta);
var_dump($table_class->primary_key);
}
public function rawInsert( $sql, $data )
{
$stmt = $this->prepare($sql);
foreach ($data as $key => $value) {
$stmt->bindValue("$key", $value);
}
$stmt->execute();
return $this->lastInsertId();
}
public function rawDelete( $sql, $data )
{
$stmt = $this->prepare( $sql );
foreach ($data as $key => $value) {
$stmt->bindValue("$key", $value);
}
$stmt->execute();
return $stmt->rowCount();
}
/*
* $db->select("`username` FROM `members` WHERE `memberID` = :id and `email` = :email", array(':id' => 1, ':email' => 'someone@domain.com'));
* $db->selectAll("members", "WHERE `memberID` = :id and `email` = :email", array(':id' => 1, ':email' => 'someone@domain.com'));
*/
public function selectAll($sql, $array = array(), $fetchMode = PDO::FETCH_OBJ, $class = '')
{
}
/**
* sqlUpdate method
* @param string $sql the query
* @param array $data array of columns and values
*/
public function sqlUpdate($sql, $array = array())
{
$stmt = $this->prepare($sql);
foreach ($array as $key => $value) {
if (is_int($value))
{
$stmt->bindValue("$key", $value, PDO::PARAM_INT);
}
else
{
$stmt->bindValue("$key", $value);
}
}
$stmt->execute();
return $stmt->rowCount();
}
}