自动DB类
用的DB类,主要采用是的PDO的内容,先对PDO中的关于exec与query两个方法进行封装,并统一进行错误处理,启用异常处理模式与默认字符集设置,在子类中设置一个保护属性protected $table = '';
子类中的获取表的方法统一使用$this->getTBName()方法来获取表名
<?php header('Content-type:text/html;charset=utf-8'); class DB{ //属性 private $allow = array('mysql','oracle'); private $type; private $host; private $port; private $user; private $pass; private $dbname; private $prefix;//表前缀 private $charset; private $db; //protected $table; //private static $mydb; private $mesg = array(); private $fetch_type;//fethc的模式 /* public function __construct($arr = array()){ $this->type = isset($arr['type']) ? $arr['type'] : 'mysql'; $this->host = isset($arr['host']) ? $arr['host'] : 'localhost'; $this->port = isset($arr['port']) ? $arr['port'] : '3308'; $this->user = isset($arr['user']) ? $arr['user'] : 'root'; $this->pass = isset($arr['pass']) ? $arr['pass'] : 'root'; $this->dbname = isset($arr['dbname']) ? $arr['dbname'] : 'shop'; $this->perfix = isset($arr['perfix']) ? $arr['perfix'] : 'sh_'; $this->charset = isset($arr['charset']) ? $arr['charset'] : 'utf8'; $this->fetch_type = isset($arr['fetch_type']) ? $arr['fetch_type'] : PDO::FETCH_ASSOC; if(!in_array($this->type,$this->allow)){ $this->mesg['type_err'] = '不支持当前数据库:'.$this->type; exit; } echo $this->port; $this->connect(); $this->setDBAttribute(); $this->setCharset(); } */ /** * [__construct 构造函数] * @param array $arr [传入相关的数据库信息] */ public function __construct($arr = array()){ $this->type = isset($arr['type']) ? $arr['type'] : $GLOBALS['config']['mysql']['type'] ; $this->host = isset($arr['host']) ? $arr['host'] : $GLOBALS['config']['mysql']['host']; $this->port = isset($arr['port']) ? $arr['port'] : $GLOBALS['config']['mysql']['port']; $this->user = isset($arr['user']) ? $arr['user'] : $GLOBALS['config']['mysql']['user']; $this->pass = isset($arr['pass']) ? $arr['pass'] : $GLOBALS['config']['mysql']['pass']; $this->dbname = isset($arr['dbname']) ? $arr['dbname'] : $GLOBALS['config']['mysql']['dbname']; $this->prefix = isset($arr['prefix']) ? $arr['prefix'] : $GLOBALS['config']['mysql']['prefix']; $this->charset = isset($arr['charset']) ? $arr['charset'] : $GLOBALS['config']['mysql']['charset']; $this->fetch_type = isset($arr['fetch_type']) ? $arr['fetch_type'] : PDO::FETCH_ASSOC; if(!in_array($this->type,$this->allow)){ $this->mesg['type_err'] = '不支持当前数据库:'.$this->type; exit; } //echo $this->port; //连接数据库 $this->connect(); //设置PDO的异常模式 $this->setDBAttribute(); //设置数据库的字符集 $this->setCharset(); } /** * [connect 数据库连接] * @return [no] [没有返回] */ private function connect(){ try{ $this->db = new PDO("{$this->type}:host={$this->host};port={$this->port};dbname={$this->dbname}","{$this->user}","{$this->pass}"); }catch(PDOException $e){ $this->mesg['con_err'] = '出错文件是:'.$e->getFile().',出错行数:'.$e->getLine(); exit; } } /** * [setDBAttribute 设置PDO的异常模式] */ private function setDBAttribute(){ $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $this->db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); } /** * [myEXEC PDO中的exec方法的封装] * @param [string] $sql [要执行的sql语句] * @return [mixed] [成功返回1失败返回false] */ private function myEXEC($sql){ //$sql = addslashes($sql); try{ $res = $this->db->exec($sql); return $res ? $res :false; }catch(PDOException $e){ $this->mesg['exec_err'] = 'exec操作出错:'.$e->getFile().',出错的位置:'.$e->getLine(); return false; } } /** * [myQuery PDO中的query方法的封装] * @param [string] $sql [要执行的SQL语句] * @return [mixed] [如果成功返回结果集,失败返回false] */ private function myQuery($sql){ //$sql = addslashes($sql); try{ $stmt = $this->db->query($sql); //echo $stmt->rowCount(); return $stmt->rowCount() ? $stmt :false; }catch(PDOException $e){ $this->mesg['query_err'] = 'query操作出错:'.$e->getFile().',出错的位置:'.$e->getLine(); return false; } } /** * [setCharset 设置数据库的字符集] */ private function setCharset(){ $sql = "set names {$this->charset}"; $this->myEXEC($sql); } /* public static function getInstance($arr){ if(self::$mydb){ }else{ return self::$mydb = new DB($arr); } return self::$mydb; } */ /** * [db_insert 封装插入方法] * @param [string] $sql [要执行的sql语句] * @return [int] [如果成功返回自增ID,否则返回false] */ public function db_insert($sql){ return $this->myEXEC($sql) ? $this->db->lastInsertId() : false; } /** * [db_update 封装更新方法] * @param [string] $sql [要执行的sql语句] * @return [boolean] [更新成功返回true,失败返回false] */ public function db_update($sql){ return $this->myEXEC($sql) ? true : false; } /** * [db_delete 封装删除方法] * @param [string] $sql [要执行的sql语句] * @return [boolean] [更新成功返回true,失败返回false] */ public function db_delete($sql){ return $this->myEXEC($sql) ? true :false; } /** * [db_getRow 获取一条结果集] * @param [string] $sql [要执行的sql语句] * @return [mixed] [成功返回一个一维数组,失败返回false] */ public function db_getRow($sql){ //echo $sql; $stmt = $this->myQuery($sql); //var_dump($stmt); return $stmt ? $stmt->fetch($this->fetch_type) : false; } /** * [db_getRows 获取多个结果] * @param [string $sql [要执行的sql语句] * @return [mixed] [成功返回一个二维数组,失败返回false] */ public function db_getRows($sql){ $stmt = $this->myQuery($sql); return $stmt ? $stmt->fetchAll($this->fetch_type) : array(); } protected function getTBName(){ return $this->prefix.$this->table; } //__sleep方法 public function __sleep(){ //返回需要保存的属性的数组 return array('host','port','user','pass','dbname','charset','prefix'); } //__wakeup方法 public function __wakeup(){ //连接资源 $this->connect(); //设置字符集和选中数据库 $this->setCharset(); } public function getIP(){ if($_SERVER['REMOTE_ADDR']){ $ip = $_SERVER['REMOTE_ADDR']; }else if(getenv('REMOTE_ADDR')){ $ip = getenv('REMOTE_ADDR'); }else{ $ip = 'Unknown'; } return $ip; } } //$mypdo = DB::getInstance(array('type'=>'mysql','dbname'=>'test')); //echo $m // echo '<pre>'; //var_dump($mypdo); //var_dump($mypdo->db_getRows("select * from user ")); //var_dump($mypdo->db_insert("insert into user values(null,'小九',38)")); //var_dump($mypdo->db_update("update user set u_name = '康乾7' where u_id = 20")); //var_dump($mypdo->db_delete("delete from user where u_id = 20")); //$mypdo = new DB(); // var_dump($mypdo);