首页 > 代码库 > php for mysql 操作类

php for mysql 操作类

  1 <?php  2 defined(‘TOKEN‘) or die(‘Hacker intrusion‘);  3 class dbm {  4 private static $_instance = false; //连接实例  5 private $linkid = ‘‘; //当前的连接资源  6 private $dbname = ‘‘; //数据库名  7 private $tbpre = ‘‘; //表前缀  8 public $sql = array(); //所有执行过的sql  9 public $error = ‘‘; //当前执行的sql的错误信息 10 /**  架构函数 11  */ 12 private function __construct() { 13     $this->linkid = @mysql_connect(HOST,UNAME,UPASS) or H::show_msg (‘{"code":"1","msg":"Do not connect database"}‘); 14     $this->dbname = DBNAME; 15     $this->tbpre = TBPRE; 16     $this->select_db(DBNAME); 17     $this->set_charset(CHARSET); 18 } 19 /** 销毁类 估计没什么球用 建议手动销毁 20  */ 21 public function __destory() { 22     //$this->close(); 23 } 24 /** 禁止clone对象 25  */ 26 private function __clone() {} 27 /** 获取数据库单例 28  */ 29 public static function get_db() { 30     if(!self::$_instance) self::$_instance = new self(); 31     return self::$_instance; 32 } 33 /** 设置数据库字符集 34  * @param $charset 字符集 默认 utf8 35  */ 36 public function set_charset($charset=‘utf8‘) { 37     mysql_query("set names " . $charset, $this->linkid); 38 } 39 /** 选择数据库 40  * @param $dbname 数据库名 41  */ 42 public function select_db($dbname) { 43     mysql_select_db($dbname, $this->linkid) or H::show_msg (‘{"code":"1","msg":"Do not open database"}‘); 44 } 45 /** 单表插入 46  * @param $field 存储需要插入的键值对的数组 47  */ 48 public function insert($tbname,$field=array()) { 49     $str_k = ‘‘; 50     $str_v = ‘‘; 51     foreach($field as $k=>$v) { 52         $str_k .= $str_k == ‘‘ ? ‘`‘.trim($k).‘`‘ : ‘,`‘.trim($k).‘`‘; 53         $str_v .= $str_v == ‘‘ ? ‘\‘‘.$this->filter($v).‘\‘‘ : ‘,‘.‘\‘‘.$this->filter($v).‘\‘‘; 54     } 55     $sql = ‘insert into ‘.$this->tbpre.$tbname.‘ (‘; 56     $sql .= $str_k.‘) values (‘.$str_v.‘)‘; 57     return $this->query($sql,‘insert‘); 58 } 59 /** 单表删除 不传递where 则删除整张表 60  */ 61 public function deletes($tbname,$where=‘‘) { //注意传递 limit 1 避免扫描整张表 62     $sql = ‘delete from ‘.$this->tbpre.$tbname.($where==‘‘ ? ‘‘ : " where {$where}"); 63     return $this->query($sql,‘delete‘); 64 } 65 /** 单表更新 支持直接传递更新的字符串 "info_title=‘呵2呵‘,fcolor=‘#666‘" 66  */ 67 public function update($tbname,$field,$where=‘‘) { //注意传递 limit 1 避免扫描整张表 68     $sql = ‘update ‘.$this->tbpre.$tbname.‘ set ‘; 69     if(is_array($field)) { 70         $str_k_v = array(); 71         foreach($field as $k=>$v) { 72             $str_k_v[] = ‘`‘.trim($k).‘`=‘.‘\‘‘.$this->filter($v).‘\‘‘; 73         } 74         $str_k_v = implode(‘,‘,$str_k_v); 75     }else{ 76         $str_k_v = &$field; 77     } 78     $sql .= $where == ‘‘ ? $str_k_v : $str_k_v.‘ where ‘.$where; 79     return $this->query($sql,‘update‘); 80 } 81 /** 单表查询 82  */ 83 public function select($tbname,$params=array()) { 84     global $p; 85     $sql = ‘‘; //查询sql 86     $total_sql = ‘‘; //统计sql 87     if(count($params) == 0) { //没有传递数组参数,而是直接传递了sql语句 88         if(stripos($tbname,‘select‘) === false) { //只传递了表名 89             $sql = "select * from ".$this->tbpre.$tbname; 90         }else{ 91             $sql = $tbname; 92         } 93     } 94     $params[‘fields‘]    = isset($params[‘fields‘])    ? $params[‘fields‘]    : ‘*‘; 95     $params[‘where‘]     = isset($params[‘where‘])     ? $params[‘where‘]     : ‘‘; 96     $params[‘group‘]     = isset($params[‘group‘])     ? $params[‘group‘]     : ‘‘; 97     $params[‘having‘]    = isset($params[‘having‘])    ? $params[‘having‘]    : ‘‘; 98     $params[‘order‘]     = isset($params[‘order‘])     ? $params[‘order‘]     : ‘‘; 99     $params[‘p‘]         = isset($params[‘p‘])         ? $params[‘p‘]         : $p; //当前分页100     $params[‘pagesize‘]  = isset($params[‘pagesize‘])  ? $params[‘pagesize‘]  : 10; //每页大小101     $params[‘limit‘]     = isset($params[‘limit‘])     ? $params[‘limit‘]     : $this->get_limit($params[‘p‘],$params[‘pagesize‘]);102     $params[‘count‘]     = isset($params[‘count‘])     ? $params[‘count‘]     : 0; //是否需要统计 0=不统计 1=统计103     $params[‘index‘]     = isset($params[‘index‘])     ? $params[‘index‘]     : ‘‘; //统计时用的索引104 105     if($sql == ‘‘) { //没有直接传递查询sql106         $sql = ‘select ‘.$params[‘fields‘].‘ from ‘.$this->tbpre.$tbname;107         if($params[‘where‘]) $sql .= ‘ where ‘.$params[‘where‘];108         if($params[‘group‘]) $sql .= ‘ group by ‘.$params[‘group‘];109         if($params[‘having‘]) $sql .= ‘ having ‘.$params[‘having‘];110         if($params[‘order‘]) $sql .= ‘ order by ‘.$params[‘order‘];111         if($params[‘limit‘]) $sql .= ‘ limit ‘.$params[‘limit‘];112     }113     $rs = $this->query($sql,‘select‘); //开始查询114     if($params[‘count‘]) { //需要统计115         $tmp = $this->counts($tbname,$params[‘where‘],$params[‘index‘]);116         $rs[‘total_sql‘] = $tmp[‘total_sql‘];117         $rs[‘total‘] = $tmp[‘total‘];118         $rs[‘total_error‘] = $tmp[‘error‘];119         $rs[‘page‘] = H::page($params[‘p‘],$params[‘pagesize‘],$tmp[‘total‘]); //生成分页120     }121     return $rs;122 }123 /** 获取单条数据124  */125 public function find($tbname,$where,$fields=‘*‘) {126     $sql = ‘select ‘.$fields.‘ from ‘.$this->tbpre.$tbname.‘ where ‘.$where.‘ limit 0,1‘;127     $rs = $this->query($sql,‘select‘);128     if($rs[‘num‘]) $rs[‘list‘] = $tmp[‘list‘][0]; //有数据 返回一维数组129     return false; //没有数据返回 false130 }131 /** 统计表数据条数132  */133 public function counts($tbname,$where=‘‘,$index=‘‘) {134     $tmp = array(135         ‘total_sql‘=>"select count(1) as total from ".$this->tbpre.$tbname.‘ ‘.$index.($where==‘‘?‘‘:" where ".$where),136         ‘total‘=>0,137         ‘error‘=>‘‘,138     );139     $rs = $this->query($tmp[‘total_sql‘],‘select‘);140     if(is_numeric($rs)) { //统计的sql 正确执行了141         $tmp[‘total‘] = $rs;142         return $tmp;143     }144     $tmp[‘error‘] = $rs; //sql语句执行错误145     return $tmp;146 }147 /** 执行sql语句 支持直接传递sql 自动判断返回值148  */149 public function query($sql,$type=‘‘) {150     if($type == ‘‘) $type = $this->get_query_type($sql);151     $time = H::getmicrotime();152     $rs = mysql_query($sql,$this->linkid);153     $time = round(H::getmicrotime() - $time);154     $this->error = mysql_error($this->linkid);155     $this->sql[] = array(‘sql‘=>$sql,‘query_time‘=>$time,‘error‘=>$this->error);156     //插入157     if($type == ‘insert‘) {158         return array(159             ‘sql‘=>$sql,160             ‘query_time‘=>$time,161             ‘rows‘=>mysql_affected_rows($this->linkid), //如果是create database 失败 返回的是 -1162             ‘error‘=>$this->error,163             ‘autoid‘=>mysql_insert_id($this->linkid),164         );165     }166     //删除167     if($type == ‘delete‘) {168         return array(169             ‘sql‘=>$sql,170             ‘query_time‘=>$time,171             ‘rows‘=>mysql_affected_rows($this->linkid), //如果是drop database 返回的是 0 失败返回 -1172             ‘error‘=>$this->error,173         );174     }175     //更新176     if($type == ‘update‘) {177         return array(178             ‘sql‘=>$sql,179             ‘query_time‘=>$time,180             ‘rows‘=>mysql_affected_rows($this->linkid),181             ‘error‘=>$this->error,182         );183     }184     //查询185     if($type == ‘select‘) {186         if(stripos($sql,‘count(‘) === false) { //查询 注意count语句的时候 count 与 ( 要紧贴 才能匹配到187             $i = 0;188             $list = array();189             if($rs) {190                 while($row = mysql_fetch_assoc($rs)) {191                     $list[$i] = $row;192                     $i++;193                 }194                 mysql_free_result($rs); //释放结果内存195                 unset($rs);196             }197             return array(198                 ‘sql‘=>$sql,199                 ‘total_sql‘=>‘‘,200                 ‘query_time‘=>$time,201                 ‘error‘=>$this->error,202                 ‘total_error‘=>$this->error,203                 ‘total‘=>‘‘,204                 ‘num‘=>$i,205                 ‘list‘=>$list206             );207         }else{ //统计208             if($rs) {209                 $rs = mysql_fetch_assoc($rs);210                 $rs = $rs[‘total‘];211             }else{212                 $rs = $this->error; //统计失败返回错误213             }214             return $rs;215         }216     }217     //没有匹配到sql执行类型218     return false;219 }220 /** 过滤sql单引号221  */222 public function filter(&$str) {223     if(function_exists(‘mysql_real_escape_string‘)) {224         $str = mysql_real_escape_string($str);225     }elseif(function_exists(‘mysql_escape_string‘)) {226         $str = mysql_escape_string($str);227     }else{228         $str = addslashes($str);229     }230     return $str;231 }232 /** 获取sql语句执行类型233  */234 private function get_query_type(&$sql) {235     $sql = ltrim(strtolower($sql));236     $tmp = substr($sql,0,stripos($sql,chr(32)));237     switch ($tmp) {238         case ‘show‘:239             $tmp = ‘select‘;240         break;241         case ‘create‘:242             $tmp = ‘insert‘;243         break;244         case ‘drop‘;245         case ‘truncate‘;246             $tmp = ‘delete‘;247         break;248         case ‘alter‘:249             $tmp = ‘update‘;250         break;251     }252     return $tmp;253 }254 /** 关闭数据库连接255  */256 public function close() {257     if ($this->linkid) {258         mysql_close($this->linkid);259     }260     $this->linkid = null;261 }262 /** 返回limit语句263  * @param  $p 当前页码264  * @param  $pagesize 分页大小265  */266 public function get_limit($p=1,$pagesize=10) {267     return ($p-1) * $pagesize . ",$pagesize";268 }269 /** 获取mysql的版本信息270  */271 public function mysql_get_server_info() {272     return mysql_get_server_info($this->linkid);273 }274 } //end class275 ?>

欢迎交流,恳请大神指点。

php for mysql 操作类