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);
        }
    }    
    ?>
  • 相关阅读:
    Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs
    入围 WF 后训练记
    算法竞赛历程
    2021 多校 杭电 第十场
    2021 多校 杭电 第九场
    2021 多校 牛客 第十场
    2021 多校 牛客 第九场
    2021 多校 杭电 第八场
    2021 多校 杭电 第六场
    2021 多校 杭电 第七场
  • 原文地址:https://www.cnblogs.com/kezf/p/pdo.html
Copyright © 2011-2022 走看看