[code]
<?php

if (!defined('HOST')) {define('HOST', 'localhost');}
if (!defined('USER')) {define('USER', 'user');}
if (!defined('PASS')) {define('PASS', '********');}
if (!defined('BASE')) {define('BASE', 'main');}
if (!defined('PORT')) {define('PORT', 3306);}


/**
 * @package PHPhulp
 * @author Roland van Wanrooy
 * @version 2.0-juli 2008
 * @access public
 */
class dbPDO extends PDO {
	/**
	* @var 	string Hostnaam, naam van de server
	*/
	private $host = '';
	/**
	* @var 	int Poortnummer
	*/
	private $port = 0;
	/**
	* @var 	string Gebruikersnaam
	*/
	private $user = '';
	/**
	* @var 	string Wachtwoord
	*/
	private $pass = '';
	/**
	* @var 	string Naam van de database
	*/
	private $dbase = '';
	/**
	* @var 	string WHERE clausule
	*/
	private $where = '';
	/**
	* @var 	string ORDER clausule
	*/
	private $order = '';
	/**
	* @var 	string LIMIT clausule
	*/
	private $limit = '';
	/**
	* @var 	string SQL statement
	*/
	private $sql = '';
	/**
	* @var 	int Totaal aantal records in de recordset
	*/
	private $totalRecs = 0;
	/**
	* @var 	int ID van het nieuwe record na een INSERT
	*/
	private $insertID = 0;
	/**
	* @var 	int Aantal records dat bij de laatst uitgevoerde query was betrokken
	*/
	private $affectedRecs = 0;
	

	/* ########## [ PUBLIC FUNCTIONS ] ########################################################################### */
	/* ---------------------------------------------------------------------------------- [ CONSTRUCTOR ] -------- */
	/**
	* @desc	Constructor
	* @param string [optioneel] Naam van de database
	*/
	public function __construct($sDb = null) {
		$this->host			= HOST;
		$this->port			= PORT;
		$this->user			= PFIX.USER;
		$this->pass			= PASS;
		$this->dbase		= PFIX.($sDb ? $sDb : BASE);
		$this->_dbConnect();
	}


	/* ------------------------------------------------------------------------- [ DATABASE HANDELINGEN ] -------- */
	/**
	* @desc	Bouwt de querystring op, voert de query uit, vult de overige class variabelen.<br />
	* 		Returnt een array met record-objecten.
	* 
	* <code><?php
	* $oDb = new dbPDO();
	* if ( $oDb->dbSelect('myTable', 'id, firstname, lastname)', 'age > 18' ) ) {
	* 	...
	* }
	* ?></code>
	* 
	* @param string Naam van de tabel
	* @param string [optioneel] Specificatie van de velden. Standaard = '*' (alle velden).
	* @param string [optioneel] Where clausule.
	* @param string [optioneel] Order clausule.
	* @param string [optioneel] Limit clausule.
	* @return array
	*/
	public function dbSelect($sTable, $sFieldSpec = '*', $sWhere = '', $sOrder = '', $sLimit = '') {
		$this->where = $sWhere;
		$this->order = $sOrder;
		$this->limit = $sLimit;

		// begin met de opbouw van de SQL statement string,
		// voeg de WHERE, ORDER en LIMIT clause toe, indien deze zijn gedefinieerd
		$this->sql = sprintf('select %s from %s', $sFieldSpec, $sTable);
		$this->_sqlWhere();
		$this->_sqlOrder();
		$this->_sqlLimit();
		
		// laat de query uitvoeren en return de array met records
		return $this->dbSelectBySQL($this->sql);
	}

	/**
	* @desc	Voert een query uit op basis van de gegeven querystring.<br />
	* 		Returnt een array met record-objecten.
	* 
	* <code><?php
	* $oDb = new dbPDO();
	* if ( $oDb->dbSelectBySQL('
	* 		select k.klantnr, k.naam, f.factuurnr, f.datum, f.bedrag
	* 		from klanten k
	* 		join facturen f on (k.klantnr = f.klantnr)
	* 		where k.aktief = 1
	* 		order by f.datum 
	* 	') ) {
	* 	...
	* }
	* ?></code>
	* 
	* @param string De SQL-querystring.
	* @return array
	*/
	public function dbSelectBySQL($sSQL) {
		try {
			// parameter controle
			if (!($sSQL and is_string($sSQL))) {
				// parameter is leeg/incorrect:  foutboodschap opbouwen en exeption gooien
				$sMsg = sprintf('Geen SQL string in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($sSQL)
					,$sSQL);
				throw new PDOException($sMsg);
			}
			// parameter in orde, class var vullen met parameter.
			$this->sql = $sSQL;
		
			// sluit de querystring netjes af, indien dit nog niet is gebeurd.
			$this->_sqlClose();
			
			// voer de query uit
			$stmt = parent::prepare($this->sql);
			$stmt->execute();
			// array met objecten van records
			$aRet = $stmt->fetchAll(PDO::FETCH_OBJ);
			// totaal aantal records
			$this->totalRecs = count($aRet);
			return $aRet;
		}
		catch(PDOException $e) {
		    $this->_dbError($e);
		}
	}

	/**
	* @desc	Insert een record in de tabel.
	* 
	* <code><?php
	* $oDb = new dbPDO();
	* if ( $iInsertID = $oDb->dbInsert('myTable', array('firstname' => '"John"', 'lastname' => '"Doe"') ) {
	* 	...
	* }
	* ?></code>
	* 
	* @param string Naam van de tabel.
	* @param array Array met veldnamen als key en waarden als values ( array('veldnaam' => waarde) ).
	* @return int
	*/
	public function dbInsert($sTable, $aFieldList) {
		try {
			if (!($sTable and is_string($sTable))) {
				$sMsg = sprintf('Geen tabelnaam in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($sTable)
					,$sTable);
				throw new PDOException($sMsg);
			}
			elseif (!($aFieldList and is_array($aFieldList))) {
				$sMsg = sprintf('Geen fieldlist in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($aFieldList)
					,$aFieldList);
				throw new PDOException($sMsg);
			}
			
			// alle parameters in orde
			$this->sql = sprintf('insert into %s (%s) values (%s)'
				,$sTable
				,implode(',', array_keys($aFieldList))
				,':'.implode(',:', array_keys($aFieldList)));
			
			$stmt = parent::prepare($this->sql);
			$stmt->execute($aFieldList);
			$this->insertID	= parent::lastInsertId();
			return $this->insertID;
		}
		catch(PDOException $e) {
		    $this->_dbError($e);
		}
	}

	/**
	* @desc	Update record(s) van de opgegevens tabel. Returnt het aantal affected records.
	* 
	* <code><?php
	* $oDb = new dbPDO();
	* if ( $iAffectedRecs = $oDb->dbUpdate('myTable', array('betaald' => '1', 'bedrag' => '123.45'), 'id = 123' ) ) {
	* 	...
	* }
	* ?></code>
	* 
	* @param string Naam van de tabel.
	* @param array Array met veldnamen als key en waarden als values ( array('veldnaam' => waarde) ).
	* @param string Where clausule.
	* @return int
	*/
	public function dbUpdate($sTable, $aFieldList, $sWhere) {
		try {
			if (!($sTable and is_string($sTable))) {
				$sMsg = sprintf('Geen tabelnaam in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($sTable)
					,$sTable);
				throw new PDOException($sMsg);
			}
			elseif (!($aFieldList and is_array($aFieldList))) {
				$sMsg = sprintf('Geen fieldlist in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($aFieldList)
					,$aFieldList);
				throw new PDOException($sMsg);
			}
			elseif (!($sWhere and is_string($sWhere))) {
				$sMsg = sprintf('Geen WHERE-clausule in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($sWhere)
					,$sWhere);
				throw new PDOException($sMsg);
			}
			
			// alle parameters in orde
			$this->where = $sWhere;
			$this->sql 	 = sprintf('update %s set ', $sTable);
			foreach ($aFieldList as $sKey => $xVal) {
				$this->sql .= sprintf('%s=\'%s\', ', $sKey, $xVal);
			}
			
			// haal de laatste komma weg uit de sql, voeg de WHERE clausule toe en sluit de sql af met een ;
			$this->_sqlTrim();
			$this->_sqlWhere();
			$this->_sqlClose();
			
			$stmt = parent::prepare($this->sql);
			$stmt->execute();
			$this->affectedRecs	= $stmt->rowCount();
			return $this->affectedRecs;
		}
		catch(PDOException $e) {
		    $this->_dbError($e);
		}
	}
		
	/**
	* @desc	Verwijdert records uit de opgegeven tabel.
	* 
	* <code><?php
	* $oDb = new dbPDO();
	* if ( $iAffectedRecs = $oDb->dbDelete('myTable', 'actief = 0' ) ) {
	*	...
	* }
	* ?></code>
	* 
	* @param string Naam van de tabel.
	* @param string Where clausule.
	* @return int
	*/
	public function dbDelete($sTable, $sWhere) {
		try {
			if (!($sTable and is_string($sTable))) {
				$sMsg = sprintf('Geen tabelnaam in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($sTable)
					,$sTable);
				throw new PDOException($sMsg);
			}
			elseif (!($sWhere and is_string($sWhere))) {
				$sMsg = sprintf('Geen WHERE-clausule in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($sWhere)
					,$sWhere);
				throw new PDOException($sMsg);
			}
			
			// alle parameters in orde
			$this->sql = sprintf('delete from %s where %s;', $sTable, $sWhere);
			
			$stmt = parent::prepare($this->sql);
			$stmt->execute();
			$this->affectedRecs	= $stmt->rowCount();
			return $this->affectedRecs;
		}
		catch(PDOException $e) {
		    $this->_dbError($e);
		}
	}
	
	/**
	* @desc	Voert de query uit met de huidige SQL querystring.
	* 
	* <code><?php
	* $oDb = new dbPDO();
	* if ( $oDb->dbQuery('select * from myTable;') ) {
	* 	...
	* }
	* ?></code>
	* 
	* @return bool
	*/
	public function dbQuery($sSQL) {
		try {
			if (!($sSQL and is_string($sSQL))) {
				// parameter is leeg/incorrect:  foutboodschap opbouwen en exeption gooien
				$sMsg = sprintf('Geen SQL string in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($sSQL)
					,$sSQL);
				throw new PDOException($sMsg);
			}
			
			// parameter in orde, class var vullen met parameter.
			$this->sql = $sSQL;
		
			// sluit de querystring netjes af, indien dit nog niet is gebeurd.
			$this->_sqlClose();
			
			// voer de query uit 
			parent::exec($this->sql);
			return true;
		}
		catch(PDOException $e) {
		    $this->_dbError($e);
		}
	}



	/* ----------------------------------------------------------------------------- [ GET-SET FUNCTIES ] -------- */
	/**
	* @desc	Sluit de verbinding met de huidige database en opent verbinding met de opgegeven database. 
	* 		Geeft de naam van de oude database terug.
	* 
	* <code><?php
	* $oDb = new dbPDO();
	* if ( $oDb->setDB('myDatabase') ) {
	* 	...
	* }
	* ?></code>
	* 
	* @param string Naam van de (nieuwe) database.
	* @return string
	*/
	public function setDB($sDb) {
		try {
			if (!($sDb and is_string($sDb))) {
				// parameter is leeg/incorrect:  foutboodschap opbouwen en exeption gooien
				$sMsg = sprintf('Geen database naam in %s. (param=%s:"%s")'
					,__METHOD__
					,gettype($sDb)
					,$sDb);
				throw new PDOException($sMsg);
			}
			
			// alles in orde.
			$sRet = $this->dbase;
			$this->dbase = $sDb;
			$this->_dbClose();
			$this->_dbConnect();
			return $sRet;
		}
		catch(PDOException $e) {
		    $this->_dbError($e);
		}
	}
	
	/**
	* @desc	Geeft de naam van de huidige database.
	* @return string
	*/
	public function getDB() {
		return $this->dbase;
	}
	
	/**
	* @desc	Geeft de huidige querystring.
	* @return string
	*/
	public function getSQL() {
		return $this->sql;
	}
	
	/**
	* @desc	Geeft het huidige aantal records in de recordset.
	* @return int
	*/
	public function totalRecords() {
		return $this->totalRecs;
	}
	
	/**
	* @desc	Leegt alle belangrijke class-variabelen. Behoudt de verbinding met de database.
	*/
	public function dbFree() {
		$this->sql 			= null;
		$this->totalRecs	= 0;
		$this->affectedRecs	= 0;
	}



	/* ########## [ PRIVATE FUNCTIONS ] ########################################################################## */
	/* --------------------------------------------------------------------------------- [ HULPFUNCTIES ] -------- */
	/**
	* @desc	Maakt een verbinding met de database. Returns TRUE bij succes, anders een foutboodschap.
	* @return bool
	*/
	private function _dbConnect() {
		try {
		    $dsn = sprintf('mysql:host=%s;dbname=%s', $this->host, $this->dbase);
			parent::__construct($dsn, $this->user, $this->pass);
		    parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		}
		catch(PDOException $e) {
		    $this->_dbError($e);
		}
	}

	/**
	* @desc	Voegt de WHERE clausule toe indien deze niet leeg is.
	*/
	private function _sqlWhere() {
		$this->sql .= ($this->where ? ' where ' . $this->where : '');
	}
	/**
	* @desc	Voegt de ORDER clausule toe indien deze niet leeg is.
	*/
	private function _sqlOrder() {
		$this->sql .= ($this->order ? ' order by ' . $this->order : '');
	}
	/**
	* @desc	Voegt de LIMIT clausule toe indien deze niet leeg is.
	*/
	private function _sqlLimit() {
		$this->sql .= ($this->limit ? ' limit '	. $this->limit : '');
	}
	/**
	* @desc	Sluit de querystring af met een semicolon (;).
	*/
	private function _sqlClose() {
		$s = ';';
		if (substr($this->sql, -1) != $s) {
			$this->sql .= $s;
		}
	}
	
	/**
	* @desc	Verwijdert de laatste komma (,) uit de querystring, welke tijdens de opbouw while erin is geplaatst.
	*/
	private function _sqlTrim() {
		$this->sql 	= trim($this->sql);
		$s = ',';
		if (substr($this->sql, -1) == $s){
			$this->sql = substr($this->sql , 0 , strlen($this->sql) - 1);
		} 
	}

	/**
	* @desc	Geeft een foutmelding en stopt de executie van het script.
	* @param object|string Error object of foutboodschap.
	*/
	private function _dbError($e) {
		if (is_object($e)) {
		    $sMsg = sprintf('Regel: <b>%s</b><br />Bestand: <b>%s</b><br />Fout: <b>%s</b>', $e->getLine(), $e->getFile(), $e->getMessage());
		}
		elseif (is_string($e)) {
			$sMsg = $e;
		}
		echo sprintf('<br /><br /><br /><div style="width:50%%;padding:15px;background-color:#FFFF66;border:2px solid red;">%s</div><br /><br />', $sMsg);
		die();
	}
	
} // class end
?>
[/code]