<?php
/**
* MySQL操作类
*
* Usage:
* <code>
* include 'bootstrap.php';
* $db = new HWSL_Db_Mysql();
* $db->query($sql = 'select * from table_a');
* echo 'data rows:'.$db->numRows()."\n";
* $result = $db->fetchAll();
* print_r($result);
*
* $db->update($table='table_a', $data=array('name'=>'data1'), $where='id=1');
* echo 'update rows:'.$db->affectedRows()."\n";
*
* $db->query($sql = 'select * from table_a where id=1');
* $result = $db->fetchRow();
* print_r($result);
*
* $db->insert($table='table_a', $data=array('name'=>'data2'));
* $lastId = $db->insertId();
* echo 'last id:'.$lastId."\n";
* echo 'insert rows:'.$db->affectedRows()."\n";
*
* $db->delete($table='table_a', $where='id='.$lastId);
* echo $db->getSql()."\n";
* echo 'delete rows:'.$db->affectedRows()."\n";
*
* echo $db->total('table_a')."\n";
* </code>
*
*/
class Db_Mysql{
/**
* 当前查询SQL语句
* @var string
*/
protected static $_sql = '';
/**
* mysqli 对象
* @var mixed
*/
protected static $_mysqli = null;
/**
* 当前结果集
* @var mixed
*/
protected static $_result = false;
/**
* 错误信息
* @var string
*/
protected static $_error = '';
/**
* 错误日志位置
* @var string
*/
protected static $_log = '/tmp/mysql-error.log';
/**
* 配置信息 //< HOST||PORT||DATABASENAME||USERNAME||PASSWORD||CHARSET
* @var string
*/
protected static $_config = '';
/** Method Constructor()
*
* @param string $config 配置字串
* @return void
*/
public function __construct($config = '') {
if(empty($config)){
self::$_config = @$_SERVER['PROJECT_MYSQL_SERVER'];
}else{
self::$_config = $config;
}
if(!preg_match('/^[^\|]+(?:\|\|[^\|]+){5}$/', self::$_config)){
throw new HWSL_Exception('Mysql config type is error!');
}
}
/** Method Destructor()
*
*/
public function __destruct() {
self::freeResult();
//TODO : 不用close连接?
//self::closeDb();
}
/**
* 执行查询
*
* @param string $sql SQL查询语句
* @return mixed 成功赋值并返回self::$result; 失败返回 false 如果有事务则回滚
*/
public static function query($sql) {
self :: _connect();
self :: $_sql = $sql;
self :: $_result = self :: $_mysqli -> query($sql);
if (self :: $_mysqli -> error) {
self :: $_error = self :: $_mysqli -> error;
self :: log();
return false;
}
return self :: $_result;
}
/**
* 查询指定SQL 第一行,第一列 值
*
* @param string $sql SQL查询语句
* @return mixed 失败返回 false
*/
public static function dataOne($sql) {
if (self :: $_result = self :: query($sql)) {
return self :: fetchOne();
} else {
return false;
}
}
/**
* 查询指定SQL 第一行记录
*
* @param string $sql SQL查询语句
* @param mixed $assoc true 返回数组; false 返回stdClass对象;默认 false
* @return 失败返回 false
*/
public static function dataRow($sql, $assoc = false) {
if (self :: $_result = self :: query($sql)) {
return self :: fetchRow(self :: $_result, $assoc);
} else {
return false;
}
}
/**
* 查询指定SQL 所有记录
*
* @param string $sql SQL查询语句
* @param boolean $key_field 指定记录结果键值使用哪个字段,默认为 false 使用 i{0...count}
* @param mixed $assoc true 返回数组; false 返回stdClass对象;默认 true
* @return 失败返回 false
*/
public static function dataTable($sql, $key_field = false, $assoc = true) {
if (self :: $_result = self :: query($sql)) {
return self :: fetchAll($key_field, $assoc);
} else {
return false;
}
}
/**
* 取结果(self::$result)中第一行,第一列值
*
* @return mixed 没有结果返回 false
*/
public static function fetchOne() {
if (!empty(self :: $_result)) {
$row = self :: $_result -> fetch_array();
return $row[0];
} else {
return false;
}
}
/**
* 取结果$result中第一行记录
*
* @param object $result 查询结果数据集
* @param boolean $assoc true 返回数组; false 返回stdClass对象;默认 true
* @return mixed 没有结果返回 false
*/
public static function fetchRow($result = null , $assoc = true) {
if ($result == null) $result = self :: $_result;
if (empty($result)) {
return false;
}
if ($assoc) {
$_result = $result -> fetch_assoc();
if($_result) $_result = array_change_key_case($_result, CASE_UPPER);
return $_result;
} else {
return $result -> fetch_object();
}
}
/**
* 取结果(self::$result)中所有记录
*
* @param string $keyField 指定记录结果键值使用哪个字段,默认为 false 则使用 i{0...count}
* @param boolean $assoc true 返回数组; false 返回stdClass对象;默认 true
* @return mixed 没有结果返回 false
*/
public static function fetchAll($keyField = false, $assoc = true) {
$rows = ($assoc) ? array() : new stdClass;
$i = -1;
while ($row = self :: fetchRow(self :: $_result, $assoc)) {
if ($keyField != false) {
$i = ($assoc) ? $row[$keyField] : $row -> $keyField;
} else {
$i++;
}
if ($assoc) {
$rows[$i] = $row;
} else {
$rows -> {$i} = $row;
}
}
return ($i > -1) ? $rows : false;
}
/**
* 执行更新数据操作
*
* @param string $table 数据库表名称
* @param array $data 待更新的数据
* @param string $where 更新条件
* @return boolean 成功 true; 失败 false
*/
public static function update($table, $data, $where) {
$set = '';
if (is_object($data) || is_array($data)) {
foreach ($data as $k => $v) {
self :: _formatValue($v);
$set .= empty($set) ? ("`{$k}` = {$v}") : (", `{$k}` = {$v}");
}
} else {
$set = $data;
}
return self :: query("UPDATE `{$table}` SET {$set} WHERE {$where}");
}
/**
* 执行插入数据操作
*
* @param string $table 数据库表名称
* @param array $data 待插入的数据
* @param string $fields 数据库字段,默认为 null。 为空时取 $data的 keys
* @return boolean 成功 true; 失败 false
*/
public static function insert($table, $data, $fields = null) {
if ($fields == null) {
foreach($data as $v) {
if (is_array($v)) {
$fields = array_keys($v);
} elseif (is_object($v)) {
foreach($v as $k2 => $v2) {
$fields[] = $k2;
}
} elseif (is_array($data)) {
$fields = array_keys($data);
} elseif (is_object($data)) {
foreach($data as $k2 => $v2) {
$fields[] = $k2;
}
}
break;
}
}
$_fields = '`' . implode('`, `', $fields) . '`';
$_data = self :: _formatInsertData($data);
return self :: query("INSERT INTO `{$table}` ({$_fields}) VALUES {$_data}");
}
/**
* 执行替换数据操作
*
* @param string $table 数据库表名称
* @param array $data 待更新的数据
* @param string $fields 数据库字段,默认为 null。 为空时取 $data的 keys
* @return boolean 成功 true; 失败 false
*/
public static function replace($table, $data, $fields = null) {
if ($fields == null) {
foreach($data as $v) {
if (is_array($v)) {
$fields = array_keys($v);
} elseif (is_object($v)) {
foreach($v as $k2 => $v2) {
$fields[] = $k2;
}
} elseif (is_array($data)) {
$fields = array_keys($data);
} elseif (is_object($data)) {
foreach($data as $k2 => $v2) {
$fields[] = $k2;
}
}
break;
}
}
$_fields = '`' . implode('`, `', $fields) . '`';
$_data = self :: _formatInsertData($data);
return self :: query("REPLACE INTO `{$table}` ({$_fields}) VALUES {$_data}");
}
/**
* 更新计数器
*
* @param string $table 数据库表名称
* @param array $field 待更新的字段名
* @param string $where 更新条件
* @param int $step 增加的步长,默认每次+1
* @return boolean 成功 true; 失败 false
*/
public static function increase($table, $field, $where, $step = 1) {
return self :: query("UPDATE `{$table}` SET `{$field}`=`{$field}`+{$step} WHERE {$where}");
}
/**
* 格式化插入数据
*
* @param mixed $data [array|stdClass] 待格式化的插入数据
* @return string insert 中 values 后的 SQL格式
*/
protected static function _formatInsertData($data) {
$output = '';
$is_list = false;
foreach ($data as $value) {
if (is_object($value) || is_array($value)) {
$is_list = true;
$tmp = '';
foreach ($value as $v) {
self :: format_value($v);
$tmp .= !empty($tmp) ? ", {$v}" : $v;
}
$tmp = "(" . $tmp . ")";
$output .= !empty($output) ? ", {$tmp}" : $tmp;
unset($tmp);
} else {
self :: _formatValue($value);
$output .= !empty($output) ? ", {$value}" : $value;
}
}
if (!$is_list) $output = '(' . $output . ')';
return $output;
}
/**
* 格式化值
*
* @param string &$value [string] 待格式化的字符串,格式成可被数据库接受的格式
* @return void
*/
protected static function _formatValue(&$value) {
$value = trim($value);
if ($value === null) {
$value = 'NULL';
} elseif (preg_match('/\[\w+\]\.\(.*?\)/', $value)) { // mysql函数 格式:[UNHEX].(参数);
$value = preg_replace('/\[(\w+)\]\.\((.*?)\)/', "$1($2)", $value);
} else {
$value = "'" . addslashes(stripslashes($value)) . "'";
}
}
/**
* 返回最后一次插入的ID
* return mixed
*/
public static function insertId() {
return self :: $_mysqli -> insert_id;
}
/**
* 执行删除数据操作
*
* @param string $table 数据库表名称
* @param string $where 删除条件,默认为删除整个表数据!!
* @return boolean 成功 true; 失败 false
*/
public static function delete($table, $where = '') {
return self :: query("DELETE FROM {$table} ".($where ? " WHERE {$where}" : ''));
}
/***
* *返回结果集数量
*
* @param $result [数据集]
* @return int
*/
public static function numRows($result = null) {
if (is_null($result)) $result = self :: $_result;
return mysqli_num_rows($result);
}
/**
* 统计表记录
*
* @param string $table 数据库表名称
* @param string $where SQL统计条件,默认为查询整个表
* @return mixed
*/
public static function total($table, $where = '') {
$sql = "SELECT count(*) FROM {$table} ".($where ? "WHERE {$where}" : '');
self :: query($sql);
return self :: fetchOne();
}
/**
* 返回当前查询SQL语句
* @return string
*/
public static function getSql() {
return self :: $_sql;
}
/**
* 返回错误信息
* @return string
*/
public static function getError() {
return self :: $_error;
}
/**
* 记录日志
* @param string $_msg 日志内容
* @return void
*/
public static function log($_msg = '') {
if(!$_msg){
list($usec, $sec) = explode(' ', microtime());
$_msg = '[' . date('Y-m-d H:i:s.') . substr($usec, 2, 3) . '][query: ' . self :: $_sql . '][error: ' . self :: $_error . ']' . PHP_EOL;
}
error_log($_msg, 3, self :: $_log);
}
/**
* 返回当前SQL影响的记录数
* @return mixed
*/
public static function affectedRows() {
return self :: $_mysqli -> affected_rows;
}
/**
* 释放数据集
* return void
*/
public static function freeResult($result = null) {
if (is_null($result)) $result = self :: $_result;
@mysqli_free_result($result);
}
/**
* 关闭数据库连接
* return void
*/
public static function close($mysqli = null) {
if (is_null($mysqli)) $mysqli = self :: $_mysqli;
@mysqli_close($mysqli);
self :: freeResult();
self :: $_mysqli = null;
}
/**
* 选择数据库
*
* @param string $dbname 数据库名称
* @return resourse
*/
public static function selectDb($dbname) {
self :: _connect();
return self :: $_mysqli -> select_db($dbname);
}
/**
* 连接Mysql
* @return boolean 成功true,失败false
*/
protected static function _connect() {
if (is_null(self :: $_mysqli)) {
//Get config of Database
$_arr = explode('||', self::$_config);
$_host = $_arr[0]; //< Mysql host
$_port = $_arr[1]; //< Mysql port
$_dbName = $_arr[2]; //< Database name
$_userName = $_arr[3]; //< User name
$_userPwd = $_arr[4]; //< User password
$_charset = str_replace('-', '', $_arr[5]); //< Charset UTF-8 -> UTF8
self :: $_mysqli = new mysqli($_host, $_userName, $_userPwd, $_dbName, $_port);
if (mysqli_connect_errno()) {
self :: $_error = "Database Connect failed: ". mysqli_connect_error();
self :: log();
return false;
} else {
self :: $_mysqli -> query("
SET character_set_connection=" . $_charset .
", character_set_results=" . $_charset .
", character_set_client=binary"
);
}
}
return true;
}
}
// Oracle操作类
class Db_Oracle{}
// 统一Db操作类
class Db {
/**
* 工厂方法
*
* @param string $config $_SERVER配置变量名,配置设置格式:DBTYPE||HOST||PORT||DBNAME||USERNAME||PASSWORD||CHARSET
* @return 数据库类实例
*/
public static function factory($config) {
$_arr = explode('||', $config, 2);
$_arr[0] = strtoupper($_arr[0]);
if(isset($GLOBALS['DBCONN_' . $_arr[0]])){
$dbAdapter = $GLOBALS['DBCONN_' . $_arr[0]];
} else {
$adapterName = __CLASS__ . '_' . ucfirst(strtolower($_arr[0]));
$dbAdapter = new $adapterName($_arr[1]);
$GLOBALS['DBCONN_' . $config] = $dbAdapter;
}
return $dbAdapter;
}
}
// 测试用例
$db = Db::factory("mysql||127.0.0.1||3306||blog||sl||sl||UTF-8");
$db->query($sql = 'select * from sl_users');
echo 'data rows:'.$db->numRows()."\n";
$result = $db->fetchAll();
print_r($result);
/**
* MySQL操作类
*
* Usage:
* <code>
* include 'bootstrap.php';
* $db = new HWSL_Db_Mysql();
* $db->query($sql = 'select * from table_a');
* echo 'data rows:'.$db->numRows()."\n";
* $result = $db->fetchAll();
* print_r($result);
*
* $db->update($table='table_a', $data=array('name'=>'data1'), $where='id=1');
* echo 'update rows:'.$db->affectedRows()."\n";
*
* $db->query($sql = 'select * from table_a where id=1');
* $result = $db->fetchRow();
* print_r($result);
*
* $db->insert($table='table_a', $data=array('name'=>'data2'));
* $lastId = $db->insertId();
* echo 'last id:'.$lastId."\n";
* echo 'insert rows:'.$db->affectedRows()."\n";
*
* $db->delete($table='table_a', $where='id='.$lastId);
* echo $db->getSql()."\n";
* echo 'delete rows:'.$db->affectedRows()."\n";
*
* echo $db->total('table_a')."\n";
* </code>
*
*/
class Db_Mysql{
/**
* 当前查询SQL语句
* @var string
*/
protected static $_sql = '';
/**
* mysqli 对象
* @var mixed
*/
protected static $_mysqli = null;
/**
* 当前结果集
* @var mixed
*/
protected static $_result = false;
/**
* 错误信息
* @var string
*/
protected static $_error = '';
/**
* 错误日志位置
* @var string
*/
protected static $_log = '/tmp/mysql-error.log';
/**
* 配置信息 //< HOST||PORT||DATABASENAME||USERNAME||PASSWORD||CHARSET
* @var string
*/
protected static $_config = '';
/** Method Constructor()
*
* @param string $config 配置字串
* @return void
*/
public function __construct($config = '') {
if(empty($config)){
self::$_config = @$_SERVER['PROJECT_MYSQL_SERVER'];
}else{
self::$_config = $config;
}
if(!preg_match('/^[^\|]+(?:\|\|[^\|]+){5}$/', self::$_config)){
throw new HWSL_Exception('Mysql config type is error!');
}
}
/** Method Destructor()
*
*/
public function __destruct() {
self::freeResult();
//TODO : 不用close连接?
//self::closeDb();
}
/**
* 执行查询
*
* @param string $sql SQL查询语句
* @return mixed 成功赋值并返回self::$result; 失败返回 false 如果有事务则回滚
*/
public static function query($sql) {
self :: _connect();
self :: $_sql = $sql;
self :: $_result = self :: $_mysqli -> query($sql);
if (self :: $_mysqli -> error) {
self :: $_error = self :: $_mysqli -> error;
self :: log();
return false;
}
return self :: $_result;
}
/**
* 查询指定SQL 第一行,第一列 值
*
* @param string $sql SQL查询语句
* @return mixed 失败返回 false
*/
public static function dataOne($sql) {
if (self :: $_result = self :: query($sql)) {
return self :: fetchOne();
} else {
return false;
}
}
/**
* 查询指定SQL 第一行记录
*
* @param string $sql SQL查询语句
* @param mixed $assoc true 返回数组; false 返回stdClass对象;默认 false
* @return 失败返回 false
*/
public static function dataRow($sql, $assoc = false) {
if (self :: $_result = self :: query($sql)) {
return self :: fetchRow(self :: $_result, $assoc);
} else {
return false;
}
}
/**
* 查询指定SQL 所有记录
*
* @param string $sql SQL查询语句
* @param boolean $key_field 指定记录结果键值使用哪个字段,默认为 false 使用 i{0...count}
* @param mixed $assoc true 返回数组; false 返回stdClass对象;默认 true
* @return 失败返回 false
*/
public static function dataTable($sql, $key_field = false, $assoc = true) {
if (self :: $_result = self :: query($sql)) {
return self :: fetchAll($key_field, $assoc);
} else {
return false;
}
}
/**
* 取结果(self::$result)中第一行,第一列值
*
* @return mixed 没有结果返回 false
*/
public static function fetchOne() {
if (!empty(self :: $_result)) {
$row = self :: $_result -> fetch_array();
return $row[0];
} else {
return false;
}
}
/**
* 取结果$result中第一行记录
*
* @param object $result 查询结果数据集
* @param boolean $assoc true 返回数组; false 返回stdClass对象;默认 true
* @return mixed 没有结果返回 false
*/
public static function fetchRow($result = null , $assoc = true) {
if ($result == null) $result = self :: $_result;
if (empty($result)) {
return false;
}
if ($assoc) {
$_result = $result -> fetch_assoc();
if($_result) $_result = array_change_key_case($_result, CASE_UPPER);
return $_result;
} else {
return $result -> fetch_object();
}
}
/**
* 取结果(self::$result)中所有记录
*
* @param string $keyField 指定记录结果键值使用哪个字段,默认为 false 则使用 i{0...count}
* @param boolean $assoc true 返回数组; false 返回stdClass对象;默认 true
* @return mixed 没有结果返回 false
*/
public static function fetchAll($keyField = false, $assoc = true) {
$rows = ($assoc) ? array() : new stdClass;
$i = -1;
while ($row = self :: fetchRow(self :: $_result, $assoc)) {
if ($keyField != false) {
$i = ($assoc) ? $row[$keyField] : $row -> $keyField;
} else {
$i++;
}
if ($assoc) {
$rows[$i] = $row;
} else {
$rows -> {$i} = $row;
}
}
return ($i > -1) ? $rows : false;
}
/**
* 执行更新数据操作
*
* @param string $table 数据库表名称
* @param array $data 待更新的数据
* @param string $where 更新条件
* @return boolean 成功 true; 失败 false
*/
public static function update($table, $data, $where) {
$set = '';
if (is_object($data) || is_array($data)) {
foreach ($data as $k => $v) {
self :: _formatValue($v);
$set .= empty($set) ? ("`{$k}` = {$v}") : (", `{$k}` = {$v}");
}
} else {
$set = $data;
}
return self :: query("UPDATE `{$table}` SET {$set} WHERE {$where}");
}
/**
* 执行插入数据操作
*
* @param string $table 数据库表名称
* @param array $data 待插入的数据
* @param string $fields 数据库字段,默认为 null。 为空时取 $data的 keys
* @return boolean 成功 true; 失败 false
*/
public static function insert($table, $data, $fields = null) {
if ($fields == null) {
foreach($data as $v) {
if (is_array($v)) {
$fields = array_keys($v);
} elseif (is_object($v)) {
foreach($v as $k2 => $v2) {
$fields[] = $k2;
}
} elseif (is_array($data)) {
$fields = array_keys($data);
} elseif (is_object($data)) {
foreach($data as $k2 => $v2) {
$fields[] = $k2;
}
}
break;
}
}
$_fields = '`' . implode('`, `', $fields) . '`';
$_data = self :: _formatInsertData($data);
return self :: query("INSERT INTO `{$table}` ({$_fields}) VALUES {$_data}");
}
/**
* 执行替换数据操作
*
* @param string $table 数据库表名称
* @param array $data 待更新的数据
* @param string $fields 数据库字段,默认为 null。 为空时取 $data的 keys
* @return boolean 成功 true; 失败 false
*/
public static function replace($table, $data, $fields = null) {
if ($fields == null) {
foreach($data as $v) {
if (is_array($v)) {
$fields = array_keys($v);
} elseif (is_object($v)) {
foreach($v as $k2 => $v2) {
$fields[] = $k2;
}
} elseif (is_array($data)) {
$fields = array_keys($data);
} elseif (is_object($data)) {
foreach($data as $k2 => $v2) {
$fields[] = $k2;
}
}
break;
}
}
$_fields = '`' . implode('`, `', $fields) . '`';
$_data = self :: _formatInsertData($data);
return self :: query("REPLACE INTO `{$table}` ({$_fields}) VALUES {$_data}");
}
/**
* 更新计数器
*
* @param string $table 数据库表名称
* @param array $field 待更新的字段名
* @param string $where 更新条件
* @param int $step 增加的步长,默认每次+1
* @return boolean 成功 true; 失败 false
*/
public static function increase($table, $field, $where, $step = 1) {
return self :: query("UPDATE `{$table}` SET `{$field}`=`{$field}`+{$step} WHERE {$where}");
}
/**
* 格式化插入数据
*
* @param mixed $data [array|stdClass] 待格式化的插入数据
* @return string insert 中 values 后的 SQL格式
*/
protected static function _formatInsertData($data) {
$output = '';
$is_list = false;
foreach ($data as $value) {
if (is_object($value) || is_array($value)) {
$is_list = true;
$tmp = '';
foreach ($value as $v) {
self :: format_value($v);
$tmp .= !empty($tmp) ? ", {$v}" : $v;
}
$tmp = "(" . $tmp . ")";
$output .= !empty($output) ? ", {$tmp}" : $tmp;
unset($tmp);
} else {
self :: _formatValue($value);
$output .= !empty($output) ? ", {$value}" : $value;
}
}
if (!$is_list) $output = '(' . $output . ')';
return $output;
}
/**
* 格式化值
*
* @param string &$value [string] 待格式化的字符串,格式成可被数据库接受的格式
* @return void
*/
protected static function _formatValue(&$value) {
$value = trim($value);
if ($value === null) {
$value = 'NULL';
} elseif (preg_match('/\[\w+\]\.\(.*?\)/', $value)) { // mysql函数 格式:[UNHEX].(参数);
$value = preg_replace('/\[(\w+)\]\.\((.*?)\)/', "$1($2)", $value);
} else {
$value = "'" . addslashes(stripslashes($value)) . "'";
}
}
/**
* 返回最后一次插入的ID
* return mixed
*/
public static function insertId() {
return self :: $_mysqli -> insert_id;
}
/**
* 执行删除数据操作
*
* @param string $table 数据库表名称
* @param string $where 删除条件,默认为删除整个表数据!!
* @return boolean 成功 true; 失败 false
*/
public static function delete($table, $where = '') {
return self :: query("DELETE FROM {$table} ".($where ? " WHERE {$where}" : ''));
}
/***
* *返回结果集数量
*
* @param $result [数据集]
* @return int
*/
public static function numRows($result = null) {
if (is_null($result)) $result = self :: $_result;
return mysqli_num_rows($result);
}
/**
* 统计表记录
*
* @param string $table 数据库表名称
* @param string $where SQL统计条件,默认为查询整个表
* @return mixed
*/
public static function total($table, $where = '') {
$sql = "SELECT count(*) FROM {$table} ".($where ? "WHERE {$where}" : '');
self :: query($sql);
return self :: fetchOne();
}
/**
* 返回当前查询SQL语句
* @return string
*/
public static function getSql() {
return self :: $_sql;
}
/**
* 返回错误信息
* @return string
*/
public static function getError() {
return self :: $_error;
}
/**
* 记录日志
* @param string $_msg 日志内容
* @return void
*/
public static function log($_msg = '') {
if(!$_msg){
list($usec, $sec) = explode(' ', microtime());
$_msg = '[' . date('Y-m-d H:i:s.') . substr($usec, 2, 3) . '][query: ' . self :: $_sql . '][error: ' . self :: $_error . ']' . PHP_EOL;
}
error_log($_msg, 3, self :: $_log);
}
/**
* 返回当前SQL影响的记录数
* @return mixed
*/
public static function affectedRows() {
return self :: $_mysqli -> affected_rows;
}
/**
* 释放数据集
* return void
*/
public static function freeResult($result = null) {
if (is_null($result)) $result = self :: $_result;
@mysqli_free_result($result);
}
/**
* 关闭数据库连接
* return void
*/
public static function close($mysqli = null) {
if (is_null($mysqli)) $mysqli = self :: $_mysqli;
@mysqli_close($mysqli);
self :: freeResult();
self :: $_mysqli = null;
}
/**
* 选择数据库
*
* @param string $dbname 数据库名称
* @return resourse
*/
public static function selectDb($dbname) {
self :: _connect();
return self :: $_mysqli -> select_db($dbname);
}
/**
* 连接Mysql
* @return boolean 成功true,失败false
*/
protected static function _connect() {
if (is_null(self :: $_mysqli)) {
//Get config of Database
$_arr = explode('||', self::$_config);
$_host = $_arr[0]; //< Mysql host
$_port = $_arr[1]; //< Mysql port
$_dbName = $_arr[2]; //< Database name
$_userName = $_arr[3]; //< User name
$_userPwd = $_arr[4]; //< User password
$_charset = str_replace('-', '', $_arr[5]); //< Charset UTF-8 -> UTF8
self :: $_mysqli = new mysqli($_host, $_userName, $_userPwd, $_dbName, $_port);
if (mysqli_connect_errno()) {
self :: $_error = "Database Connect failed: ". mysqli_connect_error();
self :: log();
return false;
} else {
self :: $_mysqli -> query("
SET character_set_connection=" . $_charset .
", character_set_results=" . $_charset .
", character_set_client=binary"
);
}
}
return true;
}
}
// Oracle操作类
class Db_Oracle{}
// 统一Db操作类
class Db {
/**
* 工厂方法
*
* @param string $config $_SERVER配置变量名,配置设置格式:DBTYPE||HOST||PORT||DBNAME||USERNAME||PASSWORD||CHARSET
* @return 数据库类实例
*/
public static function factory($config) {
$_arr = explode('||', $config, 2);
$_arr[0] = strtoupper($_arr[0]);
if(isset($GLOBALS['DBCONN_' . $_arr[0]])){
$dbAdapter = $GLOBALS['DBCONN_' . $_arr[0]];
} else {
$adapterName = __CLASS__ . '_' . ucfirst(strtolower($_arr[0]));
$dbAdapter = new $adapterName($_arr[1]);
$GLOBALS['DBCONN_' . $config] = $dbAdapter;
}
return $dbAdapter;
}
}
// 测试用例
$db = Db::factory("mysql||127.0.0.1||3306||blog||sl||sl||UTF-8");
$db->query($sql = 'select * from sl_users');
echo 'data rows:'.$db->numRows()."\n";
$result = $db->fetchAll();
print_r($result);