Hi Guys
Few days back I created a PDO class. I would like to share it with you all, perhaps, it may come handy. You find it on PHPClasses too. http://www.phpclasses.org/package/8853-PHP-Database-access-wrapper-based-on-PDO.html
The idea is to abstraction PDO itself. Developers don’t need to know about the implementation if it is either a PDO or simple PHP database interaction code. (To get a better understanding you might want to look into this – http://www.phpclasses.org/package/6535-PHP-Access-different-types-of-SQL-database.html.) Just follow the implementation in the sample class. It might not look like what I have mentioned but in case your team is big it might look true.
The features supported are :
1. SELECT
2. INSERT
3. UPDATE
4. DELETE
5. TRANSACTIONS
Let’s jump into the code.
DBConfig.php
<?php /** * Values for database * * @author Nitesh Apte * @copyright 2014 Nitesh Apte * @version 1.0 * @license GPL Version 3.0 */ /** * Database Connectivity Settings */ define('DBHOST', 'localhost'); define('DBUSER', 'user'); define('DBPASS', 'pass'); define('DBNAME', 'databaseName'); define('DBPORT', 3306); /** * Choose Database */ define('DBTYPE', 'mysql');
abstract.DBConfig.php. This class initializes the values which has to be used.
<?php require 'DBConfig.php'; /** * Initialize configuration of database * * @author Nitesh Apte * @copyright 2014 Nitesh Apte * @version 1.0 * @license GPL Version 3.0 */ abstract class DBConfig { /** * @var Database host * @access protected */ protected $sqlHost; /** * @var Database user * @access protected */ protected $sqlUser; /** * @var Database password * @access protected */ protected $sqlPass; /** * @var Database name * @access protected */ protected $sqlDB; /** * @var Database type * @access protected */ protected $dbType; /** * @var Database port * @access protected */ protected $dbport; /** * Set the configuration values for Database Connectivity * * @param none * @return none */ protected function initializeConfiguration() { $this->dbType = DBTYPE; $this->sqlHost = HOST; $this->sqlUser = USER; $this->sqlPass = PASSWORD; $this->sqlDB = DNAME; $this->dbport = PORT; } } ?>
Interface DBConfigInterface. Might help in case you have plans for DI and IOC.
<?php /** * Interface declaring the methods to implement for database interaction. * * @author Nitesh Apte * @copyright 2014 Nitesh Apte * @version 1.0 * @license GPL Version 3.0 */ interface DBConfigInterface { /** * Get the single instance of class * * @param none * @return Object */ public static function getInstance(); /** * Method for connecting to database * * @param none * @return none */ public function makeConnection(); /** * Execute a sql query * * @param String $query * @return Object */ public function executeSql($query); /** * Begin the transaction * * @param none * @return none */ public function beginTransaction(); /** * Commit the transaction * * @param none * @return none */ public function commitTransaction(); /** * Rolls back the transaction * * @param none * @return none */ public function rollbackTransaction(); /** * Fetch associative array * * @param none * @return none */ public function fetchAssoc(); /** * Fetch enumerated array * * @param none * @return none */ public function fetchArray(); /** * Fetch Object instead of array * * @param none * @return none */ public function fetchObject(); /** * Fetch the number of affected rows * * @param none * @return int number of rows */ public function affectedRows(); /** * Fetch the last inserted id * * @param noe * @return int last row id of table */ public function lastID(); /** * Fetch the ids of last entry * * @param int $size */ public function multipleID($size); /** * Frees the database result * * @param none * @return none */ public function freeResult(); } ?>
And here is the main class of PDO for database interaction
<?php require 'abstract.DBConfig.php'; require 'interface.DBConfigInterface.php'; /** * The main class of PDO for database interaction * * @author Nitesh Apte * @copyright 2014 Nitesh Apte * @version 1.0 * @license GPL Version 3.0 */ final class PDOManager extends DBConfig implements DBConfigInterface, Serializable { /** * Variable holding the PDOManager instance. * * @var PDOManager * @access static */ private static $singleInstance; protected $pdoObject; private $prepareStatement; /** * Create the single instance of class * * @param none * @return Object self::$singleInstance Instance */ public static function getInstance() { if(!(self::$singleInstance instanceof self)) { self::$singleInstance = new self(); } return self::$singleInstance; } /** * */ private function __construct() { parent::initializeConfiguration(); $this->makeConnection(); } /** * Method for connecting to database * * @param none * @return none */ public function makeConnection() { $this->pdoObject = new PDO($this->dbType.":host=".$this->sqlHost.";dbname=".$this->sqlDB.";charset=utf8", $this->sqlUser, $this->sqlPass, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); } /** * Execute a sql query * * @param String $query * @return Object */ public function executeSql($query, $parameter = array()) { $this->prepareStatement = $this->pdoObject->prepare($query); for($i = 0; $i < sizeof($parameter); $i++) { $this->prepareStatement->bindParam(":x".intval($i+1), $parameter[$i]); } $this->prepareStatement->execute(); return $this; } /** * Begin the transaction * * @param none * @return none */ public function beginTransaction() { $this->pdoObject->beginTransaction(); return $this; } /** * Commit the transaction * * @param none * @return none */ public function commitTransaction() { $this->pdoObject->commit(); return $this; } /** * Rolls back the transaction * * @param none * @return none */ public function rollbackTransaction() { $this->pdoObject->rollBack(); return $this; } /** * Fetch associative array * * @param none * @return none */ public function fetchAssoc() { $result = $this->prepareStatement->fetchAll(PDO::FETCH_ASSOC); $this->freeResult(); return $result; } /** * Fetch enumerated array * * @param none * @return none */ public function fetchArray() { $result = $this->prepareStatement->fetchAll(PDO::FETCH_BOTH); $this->freeResult(); return $result; } /** * Fetch Object instead of array * * @param none * @return none */ public function fetchObject() { $result = $this->prepareStatement->fetchAll(PDO::FETCH_OBJ); $this->freeResult(); return $result; } /** * Fetch the number of affected rows * * @param none * @return int number of rows */ public function affectedRows() { return $this->prepareStatement->rowCount(); } /** * Fetch the last inserted id * * @param noe * @return int last row id of table */ public function lastID() { return intval($this->pdoObject->lastInsertId()); } /** * Fetch the ids of last entry * * @param int $size */ public function multipleID($size) { $lastID = intval($this->lastID()); for($i = $lastID;$i < ($lastID + $size);$i++) { $lastIDs[] = $i; } return $lastIDs; } /** * Frees the database result * * @param none * @return none */ public function freeResult() { $this->prepareStatement->closeCursor(); } /** * (non-PHPdoc) * @see Serializable::serialize() */ public function serialize() { throw new Exception("Serialization is not supported."); } /** * (non-PHPdoc) * @see Serializable::unserialize() */ public function unserialize($serialized) { throw new Exception("Serialization is not supported."); } /** * Override clone method to stop cloning of the object * * @throws Exception */ private function __clone() { throw new Exception("Cloning is not supported in singleton class"); } /** * Make connection null and void. Comment the statement if you don't want this. * * @param none * @return none */ public function __destruct() { $this->pdoObject = null; } } ?>
This is how you are going to use this class. class.UserProfile.php
<?php require 'class.PDOManager.php'; /** * Example class illustrating the use of PDOManager. * User profile acivities like login, change details, etc. * * @author Nitesh Apte * @copyright 2014 Nitesh Apte * @version 1.0 * @license GPL Version 3.0 */ class UserProfile { private $dataObject; public function __construct() { $this->dataObject = PDOManager::getInstance(); } /** * SELECT query example. * Method for user login. */ public function _userLogin($_userName, $_userPass) { $sql = "SELECT * FROM user_table, user_access_level_table WHERE user_table.user_uname = :x1 AND user_table.user_passwd = :x2"; $result = $this->dataObject->executeSql($sql, array($_userName, $_userPass))->fetchAssoc(); return $result; } /** * INSERT query example. * Method for user registration */ public function _userRegister($_userName, $_userFname, $_userLname, $_userEmail, $_userPass) { $sql = "INSERT INTO user_table(user_uname, user_fname, user_lname, user_email, user_passwd, user_activation_code, user_join_date) VALUES (:x1, :x2, :x3, :x4, :x5, '".md5(trim($_userEmail))."' , '".date("Y-m-d H:i:s",time())."')"; $result = $this->dataObject->executeSql($sql, array($_userName, $_userFname, $_userLname, $_userEmail))->affectedRows(); return $result; } /** * UPDATE query example. * Method to activate user's account */ public function _userActivate($_activationCode){ $sql = "UPDATE user_table SET user_status='Active' WHERE user_activation_code=:x1 AND user_status='Inactive'"; $result = $this->dataObject->executeSql($sql, array($_activationCode))->affectedRows(); return $result; } /** * DELETE query example. * Method to activate user's account */ public function _deleteUser($_userID){ $sql = "DELETE FROM user_table WHERE user_id=:x1 AND user_status='Inactive'"; $result = $this->dataObject->executeSql($sql, array($_userID))->affectedRows(); return $result; } } ?>
So, that’s it guys. You will find it useful in case working with a large and distributed team where developer don’t need to know if the DB implementation is generic or PDO.
Cheers!
GooD