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