<?php
class dbmcPDO
{
/**
* PDO Connection object.
* @var object
*/
private $_oPDO;
/**
* Connection details
* @var array
*/
private $_aCD;
/**
* Statement and parameters query stack.
* @var array
*/
private $_aQueryStack = array();
/**
* Results stack.
* @var array
*/
private $_aResultStack = array();
/**
* Flag for transation in use.
* @var boolean
*/
private $_bTransaction = false;
/**
* Flag for commit process is taking place.
* @var boolean
*/
private $_bCommit = false;
/**
* Raises flag to call PDO beginStatement method
* during query.
* @return boolean Always true.
*/
public function beginTransaction()
{
$this->_bTransaction = true;
return true;
}
/**
* Raises flag to operate commit method for stacked transaction queries.
* @return boolean Always true.
*/
public function commit()
{
$this->_bCommit = true;
return $this->query();
}
/**
* Query method to stack if transation or outright execute SQL prepared
* statement.
* @param string $sStatement
* @param string $aParams
* @return mixed False or result array.
*/
public function query($sStatement=null, $aParams=array())
{
$this->_aResultStack = array();
if (is_null($this->_oPDO))
return false;
if($this->_bTransaction && !$this->_bCommit)
{
$this->_aQueryStack[] = array($sStatement, $aParams);
return;
}
try {
$this->_oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if($this->_bTransaction && $this->_bCommit)
{
$this->_oPDO->beginTransaction();
}
else
{
$this->_aQueryStack[] = array($sStatement, $aParams);
}
foreach($this->_aQueryStack as $aQuery)
{
$sStatement = $this->_oPDO->prepare($aQuery[0]);
foreach($aQuery[1] as $k => $v)
{
$sStatement->bindParam(':' . $k, $v[0], $v[1], isset($v[2]) ? $v[2] : null);
}
if($sStatement->execute())
{
$aStmtType = explode(' ', $aQuery[0]);
$sStmtType = $aStmtType[0];
switch(strtoupper($sStmtType))
{
case 'SELECT':
$this->_aResultStack[] = $sStatement->fetchAll(PDO::FETCH_ASSOC);
break;
case 'INSERT':
$this->_aResultStack[] = $this->_oPDO->lastInsertId();
break;
default:
$this->_aResultStack[] = true;
break;
}
}
else
{
$this->_aResultStack[] = false;
}
}
$this->_aQueryStack = array();
if($this->_bTransaction && $this->_bCommit)
{
$this->_oPDO->commit();
}
}
catch(PDOException $e)
{
if($this->_bTransaction && $this->_bCommit)
{
$this->_oPDO->rollback();
}
$this->_aResultStack = array();
echo $e->getMessage();
return false;
}
$this->_bCommit = false;
$this->_bTransaction = false;
return $this->_aResultStack;
}
/**
* Executes connection object.
* @param string $sDB
* @param string $sTable
* @return boolean True on success, false on failure.
*/
public function connect($sDB, $sTable)
{
if (is_null($this->_aCD))
$this->fetchConfig($sDB);
try {
$this->_oPDO = new PDO('mysql:host=' . $this->_aCD['s_address'] . ';dbname=' . $this->_aCD['s_db'], $this->_aCD['s_user'], $this->_aCD['s_pass']);
$this->_aCD = null; // Clear out config, ideal?
return true;
}
catch(PDOException $e)
{
echo $e->getMessage();
return false;
}
}
/**
* Fetch config fetches config file and loads up the appropriate config
* data array for the database being requested.
* @param string $sAlias
* @return boolean True on success, false on failure.
*/
private function fetchConfig($sAlias)
{
if(isset($sAlias))
{
$sAlias = $sAlias."_";
$sFile = 'configs/config.do';
if(file_exists($sFile))
{
require($sFile);
$array = $sAlias ."db_config";
$this->_aCD = ${$array};
return true;
}
else
{
return false;
}
}
else
{
return false;
}
return false;
}
}