Scripts

PDO-MySQL Database Class

Na het lezen van de duidelijke tut van Blanche over PDO wil ik graag een duit in het zakje doen met een database class, die ik naar mijn beste weten en kunnen op PDO heb gebaseerd. Uiteraard zal er het nodige aan mankeren; ik hoor het dan graag, zodat ik de class kan verbeteren. De rar staat op http://rjm.be/dropzone/class.db.rar Bedankt alvast, Roland

pdomysql-database-class
[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]

Reacties

0
Nog geen reacties.