zoukankan      html  css  js  c++  java
  • PDO扩展

    <?php
    class db extends PDO {
        private $error;
        private $sql;
        private $bind;
        private $errorCallbackFunction;
        private $errorMsgFormat;
    
        public function __construct($dsn, $user="", $passwd="") {
            $options = array(
                PDO::ATTR_PERSISTENT => true, 
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            );
    
            try {
                parent::__construct($dsn, $user, $passwd, $options);
            } catch (PDOException $e) {
                $this->error = $e->getMessage();
            }
        }
    
        private function debug() {
            if(!empty($this->errorCallbackFunction)) {
                $error = array("Error" => $this->error);
                if(!empty($this->sql))
                    $error["SQL Statement"] = $this->sql;
                if(!empty($this->bind))
                    $error["Bind Parameters"] = trim(print_r($this->bind, true));
    
                $backtrace = debug_backtrace();
                if(!empty($backtrace)) {
                    foreach($backtrace as $info) {
                        if($info["file"] != __FILE__)
                            $error["Backtrace"] = $info["file"] . " at line " . $info["line"];    
                    }        
                }
    
                $msg = "";
                if($this->errorMsgFormat == "html") {
                    if(!empty($error["Bind Parameters"]))
                        $error["Bind Parameters"] = "<pre>" . $error["Bind Parameters"] . "</pre>";
                    $css = trim(file_get_contents(dirname(__FILE__) . "/error.css"));
                    $msg .= '<style type="text/css">' . "
    " . $css . "
    </style>";
                    $msg .= "
    " . '<div class="db-error">' . "
    	<h3>SQL Error</h3>";
                    foreach($error as $key => $val)
                        $msg .= "
    	<label>" . $key . ":</label>" . $val;
                    $msg .= "
    	</div>
    </div>";
                }
                elseif($this->errorMsgFormat == "text") {
                    $msg .= "SQL Error
    " . str_repeat("-", 50);
                    foreach($error as $key => $val)
                        $msg .= "
    
    $key:
    $val";
                }
    
                $func = $this->errorCallbackFunction;
                $func($msg);
            }
        }
    
        public function delete($table, $where, $bind="") {
            $sql = "DELETE FROM " . $table . " WHERE " . $where . ";";
            $this->run($sql, $bind);
        }
    
        private function filter($table, $info) {
            $driver = $this->getAttribute(PDO::ATTR_DRIVER_NAME);
            if($driver == 'sqlite') {
                $sql = "PRAGMA table_info('" . $table . "');";
                $key = "name";
            }
            elseif($driver == 'mysql') {
                $sql = "DESCRIBE " . $table . ";";
                $key = "Field";
            }
            else {    
                $sql = "SELECT column_name FROM information_schema.columns WHERE table_name = '" . $table . "';";
                $key = "column_name";
            }    
    
            if(false !== ($list = $this->run($sql))) {
                $fields = array();
                foreach($list as $record)
                    $fields[] = $record[$key];
                return array_values(array_intersect($fields, array_keys($info)));
            }
            return array();
        }
    
        private function cleanup($bind) {
            if(!is_array($bind)) {
                if(!empty($bind))
                    $bind = array($bind);
                else
                    $bind = array();
            }
            return $bind;
        }
    
        public function insert($table, $info) {
            $fields = $this->filter($table, $info);
            $sql = "INSERT INTO " . $table . " (" . implode($fields, ", ") . ") VALUES (:" . implode($fields, ", :") . ");";
            $bind = array();
            foreach($fields as $field)
                $bind[":$field"] = $info[$field];
            return $this->run($sql, $bind);
        }
    
        public function run($sql, $bind="") {
            $this->sql = trim($sql);
            $this->bind = $this->cleanup($bind);
            $this->error = "";
    
            try {
                $pdostmt = $this->prepare($this->sql);
                if($pdostmt->execute($this->bind) !== false) {
                    if(preg_match("/^(" . implode("|", array("select", "describe", "pragma")) . ") /i", $this->sql))
                        return $pdostmt->fetchAll(PDO::FETCH_ASSOC);
                    elseif(preg_match("/^(" . implode("|", array("delete", "insert", "update")) . ") /i", $this->sql))
                        return $pdostmt->rowCount();
                }    
            } catch (PDOException $e) {
                $this->error = $e->getMessage();    
                $this->debug();
                return false;
            }
        }
    
        public function select($table, $where="", $bind="", $fields="*") {
            $sql = "SELECT " . $fields . " FROM " . $table;
            if(!empty($where))
                $sql .= " WHERE " . $where;
            $sql .= ";";
            return $this->run($sql, $bind);
        }
    
        public function setErrorCallbackFunction($errorCallbackFunction, $errorMsgFormat="html") {
            //Variable functions for won't work with language constructs such as echo and print, so these are replaced with print_r.
            if(in_array(strtolower($errorCallbackFunction), array("echo", "print")))
                $errorCallbackFunction = "print_r";
    
            if(function_exists($errorCallbackFunction)) {
                $this->errorCallbackFunction = $errorCallbackFunction;    
                if(!in_array(strtolower($errorMsgFormat), array("html", "text")))
                    $errorMsgFormat = "html";
                $this->errorMsgFormat = $errorMsgFormat;    
            }    
        }
    
        public function update($table, $info, $where, $bind="") {
            $fields = $this->filter($table, $info);
            $fieldSize = sizeof($fields);
    
            $sql = "UPDATE " . $table . " SET ";
            for($f = 0; $f < $fieldSize; ++$f) {
                if($f > 0)
                    $sql .= ", ";
                $sql .= $fields[$f] . " = :update_" . $fields[$f]; 
            }
            $sql .= " WHERE " . $where . ";";
    
            $bind = $this->cleanup($bind);
            foreach($fields as $field)
                $bind[":update_$field"] = $info[$field];
            
            return $this->run($sql, $bind);
        }
    }    
    ?>
  • 相关阅读:
    2015年蓝桥杯省赛A组c++第3题
    2015年蓝桥杯省赛A组c++第1题
    算法学竞赛常用头文件模板
    Android+Tomcat通过http获取本机服务器资源
    Ubuntu16.04LTS卸载软件的命令
    20个有趣的Linux命令
    Ubuntu16.04开机蓝屏问题解决
    Ubuntu启动时a start job is running for dev-disk-by延时解决
    Cookie与Session
    JS 闭包
  • 原文地址:https://www.cnblogs.com/kezf/p/pdo.html
Copyright © 2011-2022 走看看