一个小工程的准备工作 - Php MySql Class
我比较喜欢的一个。
<?php /** * 数据库操作类 * * @author Moyo * @package defaultPackage */ class Mysql { // 默认配置 private $_config_default = array ( 'debug' => false, 'host' => 'localhost:3306', 'username' => 'root', 'password' => '', 'database' => 'mysql', 'prefix' => '', 'charset' => 'utf-8', 'cached' => 'file://{root}/query_cache/' ); public $CACHE_HASH_SALT = 'sql.cache.uuland.org'; public $CLIENT_MULTI_RESULTS = 131072; // 配置信息 private $_config = array(); private $_debug = true; private $_host = ''; private $_username = ''; private $_password = ''; private $_database = ''; private $_prefix = ''; private $_charset = ''; private $_cached = ''; private $_fc_path = ''; private $_mc_server = ''; // 运行时变量 private $_dbc_handle = null; private $_query_handle = null; public $sql = ''; private $_cache_key = ''; private $_result = array(); private $_need_cache = false; // 数据库操作 private $_operate = ''; private $_column = ''; private $_where = array(); private $_order = array(); private $_limit = ''; private $_data = array(); private $_cache = ''; // 调试记录 private $_trace = array(); // 获取实例 public function getInstance() { return new self(); } // 私有化构造函数,禁止外部实例化 private function __construct(){} // 卸载实例时,自动释放资源,关闭连接 public function __destruct() { // 释放资源 $this->free(); // 关闭连接 $this->close(); } // 载入配置 public function config($config) { $this->trace('public::config::load'); $this->_config = $config; // 执行初始化 $this->init(); } // 初始化 private function init() { $this->trace('private::config::init_default'); // 配置分析 foreach ($this->_config as $key => $val) { $mkey = '_'.$key; $this->$mkey = isset($this->_config[$key]) ? $this->_config[$key] : $this->_config_default[$key]; } // 清理非debug模式下,之前记录的调试信息 if (!$this->_debug) unset($this->_trace); // 缓存配置 $this->trace('private::config::init_cache'); $cache_conf = explode('://', $this->_cached); $this->_cached = $cache_conf[0]; if ($this->_cached == 'file') { $this->_fc_path = str_replace('{current}', dirname(__FILE__), str_replace('{root}', $_SERVER['DOCUMENT_ROOT'], $cache_conf[1])); // 检测目录 if (!is_dir($this->_fc_path)) { mkdir($this->_fc_path); } } elseif ($this->_cached == 'memcache') { $this->_mc_server = $cache_conf[1]; } unset($this->_config); } // 连接至数据库 private function connect() { $this->trace('public::server::connect'); // 连接服务器 $this->_dbc_handle = mysql_connect( $this->_host, $this->_username, $this->_password, true, $this->CLIENT_MULTI_RESULTS ); if (!$this->_dbc_handle) { $this->alert('Can\'t connect to Server [ '.$this->_username.'@'.$this->_host.' ]'); return false; } // 选择数据库 if (!mysql_select_db($this->_database, $this->_dbc_handle)) { $this->alert('Can\'t select database ['.$this->_database.']'); return false; } $version = mysql_get_server_info($this->_dbc_handle); // 设置数据库编码 if ($version >= '4.1') { //使用UTF8存取数据库 需要mysql 4.1.0以上支持 mysql_query('SET NAMES "'.$this->_charset.'"', $this->_dbc_handle); } //设置 sql_model if($version > '5.0.1') { mysql_query('SET SQL_Mode=""', $this->_dbc_handle); } return true; } // 释放数据查询 private function free() { $this->trace('public::query::free'); if ($this->_query_handle && $this->_operate == 'SELECT') { mysql_free_result($this->_query_handle); } unset($this->_query_handle); unset($this->_operate); unset($this->_column); unset($this->_where); unset($this->_order); unset($this->_limit); unset($this->_data); unset($this->_cache); unset($this->_result); return true; } // 关闭数据库连接 private function close() { if ($this->_dbc_handle) { $this->trace('public::server::close'); mysql_close($this->_dbc_handle); unset($this->_dbc_handle); } } // <![数据库操作][ // 增改删查 public function select($column) { $this->_operate = 'SELECT'; $this->_column = $column; return $this; } public function update($column) { $this->_operate = 'UPDATE'; $this->_column = $column; return $this; } public function insert($column) { $this->_operate = 'INSERT'; $this->_column = $column; return $this; } public function delete($column) { $this->_operate = 'DELETE'; $this->_column = $column; return $this; } // 条件 public function where($where) { $this->_where[] = $where; return $this; } // 排序 public function order($order) { $this->_order[] = $order; return $this; } // 限制返回结果数 public function limit($limit) { $this->_limit = $limit; return $this; } // 数据存储 public function data($data) { $this->_data[] = $data; return $this; } // 缓存设置 public function cache($cache) { $this->_cache = $cache; return $this; } // 开始执行操作 public function done() { $this->trace('public::query::init'); // 数据表 $column = $this->_prefix.$this->_column; // 组合SQL switch ($this->_operate) { case 'SELECT': $sql = 'SELECT * FROM `'.$column.'`'.$this->pack_where().$this->pack_order().$this->pack_limit(); break; case 'UPDATE': $sql = 'UPDATE `'.$column.'`'.$this->pack_data().$this->pack_where(); break; case 'INSERT': $sql = 'INSERT INTO `'.$column.'`'.$this->pack_data(); break; case 'DELETE': $sql = 'DELETE FROM `'.$column.'`'.$this->pack_where(); break; default: break; } $this->sql = $sql; // 缓存判断 [暂时只支持缓存查询] if ($this->_operate == 'SELECT' && $this->cache_check()) { $return = $this->_result; // 清理变量池并返回 if ($this->free()) return $return; } // 连接判断 if (!$this->_dbc_handle) $this->connect(); // 开始执行SQL $this->trace('public::query::begin['.$this->_operate.']'); $this->_query_handle = mysql_query($sql, $this->_dbc_handle); if (!$this->_query_handle) { $this->alert('SQL run error.'); } $this->trace('public::query::finish['.$this->_operate.']'); if ($this->_operate == 'SELECT') { if (mysql_num_rows($this->_query_handle) > 0) { while ($one_row = mysql_fetch_assoc($this->_query_handle)) { $this->_result[] = $one_row; } mysql_data_seek($this->_query_handle, 0); } else { $this->_result = null; } // 写缓存 if ($this->_need_cache) $this->cache_write(); $return = $this->_result; // 清理变量池并返回 if ($this->free()) return $return; } else { $return = mysql_affected_rows($this->_dbc_handle); // 清理变量池并返回 if ($this->free()) return $return; } } // 返回结果限制 private function pack_limit() { if ($this->_limit == '') return ''; if (is_numeric($this->_limit)) { return ' LIMIT 0,'.$this->_limit; } elseif (is_string($this->_limit)) { return ' LIMIT '.$this->_limit; } } // 条件整合 private function pack_where() { if (!$this->_where) return ''; $sql_where = ' WHERE '; foreach ($this->_where as $where) { if (is_array($where)) { foreach ($where as $key => $val) { if (is_numeric($val)) { $sql_where .= $key.'='.$val; } elseif (is_string($val)) { $sql_where .= $key.'="'.$val.'"'; } $sql_where .= ' and '; } } elseif (is_string($where)) { $conds = explode(',', $where); foreach ($conds as $one_cond) { $sql_where .= $one_cond.' and '; } } } return substr($sql_where, 0, -5); } // 排序整合 private function pack_order() { if (!$this->_order) return ''; $sql_order = ' ORDER BY '; foreach ($this->_order as $order) { if (is_array($order)) { foreach ($order as $key => $type) { $sql_order .= $key.' '.$type.', '; } } elseif (is_string($order)) { $ords = explode(',', $order); foreach ($ords as $one_ord) { $sql_order .= str_replace('.', ' ', $one_ord).', '; } } } return substr($sql_order, 0, -2); } // 数据整合 private function pack_data() { if (!$this->_data) return ''; $sql_data = ' SET '; foreach ($this->_data as $data) { if (is_array($data)) { foreach ($data as $key => $val) { if (is_numeric($val)) { $sql_data .= $key.'='.$val; } elseif (is_string($val)) { $sql_data .= $key.'="'.$val.'"'; } $sql_data .= ', '; } } elseif (is_string($data)) { $datas = explode(',', $data); foreach ($datas as $one_data) { $sql_data .= $one_data.', '; } } } return substr($sql_data, 0, -2); } // ]> // 缓存检测 private function cache_check() { $this->trace('private::cache::check'); if ($this->_cache == '') return false; $this->_cache_key = md5($this->sql.'@'.$this->CACHE_HASH_SALT); $time_calc = array ( 's' => 1, 'm' => 60, 'h' => 3600, 'd' => 86400 ); $c_rule = explode(':', $this->_cache); $c_time = $c_rule[0]; $c_long = (int)$c_rule[1]; if(time() - $this->cache_time() > $time_calc[$c_time]*$c_long) { $this->_need_cache = true; return false; } $this->_result = $this->cache_read(); return true; } // 获取时间 private function cache_time() { $handle = 'cache_handle_'.$this->_cached.'_time'; return $this->$handle($this->_cache_key); } // 读缓存 private function cache_read() { $this->trace('private::cache::read'); $handle = 'cache_handle_'.$this->_cached.'_value'; return $this->$handle($this->_cache_key); } // 写缓存 private function cache_write() { $this->trace('private::cache::write'); $handle = 'cache_handle_'.$this->_cached.'_write'; $this->$handle($this->_cache_key, $this->_result); $this->_need_cache = false; } // <![缓存方式][ // 文件缓存 private function cache_handle_file_time($key) { if (is_file($this->_fc_path.$key.'.sql')) { return filemtime($this->_fc_path.$key.'.sql'); } else { return 0; } } private function cache_handle_file_value($key) { if (is_file($this->_fc_path.$key.'.sql')) { return unserialize(file_get_contents($this->_fc_path.$key.'.sql')); } else { return false; } } private function cache_handle_file_write($key, $val) { file_put_contents($this->_fc_path.$key.'.sql', serialize($val)); return true; } // memcache 缓存 [这里做的不怎么好,不过平常也用不到memcache的 ^_^] private function cache_handle_memcache_time($key) { $mec = new Memcache(); $mec->connect($this->_mc_server); $val = $mec->get($this->_cache_key.'_time'); $mec->close(); if ($val == '') { return 0; } else { return $val; } } private function cache_handle_memcache_value($key) { $mec = new Memcache(); $mec->connect($this->_mc_server); $val = $mec->get($this->_cache_key.'_value'); $mec->close(); if ($val == '') { return false; } else { return $val['value']; } } private function cache_handle_memcache_write($key, $val) { $mec = new Memcache(); $mec->connect($this->_mc_server); $mec->set($this->_cache_key.'_time', time()); $mec->set($this->_cache_key.'_value', array('cached'=>true,'value'=>$val)); $mec->close(); return true; } // ]> // <![一些数据库维护,例如:清空删除数据库、表,数据表优化等][ // 功能后续添加 // ]> // 调试信息 private function alert($message) { if (!$this->_debug) return; echo '<div style="border:2px solid #000;margin:10px;padding:10px;">'; echo $message; echo '<hr/>'; echo mysql_error(); echo '</div>'; exit; } // 记录调试 private function trace($message) { if (!$this->_debug) return; $this->_trace[] = array('timer'=>microtime(), 'mmusage'=>memory_get_usage(), 'message'=>$message); } // 输出调试 public function trace_output() { if (!$this->_debug) return; echo '<div style="border:2px solid #000;margin:10px;padding:10px;">'; echo '<ul>'; foreach ($this->_trace as $i => $trace) { $timer_e = explode(' ', $trace['timer']); $timer = (float)$timer_e[0]; $mmusage = $trace['mmusage']; echo '<li>Time: '.$timer.' <font color="#0FC69D">+'.($timer-$last_timer).'</font> Memory: '.$trace['mmusage'].' <font color="#E56298">+'.($mmusage-$last_mmusage).'</font> Call: '.$trace['message'].'</li>'; $last_timer = $timer; $last_mmusage = $mmusage; } echo '</ul>'; echo '</div>'; } } ?>
具体使用方法:
<?php include 'class.mysql.php'; echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; $conf_info = array ( // 开启调试 'debug'=>true, // MySQL主机 'host'=>'localhost:3306', // 用户 'username'=>'run', // 密码 'password'=>'moyo', // 数据库 'database'=>'test', // 数据表前缀 'prefix' => '', // 数据库编码 'charset'=>'utf8', // 缓存方式 // memcache缓存协议,“://” 后面的是服务器地址 //'cached'=>'memcache://127.0.0.1:11211' // 文本缓存协议,“://”后面的是缓存地址。可用的标记:{root} 站点根目录, {current} 当前脚本目录 'cached'=>'file://{current}/query_cache/' ); // 获取实例 $dbc = db_mysql::getInstance(); // 载入配置 [只支持数组方式] $dbc->config($conf_info); $start = explode(' ', microtime()); $memory_start = memory_get_usage(); // 插入数据 $affect = $dbc // 操作表:user ->insert('user') // 支持数组方式 ->data(array('name'=>"Moyo")) // 支持字符方式 ->data('mail="moyo@mail"') ->done(); echo $dbc->sql; echo '<p></p>'; echo 'INSERT 操作完成,影响行数:'.$affect; echo '<hr/>'; // 修改数据 $affect = $dbc ->update('user') // 支持数组方式 ->where(array('name'=>'Moyo')) // 支持字符方式 ->where('mail="moyo@mail"') ->data(array('name'=>"Moyo.live", 'mail'=>'moyo@uuland')) ->done(); echo $dbc->sql; echo '<p></p>'; echo 'UPDATE 操作完成,影响行数:'.$affect; echo '<hr/>'; // 获取数据 $result = $dbc ->select('user') ->where('name like "%Moyo%"') ->order('id.desc') ->limit(3) // 使用缓存,有效时间:10秒 [单位支持:d 天,h 时, m 分, s 秒] ->cache('s:10') ->done(); echo $dbc->sql; echo '<p></p>'; echo 'SELECT 完成,记录数:'.count($result); echo '<pre>'; print_r($result); echo '</pre>'; echo '<hr/>'; // 删除数据 $affect = $dbc ->delete('user') ->where('name="Moyo.live"') ->done(); echo $dbc->sql; echo '<p></p>'; echo 'DELETE 操作完成,影响行数:'.$affect; echo '<hr/>'; $finish = explode(' ', microtime()); $memory_finish = memory_get_usage(); $start = $start[1]+$start[0]; $finish = $finish[1]+$finish[0]; $time = $finish-$start; $memory = $memory_finish-$memory_start; echo 'Trace (Time use '.$time.' Sec , Memory use '.$memory_finish.' Bytes , Incress '.$memory.' Bytes)'; echo '<hr width="30%" align="left" />'; $dbc->trace_output(); ?>