Guest User

pdo wrapper

a guest
Jun 14th, 2014
368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.41 KB | None | 0 0
  1. <?php
  2.  
  3. /** Class to handle database connection
  4.  */
  5. class db{
  6.  
  7.     # @object, The PDO object
  8.    private $pdo;
  9.  
  10.     # @object, PDO statement object
  11.    private $sQuery;
  12.  
  13.     # @array, The database settings
  14.    private $settings;
  15.  
  16.     # @bool , Connected to the database
  17.    private $bConnected = false;
  18.  
  19.     # @object, Object for logging exceptions        
  20.    private $log;
  21.  
  22.     # @array, The parameters of the SQL query
  23.    private $parameters;
  24.  
  25.     /**
  26.      * Default Constructor
  27.      *
  28.      *        1. Instantiate Log class.
  29.      *        2. Connect to database.
  30.      *        3. Creates the parameter array.
  31.      */
  32.     public function __construct(){
  33.  
  34.     /** Fetch a logger, it will inherit settings from the root logger
  35.     */
  36.     $this->log = Logger::getLogger('myLogger');
  37.     /** connect to the database **/
  38.         $this->Connect();
  39.         $this->parameters = array();
  40.     }
  41.        
  42.     /**
  43.      *        This method makes connection to the database.
  44.      *        
  45.      *        1. Reads the database settings from a ini file.
  46.      *        2. Puts the ini content into the settings array.
  47.      *        3. Tries to connect to the database.
  48.      *        4. If connection failed, exception is displayed and a log file gets created.
  49.      */
  50.     private function Connect(){
  51.         $this->settings = parse_ini_file("settings.ini.php");
  52.         $dsn = $this->settings["driver"].':dbname='.$this->settings["database"].';host='.$this->settings["hostname"].';charset=utf8';
  53.         try{
  54.             # Read settings from INI file
  55.            $this->pdo = new PDO($dsn, $this->settings["username"], $this->settings["password"]);
  56.  
  57.             # We can now log any exceptions on Fatal error.
  58.            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  59.  
  60.             # Disable emulation of prepared statements, use REAL prepared statements instead.
  61.            $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  62.  
  63.             # Connection succeeded, set the boolean to true.
  64.            $this->bConnected = true;
  65.         }
  66.         catch (PDOException $e){
  67.             # Write into log
  68.            $this->ExceptionLog($e->getMessage());
  69.             die();
  70.         }
  71.     }
  72.     /**
  73.     *
  74.     * Like the constructor, we make __clone private
  75.     * so nobody can clone the instance
  76.     *
  77.     */
  78.     private function __clone(){
  79.     }
  80.  
  81.     /**
  82.      *        Every method which needs to execute a SQL query uses this method.
  83.      *        
  84.      *        1. If not connected, connect to the database.
  85.      *        2. Prepare Query.
  86.      *        3. Parameterize Query.
  87.      *        4. Execute Query.        
  88.      *        5. On exception : Write Exception into the log + SQL query.
  89.      *        6. Reset the Parameters.
  90.      */        
  91.     private function Init($query,$parameters = ""){
  92.         # Connect to database
  93.         if(!$this->bConnected) { $this->Connect(); }
  94.         try {
  95.             # Prepare query
  96.            $this->sQuery = $this->pdo->prepare($query);
  97.                                
  98.             # Add parameters to the parameter array
  99.            $this->bindMore($parameters);
  100.  
  101.             # Bind parameters
  102.            if(!empty($this->parameters)) {
  103.                 foreach($this->parameters as $param){
  104.                     $parameters = explode("\x7F",$param);
  105.                     $this->sQuery->bindParam($parameters[0],$parameters[1]);
  106.                 }                
  107.             }
  108.  
  109.             # Execute SQL
  110.            $this->succes = $this->sQuery->execute();
  111.         }
  112.         catch(PDOException $e){
  113.             # Write into log and display Exception
  114.            /** @var  $errorTime Time of the error */
  115.             $errorTime = date('Y-m-d H:i:s');
  116.             echo $this->ExceptionLog($errorTime.' - '.$e->getMessage(), $query, $parameters );
  117.             // echo $this->showSQL($query,$parameters);
  118.             die();
  119.         }
  120.  
  121.         # Reset the parameters
  122.        $this->parameters = array();
  123.     }
  124.                
  125.     /**
  126.      *        @void
  127.      *
  128.      *        Add the parameter to the parameter array
  129.      *        @param string $para
  130.      *        @param string $value
  131.      */        
  132.     public function bind($para, $value){        
  133.         $this->parameters[sizeof($this->parameters)] = ":" . $para . "\x7F" . $value;
  134.     }
  135.     /**
  136.      *        @void
  137.      *        
  138.      *        Add more parameters to the parameter array
  139.      *        @param array $parray
  140.      */        
  141.     public function bindMore($parray){
  142.         if(empty($this->parameters) && is_array($parray)) {
  143.             $columns = array_keys($parray);
  144.             foreach($columns as $i => &$column){
  145.                 $this->bind($column, $parray[$column]);
  146.             }
  147.         }
  148.     }
  149.     /**
  150.      *        If the SQL query contains a SELECT statement it returns an array containing all of the result set row
  151.      *        If the SQL statement is a DELETE, INSERT, or UPDATE statement it returns the number of affected rows
  152.      *
  153.      *        @param string $query
  154.      *        @param array $params
  155.      *        @param int $fetchmode
  156.      *        @return mixed
  157.      */                        
  158.     public function query($query,$params = null,$fetchmode = PDO::FETCH_ASSOC){
  159.         $query = trim($query);
  160.  
  161.         $this->Init($query,$params);
  162.  
  163.         if (stripos($query, 'select') === 0){
  164.             return $this->sQuery->fetchAll($fetchmode);
  165.         }
  166.         elseif (stripos($query, 'insert') === 0 || stripos($query, 'update') === 0 || stripos($query, 'delete') === 0) {
  167.             return $this->sQuery->rowCount();        
  168.         }        
  169.         else {
  170.             return NULL;
  171.         }
  172.     }
  173.                
  174.     /**
  175.      *      Returns the last inserted id.
  176.      *      @return string
  177.      */        
  178.     public function lastInsertId() {
  179.         return $this->pdo->lastInsertId();
  180.     }        
  181.                
  182.     /**
  183.      *        Returns an array which represents a column from the result set
  184.      *
  185.      *        @param string $query
  186.      *        @param array $params
  187.      *        @return array
  188.      */        
  189.     public function column($query,$params = null)
  190.     {
  191.         $this->Init($query,$params);
  192.         $Columns = $this->sQuery->fetchAll(PDO::FETCH_NUM);                
  193.                      
  194.         $column = null;
  195.         foreach($Columns as $cells){
  196.             $column[] = $cells[0];
  197.         }
  198.  
  199.         return $column;
  200.                        
  201.     }        
  202.     /**
  203.      *        Returns an array which represents a row from the result set
  204.      *
  205.      *        @param string $query
  206.      *        @param array $params
  207.      *         @param int $fetchmode
  208.      *        @return array
  209.      */        
  210.     public function row($query,$params = null,$fetchmode = PDO::FETCH_ASSOC){                                
  211.         $this->Init($query,$params);
  212.         return $this->sQuery->fetch($fetchmode);                        
  213.     }
  214.     /**
  215.      *        Returns the value of one single field/column
  216.      *
  217.      *        @param string $query
  218.      *        @param array $params
  219.      *        @return string
  220.      */        
  221.     public function single($query,$params = null){
  222.         $this->Init($query,$params);
  223.         return $this->sQuery->fetchColumn();
  224.     }
  225.     /**        
  226.      * Writes the log and returns the exception
  227.      *
  228.      * @param string $message
  229.      * @param string $sql
  230.      * @return string
  231.      */
  232.     private function ExceptionLog($message , $sql = "", $parameters=''){
  233.         $exception = 'Unhandled Exception. <br />';
  234.         $exception .= $message;
  235.         $exception .= "<br /> You can find the error back in the log.";
  236.  
  237.         if(!empty($sql)) {
  238.             # Add the Raw SQL to the Log
  239.            $message .= "\r\nRaw SQL : " . $sql;
  240.         }
  241.         if(!empty($parameters) && is_array($parameters)){
  242.             foreach($parameters as $key => $value){
  243.                 if(strpos($message,":".$key)!==false){
  244.                     $message .= str_replace(":$key","'".$value."'",$message);
  245.                 }
  246.             }
  247.         } else {
  248.             $message .= "No params";
  249.         }
  250.         # Write into log
  251.        $this->log->error($message);
  252.         return $exception;
  253.     }
  254.  
  255.     public function showSQL($string,$data) {
  256.         $indexed=$data==array_values($data);
  257.         foreach($data as $k=>$v) {
  258.             if(is_string($v)) $v="'$v'";
  259.             if($indexed) $string=preg_replace('/\?/',$v,$string,1);
  260.             else $string=str_replace(":$k",$v,$string);
  261.         }
  262.         return $string;
  263.     }
  264. } /*** end of class ***/
Advertisement
Add Comment
Please, Sign In to add comment