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