<?php //$conn = DB::instance(array('dbname'=>'default')); class ConnDB{ /* * Author 吴啸 * Create 2011-7-1 * Description 数据库类 * * Methods * ::config(array $config) * * ->select_db(string $dbname) * ->set_charset(string $charset) * * ->query(string $sql,boolean $to_array = true,int $result_type = MYSQL_ASSOC) * ->fetch_array(resource $result,int $result_type = MYSQL_BOTH) * * ->num_rows(mixed $request) * ->insert_id() * * ->last_sqls(int $num = 1) * ->error(int $num = 1) * ->last_errors(int $num = 1) * ->last_query() * * Example * $conndb = DB::instance(); * 或者 * $conndb = DB::instance(array( * 'host' => 'localhost', * 'dbname' => 'default', * 'username' => 'root', * 'password' => '', * 'charset' => 'utf8' * )); * * */ private static $_config = array( //主机地址 'host' => 'localhost', //数据库名 'dbname' => 'default', //用户名 'username' => 'root', //密码 'password' => '', //字符集 'charset' => 'utf8' ); //是否保存查询错误信息 private $_save_errors = 1; //查询错误信息寄存条目上限 private $_errors_amount = 5; //查询错误信息寄存器 private $_errors = array(); //查询语句寄存条目上限 private $_ok_sqls_amount = 5; //查询语句寄存器 private $_ok_sqls = array(); //最近一条查询语句 private $_last_sql; //类实体寄存器 private static $_instance; //数据库实体寄存器 private $_conn; function __construct(){ //根据给定参数建立数据库连接 $this->_conn = mysql_connect( self::$_config['host'], self::$_config['username'], self::$_config['password'], true ); } public static function instance(array $arr_config = array()){ if (count(array_filter($arr_config))){ self::config($arr_config); } if ( 0 < func_num_args() && false != ( $arr_config = func_get_arg(0)) ){ self::config($arr_config); } //数据库对象实例化 self::$_instance = new self; if (!self::$_instance->select_db(self::$_config['dbname'])){ echo 'select conndb:',self::$_config['dbname'],' error.'; } self::$_instance->set_charset(self::$_config['charset']); return self::$_instance; } //传递设置参数 public static function config(array $arr_config){ if ( 0 != count( $intersect = array_intersect_key( $arr_config,self::$_config ) ) ){ self::$_config = array_merge(self::$_config,$intersect); } } //数据库选择 public function select_db($str_db){ return mysql_select_db($str_db,$this->_conn); } //设定字符集 public function set_charset($str_charset){ return mysql_set_charset($str_charset,$this->_conn); } /* * 数据库查询 * @param sql string 待查询的SQL语句 * @param to_array bool 是否将结果集转换成数组后再返回 * @parame result_type int 返回的结果集类型,同mysql_fetch_array的结果集类型参数 * @return mysql结果集/或者/结果集转换成的数组 * @exception return false * */ public function query($sql,$result_type = MYSQL_BOTH,$to_array = true){ return $this->sqlInspecte($sql,$result_type,$to_array,1); } //无缓存查询 public function unbuffered_query($sql,$result_type = MYSQL_BOTH,$to_array = true){ return $this->sqlInspecte($sql,$result_type,$to_array,0); } //sql分句隔断 private function sqlInspecte($sql,$result_type,$to_array,$query_method){ $sqls = trim($sql,';'); //分句隔断点正则表达 $preg = '/;(?=insert|delete|update|select|alter)/i'; if (!preg_match($preg,$sqls)){ return $this->querySql($sqls,$result_type,$to_array,$query_method); }else{ $sqls = preg_split($preg,$sqls); foreach ($sqls as $sqls_v){ $result = $this->querySql($sqls_v,$result_type,$to_array,$query_method); if ((false === $result) || is_array($result) || is_resource($result)){ return $result; } } return true; } } //主查询方法 private function querySql($sql,$result_type = MYSQL_BOTH,$to_array = true,$query_method = 1){ //存储最近一条查询语句 self::$_instance->_last_sql = $sql; if ($query_method){ $result = mysql_query($sql,$this->_conn); }else{ $result = mysql_unbuffered_query($sql,$this->_conn); } //query succeed if (false != $result){ //存储最近一条成功的查询语句 array_unshift(self::$_instance->_ok_sqls,$sql); if (self::$_instance->_ok_sqls_amount < count(self::$_instance->_ok_sqls)){ array_pop(self::$_instance->_ok_sqls); } //返回查询结果集 return (!is_resource($result) || !$to_array)?$result:self::$_instance->fetch_array($result,$result_type); } //query failed if (self::$_instance->_save_errors){ //存储最近一条查询失败的错误信息 array_unshift(self::$_instance->_errors,$sql."::ERROR::".mysql_error()); if (self::$_instance->_errors_amount < count(self::$_instance->_errors)){ array_pop(self::$_instance->_errors); } } return false; } //获得最后一条查询语句 public function last_query(){ return self::$_instance->_last_sql; } //结果集转成数组 public function fetch_array($result,$result_type = MYSQL_BOTH){ $array = array(); while ($temp = mysql_fetch_array($result,$result_type)){ $array[] = $temp; } return $array; } //获取结果集行数 public function num_rows($request){ //如果是结果集 if (is_resource($request)){ return mysql_num_rows($request); } //如果是查询语句字符串 if (is_string($request)){ return mysql_num_rows(self::$_instance->query($request,MYSQL_NUM,false)); } //如果是结果集转换后的数组 if (is_array($request)){ return count($request); } return false; } //获取最近的成功的查询语句,参数$num为从1到保存上限的integer public function last_ok_sql($num = 1){ if (--$num <= self::$_instance->_ok_sqls_amount){ return !empty(self::$_instance->_ok_sqls[$num])?self::$_instance->_ok_sqls[$num]:'尚未有成功的查询'; }else{ return '错误的下标'; } } //获取所有最近的成功的查询语句,return array public function last_ok_sqls(){ if (!empty(self::$_instance->_ok_sqls)){ return self::$_instance->_ok_sqls; }else{ return '尚未有成功的查询'; } } //获取最近的查询失败信息,参数$num为从1到保存上限的integer public function error($num = 1){ if (--$num <= self::$_instance->_errors_amount){ return !empty(self::$_instance->_errors[$num])?self::$_instance->_errors[$num]:'暂无错误信息'; }else{ return '错误的下标'; } } //获取所有最近的查询失败信息 public function last_errors(){ if (!empty(self::$_instance->_errors)){ return self::$_instance->_errors; }else{ return '暂无错误信息'; } } //获取最后插入的行的id public function insert_id(){ return mysql_insert_id($this->_conn); } public function close(){ self::$_instance = ''; } function __destruct(){ if (is_resource($this->_conn)){ mysql_close($this->_conn); } } }