PHP学习实例,数据库封装类。 <?php class Core{ /*对数组进行继承*/ static function inHerit($arr_orgin,$arr_output){ return array_merge($arr_orgin,$arr_output); } /*打印错误*/ static function throwError($errmsg){ echo ''<p>error:''.$errmsg.''</p>''; exit(); } } ?> <?php class db{ private $result = array(); private $connector = array(); private $configs = array(); private $active = 0; private $default_config = array( ''dbtype'' => ''MySQL'', ''index'' => 0,''user'' => ''root'', ''pwd'' => '''' ,''host'' => ''localhost'' ,''port''=> 3306,''charset'' => ''utf8'' ,''dbname'' => null ); /*初始化*/ public function __construct($config = array()){ if($config) $this->connect($config); } public function __destruct(){ foreach($this->connector as $index => $connect) $this->{''_''.$this->configs[$index][''dbtype''].''_close''}($connect); } private function _mysql_close($connect){ mysqli_close($connect); } /*选择连接*/ public function selectConnect($index){ return isset($this->connector[$index]) && (($this->active = $index) || true); } /*建立连接*/ public function connect($config){ (!isset($config[''index''])) && $config[''index''] = $this->default_config[''index'']++ ; $config = Core::inHerit($this->default_config,$config); !in_array($config[''dbtype''],array(''mysql'')) && Core::throwError(''未支持的数据库类型''); extract($config); $this->configs[$index] = $config; $this->{''_''.$config[''dbtype''].''_connect''}($user, $pwd,$host,$dbname,$charset,$index,$port); } private function _mysql_connect($user = ''root'', $pwd = '''' ,$host = ''localhost'' ,$dbname = null,$charset = ''utf8'' ,$index = 0 ,$port = 3306){ $this->connector[$index] = mysqli_connect ( $host, $user, $pwd , null, $port) or Core::throwError(mysql_error()); $this->active = $index; if($dbname) $this->selectDb($dbname,$charset); } /*取得当前连接*/ private function _getConnect(){ return $this->connector[$this->active]; } /*取得当前连接使用的数据库类型 带参数自动拼接为函数名*/ private function _getDbTypeFunc($funcname = null){ $dbtype = $this->configs[$this->active][''dbtype'']; return $funcname?''_''.$dbtype.''_''.$funcname:$dbtype; } /*选择数据库*/ public function selectDb($dbname,$charset){ mysqli_select_db($this->_getConnect(),$dbname) or Core::throwError(mysql_error()); $this->_mysql_query(''set names ''.$charset); } /*执行语句*/ private function _mysql_query($sql){ $result = mysqli_query($this->_getConnect(),$sql) or Core::throwError(mysql_error()); return $result; } private function _mysql_bind_by_name($sql , $sqlv){ $sql_param = array(); $getparam = $getparam2 = ''\w+?'';// $getparam = array_keys($sqlv); implode(''|'',$getparam); preg_match_all(''/:(''.$getparam.'')\b/iU'',$sql,$getparam) or Core::throwError(''参数绑定错误''); $getparam = $getparam[1]; $getparam = array_flip($getparam); count($getparam) != count($sqlv) || array_diff_key($getparam,$sqlv) && Core::throwError(''参数不匹配''); $sql = preg_replace(''/:(''.$getparam2.'')\b/iU'',''?'',$sql) ; $sqlv = array_merge($getparam,$sqlv); unset($getparam2); unset($getparam); $stmt = mysqli_prepare($this->_getConnect(),$sql) or Core::throwError(''wrong sql:''.$sql); $ptype = ''''; $bindparam = array($stmt,''''); foreach ($sqlv as $k => $v){ $ptype .= $this->_getParamType($k); $bindparam[] = $v; } $bindparam[1] = $ptype; call_user_func_array(''mysqli_stmt_bind_param'',$bindparam); return $this->_mysql_stmt_exec($stmt,$sql); } private function _mysql_bind_in_sort(){ $argus = func_get_args() ; $sql = array_shift($argus); $stmt = mysqli_prepare($this->_getConnect(),$sql) or Core::throwError(''wrong sql:''.$sql); $pcount = mysqli_stmt_param_count($stmt); $pcount != count($argus) && Core::throwError(''参数不匹配''); $ptype = str_repeat(''s'',$pcount); array_splice($argus, 0, 0 ,array($stmt,$ptype)); call_user_func_array(''mysqli_stmt_bind_param'',$argus); return $this->_mysql_stmt_exec($stmt,$sql); } private function _mysql_stmt_exec($stmt,$sql){ mysqli_stmt_execute($stmt); if($this->isSelect($sql)){ ///返回值绑定 mysqli_stmt_bind_result($stmt,$a); while ($stmt->fetch()) { print_r($a); echo ''<br/>''; } } $stmt->close(); } /*根据参数形式使用不同函数*/ private function _mysql_iquery($sql , $sqlv = array()){ if ($sqlv){ if (is_array($sqlv)) return $this->_mysql_bind_by_name($sql , $sqlv); else{ $argus = func_get_args() ; return call_user_func_array(array($this,''_mysql_bind_in_sort''),$argus); } }else{ return $this->_mysql_query($sql,$sqlv); } } /*根据键名前缀区分数据类型*/ private function _getParamType($key){ $r = ''s''; /*首字母小写 第二个字母大写 则第一个字母为模式前缀*/ $mode = array( ''i'' => ''i'',''s'' => ''s'',''d'' => ''d'',''b'' => ''b'' ); if (strlen($key) >= 2 && $key[0] == strtolower($key[0]) && $key[1] == strtoupper($key[1]) && in_array($key[0],$mode)) $r = $mode[$key[0]]; return $r; } /*分析sql语句 判断行为*/ private function _cmdType($sql){ return substr(strtolower($sql),0,strpos($sql,'' '')); } /*分析sql语句是否为select语句*/ private function isSelect($sql){ return ''select'' == $this->_cmdType($sql); } public function query($sql , $sqlv = array()){ $func = $this->_getDbTypeFunc(''iquery''); $argus = func_get_args() ; $argus[0] = trim($argus[0]); return call_user_func_array(array($this,$func),$argus); } } ?> <?php $d = array( ''dbname'' => ''test'', ''charset'' => ''latin1'' ); $db = new db($d); //数组方式绑定参数 $sqlv = array(''iId1''=>''14'',''id2'' => 30); $r = $db -> query("select id from toselect where id > :iId1 and id < :id2 ",$sqlv); //标准方式绑定参数 $r = $db -> query("select content from toselect where id > ? ",13); var_dump($r); ?> (责任编辑:admin) |