[PHP]
//********************************************
//* Explain:数据库连接,根据配置文件中的参数进行数据库
//* 连接,连接失败即返回错误代码(代码的具体内容可以
//* 在配置文件中定制),连接成功将返回一个数据库连接对象
//* FileFormat:UTF-8
//* Author:Arvin(Yangl2006)
//* QQ:8769852
//* By:2008-6-7
//********************************************
Class DataBase extends PdoConfig
{
//配置文件
private $_PdoConfig;
//数据库连接参数
private $_Connect;
//其他配置参数
private $_OtherConnect;
//数据库连接
private static $_DbManager;
//允许将更新后的PdoConfig传进来
public function __construct($Obj = false)
{
if(is_object($Obj))
{
$this->_PdoConfig = $Obj;
}else{
$this->_PdoConfig = parent::Init();
}
$this->_Connect = $this->_PdoConfig->ConnectConfig();
$this->_OtherConnect = $this->_PdoConfig->ParameterConfig();
}
public function ConnectData()
{
if(self::$_DbManager === null)//当连接不存在时才进行连接否则使用原来的连接
{
try {
self::$_DbManager = new PDO(
"mysql:host=".$this->_Connect['Db_Host'].";dbname=".$this->_Connect['Db_DataName'].";port=".$this->_Connect['Db_Port']."",
$this->_Connect['Db_User'],$this->_Connect['Db_PassWord'],$this->setLongMode($this->_OtherConnect['LongMode']));
}
catch( PDOException $e )//出错提示
{
exit( $e->__toString());
}
self::$_DbManager->exec('set names \'utf8\'');//默认编码
//设置字段显示方式
$this->setFieldMode($this->_OtherConnect['FieldMode']);
//设置错误显示方式
$this->setErrorShowMode($this->_OtherConnect['ErrorShowMode']);
//设置空格转换方式
$this->setNullMode($this->_OtherConnect['NullMode']);
//设置自动提交方式
$this->setAutoMode($this->_OtherConnect['AutoMode']);
}
return self::$_DbManager;
}
/**
* 字段名强制转换成大写或小写
* PDO::CASE_LOWER: 强制列名是小写
* PDO::CASE_NATURAL: 列名按照原始的方式
* PDO::CASE_UPPER: 强制列名为大写
* (默认:列名按照原始的方式)
*/
protected function setFieldMode($num)
{
$Parameter[0] = PDO::CASE_LOWER;
$Parameter[1] = PDO::CASE_NATURAL;
$Parameter[2] = PDO::CASE_UPPER;
self::$_DbManager->setAttribute(PDO::ATTR_CASE,$Parameter[$num]);
}
/**
* 错误提示方式
* PDO::ERRMODE_SILENT: 不显示错误信息,只显示错误码
* PDO::ERRMODE_WARNING: 显示警告错误
* PDO::ERRMODE_EXCEPTION: 抛出异常
* (默认:抛出异常)
*/
protected function setErrorShowMode($num)
{
$Parameter[0] = PDO::ERRMODE_SILENT;
$Parameter[1] = PDO::ERRMODE_WARNING;
$Parameter[2] = PDO::ERRMODE_EXCEPTION;
self::$_DbManager->setAttribute(PDO::ATTR_ERRMODE,$Parameter[$num]);
}
/**
* 指定数据库返回的NULL值在php中对应的数值
* PDO::NULL_NATURAL: 不变
* PDO::NULL_EMPTY_STRING: 空字符转换成 NULL.
* PDO::NULL_TO_STRING: NULL 转换成空字符
* (默认:不变)
*/
protected function setNullMode($num)
{
$Parameter[0] = PDO::NULL_NATURAL;
$Parameter[1] = PDO::NULL_EMPTY_STRING;
$Parameter[2] = PDO::NULL_TO_STRING;
self::$_DbManager->setAttribute(PDO::ATTR_ORACLE_NULLS,$Parameter[$num]);
}
/**
* 是否开启持久连接
* (默认:开启)
*/
protected function setLongMode($num)
{
$Parameter[0] = array(PDO::ATTR_PERSISTENT => TRUE);
$Parameter[1] = array(PDO::ATTR_PERSISTENT => FALSE);
return $Parameter[$num];
}
/**
* 是否开启自动提交功能
* (默认:开启)
*/
protected function setAutoMode($num)
{
$Parameter[0] = true;
$Parameter[1] = false;
self::$_DbManager->setAttribute(PDO::ATTR_AUTOCOMMIT,$Parameter[$num]);
}
}
?>
[/PHP]
数据库接口类
[PHP]
//********************************************
//* Explain:数据库对外接口,所有数据调用与执行统一使用
//* 此类接口,支持常规语句操作(select|update|insert|delete)、
//* 预处理语句以及事务处理语句.
//* FileFormat:UTF-8
//* Author:Arvin(Yangl2006)
//* QQ:8769852
//* By:2008-6-8
//********************************************
include_once 'PdoConfig.php';
class DataBaseSql
{
protected $_Sql;
protected $_SqlValue;
protected $_Db;
protected $_DataMode;
protected $_DataType;
public function __construct()
{
$this->_Db = new DataBase;
$this->_Db = $this->_Db->ConnectData();
$this->_DataMode = PDO::FETCH_BOTH;
$this->_DataType = array('fetchAll',0);
}
//设置SQL语句
public function setSql($Sql)
{
$this->_Sql= $Sql;
}
//设置SQL的值
public function setSqlValue($SqlValue)
{
$this->_SqlValue = $SqlValue;
}
protected function CheckSql()
{
if(!empty($this->_Sql) && !empty($this->_SqlValue))
{
for($i=0;$i_SqlValue);$i++)
{
if(count($this->_SqlValue[$i]) !== substr_count($this->_Sql,"?"))
{
echo "SQL Error! ";
echo "Sql: ".$this->_Sql." Value: ";
echo implode(",",$this->_SqlValue[$i]);
exit;
}
}
return true;
}else{
return false;
}
}
/**
* 返回的数据方式,共有四种形式:
* PDO::FETCH_ASSOC -- 关联数组形式
* PDO::FETCH_NUM -- 数字索引数组形式
* PDO::FETCH_BOTH -- 两者数组形式都有
* PDO::FETCH_OBJ -- 按照对象的形式
* (默认:数字索引和数组形式都有)
*/
public function setDataMode($num)
{
$Parameter[0] = PDO::FETCH_ASSOC;
$Parameter[1] = PDO::FETCH_NUM;
$Parameter[2] = PDO::FETCH_BOTH;
$Parameter[3] = PDO::FETCH_OBJ;
//检测是否属于该方式范围
if(array_key_exists($num,$Parameter))
{
$this->_DataMode = $Parameter[$num];
}
}
/**
* 返回的数据类型,共有三种:
* lastInsertId -- 最新插入到数据库的ID
* columnCount -- 结果集中的列的数量
* rowCount -- 语句执行后影响的行数
* fetchAll -- 包含了所有行的数组
* fetch -- 结果集中取出一行
* fetchColumn -- 结果集中某一列中的数据
* getColumnMeta -- 返回结果集中某一列的结构
* (默认:包含了所有行的数组)
*/
public function setDataType($DataType)
{
$Parameter[0] = 'lastInsertId';
$Parameter[1] = 'columnCount';
$Parameter[2] = 'rowCount';
$Parameter[3] = 'fetchAll';
$Parameter[4] = 'fetch';
$Parameter[5] = 'fetchColumn';
$Parameter[6] = 'getColumnMeta';
if(!is_array($DataType))
{
$DataType = array($DataType,0);
}
if($DataType[0] == 0)
{
if(strpos(strtolower($this->_Sql),'insert into') === false)
{
echo "错误: 仅只有 insert into 语句才能获取最新插入到数据库的ID! 请重新设置返回的数据类型" ;
exit;
}
}
$this->_DataType = array($Parameter[$DataType[0]],$DataType[1]);
}
}
interface DataManage
{
//执行SQL语句
public function PerformSql();
}
final Class DataBaseAPI
{
private $_Sql;
private $_SqlValue;
/**
* 返回的数据方式,共有四种形式:
* 0 -- 关联数组形式
* 1 -- 数字索引数组形式
* 2 -- 两者数组形式都有
* 3 -- 按照对象的形式
* (默认:数字索引和数组形式都有)
*/
private $_DataMode = 2;
/**
* 返回的数据类型,共有三种:
* 0 -- 最新插入到数据库的ID
* 1 -- 结果集中的列的数量
* 2 -- 语句执行后影响的行数
* 3 -- 包含了所有行的数组
* 4 -- 结果集中取出一行
* 5 -- 结果集中某一列中的数据 格式:array(5,1) 表示返回第1列的数据
* 6 -- 返回结果集中某一列的结构 格式:array(6,3) 表示返回第3列的结构
* (默认:包含了所有行的数组)
*/
private $_DataType = 3;
/**
* 数据执行的工作类型,共有三种:
* 1:单条预处理执行方式
* 2:多条预处理执行方式
* 3:多条事务处理方式 *
* 默认为:单条预处理执行方式
*/
private $_WorkType;
private $_WorkData;
//数据处理对象
private $_WordObj;
private function __construct()
{
//单条预处理执行方式
$this->_WorkData[0]= 'DataBaseGeneral';
//多条预处理执行方式
$this->_WorkData[1]= 'DataBasePretreatment';
//多条事务处理方式
$this->_WorkData[2]= 'DataBaseTransaction';
}
public function Init()
{
return new DataBaseAPI;
}
//设置工作方式
public function setWorkType($WorkType)
{
if(!array_key_exists($WorkType,$this->_WorkData))
{
$WorkType = 0;
}
$this->_WorkType= $WorkType;
}
//设置数据类型
public function setDataType($DataType)
{
$this->_DataType= $DataType;
}
//设置获取数据方式
public function setDataMode($DataMode)
{
$this->_DataMode = $DataMode;
}
//设置SQL语句
public function setSql($Sql)
{
$this->_Sql= $Sql;
}
//设置SQL的值
public function setValue($SqlValue)
{
$this->_SqlValue[]= $SqlValue;
}
public function Perform()
{
$this->_WordObj = new $this->_WorkData[$this->_WorkType];
$this->_WordObj->setSql($this->_Sql);
$this->_WordObj->setSqlValue($this->_SqlValue);
$this->_WordObj->setDataMode($this->_DataMode);
$this->_WordObj->setDataType($this->_DataType);
return $this->_WordObj->PerformSql();
}
}
?>
[/PHP]
单条SQL预处理方式
[PHP]
//********************************************
//* Explain:最基础的数据处理,但不包括预处理和事务处理
//* FileFormat:UTF-8
//* Author:Arvin(Yangl2006)
//* QQ:8769852
//* By:2008-6-8
//********************************************
class DataBaseGeneral extends DataBaseSql implements DataManage
{
private $_Sth;
private $_getData;
//执行SQL语句
public function PerformSql()
{
if(parent::CheckSql())
{
try{
//绑定SQL
$this->_Sth = $this->_Db->prepare($this->_Sql);
/*
* 循环将参数绑到上面的SQL语句中并执行,将返回的结果进行保存
*/
for($i=0;$i_SqlValue[0]);$i++)
{
$this->_Sth->bindParam($i+1,$this->_SqlValue[0][$i]);
}
$this->_Sth->execute();
@$this->_Sth->setFetchMode($this->_DataMode);
if($this->_DataType[0] == 'lastInsertId')
{
$this->_getData = $this->_Db->{$this->_DataType[0]}($this->_DataType[1]);
}else{
$this->_getData = $this->_Sth->{$this->_DataType[0]}($this->_DataType[1]);
}
}catch (Exception $e) {
echo "Failed: " . $e->getMessage();
}
}
return $this->_getData;
}
}
?>
[/PHP]
|
多条预处理类
[PHP]
//********************************************
//* Explain:预处理接口,用户传入一条SQL语句后可传入多个
//* 相同类型的条件,进行多个处理,如同时插入几条记录
//* FileFormat:UTF-8
//* Author:Arvin(Yangl2006)
//* QQ:8769852
//* By:2008-6-8
//********************************************
class DataBasePretreatment extends DataBaseSql implements DataManage
{
private $_Sth;
private $_getData = array();
//执行SQL语句
public function PerformSql()
{
if(parent::CheckSql())
{
try{
//绑定SQL
$this->_Sth = $this->_Db->prepare($this->_Sql);
/*
* 循环将参数绑到上面的SQL语句中并执行,将返回的结果进行保存
*/
foreach ($this->_SqlValue as $key=>$value)
{
for($i=0;$i
{
$a[$i] = $value[$i];
if($key == 0)
{
$this->_Sth->bindParam($i+1,$a[$i]);
}
}
$this->_Sth->execute();
@$this->_Sth->setFetchMode($this->_DataMode);
if($this->_DataType[0] == 'lastInsertId')
{
$data = $this->_Db->{$this->_DataType[0]}($this->_DataType[1]);
}else{
$data = $this->_Sth->{$this->_DataType[0]}($this->_DataType[1]);
}
/*
* 如果返回的结果是非数组的形式即使用数组保存
* 如果返回的结果是数组将所有的数组结果进行合并
*/
if(is_array($data))
{
$this->_getData = array_merge($this->_getData,$data);
}else{
$this->_getData[] = $data;
}
}
}catch (Exception $e) {
echo "Failed: " . $e->getMessage();
}
}
return $this->_getData;
}
}
?>
[/PHP]
事务处理类
[PHP]
//********************************************
//* Explain:事务处理类,只有数据库支持事务才能使用否则将
//* 有严重错误提示
//* FileFormat:UTF-8
//* Author:Arvin(Yangl2006)
//* QQ:8769852
//* By:2008-6-8
//********************************************
class DataBaseTransaction extends DataBaseSql implements DataManage
{
private $_Sth;
private $_getData;
//执行SQL语句
public function PerformSql()
{
if(parent::CheckSql())
{
try{
//事务开始
$this->_Db->beginTransaction();
//绑定SQL
$this->_Sth = $this->_Db->prepare($this->_Sql);
/*
* 循环将参数绑到上面的SQL语句中并执行,将返回的结果进行保存
*/
foreach ($this->_SqlValue as $key=>$value)
{
for($i=0;$i
{
$a[$i] = $value[$i];
if($key == 0)
{
$this->_Sth->bindParam($i+1,$a[$i]);
}
}
$this->_Sth->execute();
@$this->_Sth->setFetchMode($this->_DataMode);
if($this->_DataType[0] == 'lastInsertId')
{
$data = $this->_Db->{$this->_DataType[0]}($this->_DataType[1]);
}else{
$data = $this->_Sth->{$this->_DataType[0]}($this->_DataType[1]);
}
/*
* 如果返回的结果是非数组的形式即使用数组保存
* 如果返回的结果是数组将所有的数组结果进行合并
*/
if(is_array($data))
{
$this->_getData = array_merge($this->_getData,$data);
}else{
$this->_getData[] = $data;
}
}
//事务处理完毕
$this->_Db->commit();
}catch (Exception $e) {
//事务强行终止
$this->_Db->rollBack();
echo "Failed: " . $e->getMessage();
}
}
return $this->_getData;
}
}
?>
[/PHP]
事务处理类
[PHP]
//********************************************
//* Explain:事务处理类,只有数据库支持事务才能使用否则将
//* 有严重错误提示
//* FileFormat:UTF-8
//* Author:Arvin(Yangl2006)
//* QQ:8769852
//* By:2008-6-8
//********************************************
class DataBaseTransaction extends DataBaseSql implements DataManage
{
private $_Sth;
private $_getData;
//执行SQL语句
public function PerformSql()
{
if(parent::CheckSql())
{
try{
//事务开始
$this->_Db->beginTransaction();
//绑定SQL
$this->_Sth = $this->_Db->prepare($this->_Sql);
/*
* 循环将参数绑到上面的SQL语句中并执行,将返回的结果进行保存
*/
foreach ($this->_SqlValue as $key=>$value)
{
for($i=0;$i
{
$a[$i] = $value[$i];
if($key == 0)
{
$this->_Sth->bindParam($i+1,$a[$i]);
}
}
$this->_Sth->execute();
@$this->_Sth->setFetchMode($this->_DataMode);
if($this->_DataType[0] == 'lastInsertId')
{
$data = $this->_Db->{$this->_DataType[0]}($this->_DataType[1]);
}else{
$data = $this->_Sth->{$this->_DataType[0]}($this->_DataType[1]);
}
/*
* 如果返回的结果是非数组的形式即使用数组保存
* 如果返回的结果是数组将所有的数组结果进行合并
*/
if(is_array($data))
{
$this->_getData = array_merge($this->_getData,$data);
}else{
$this->_getData[] = $data;
}
}
//事务处理完毕
$this->_Db->commit();
}catch (Exception $e) {
//事务强行终止
$this->_Db->rollBack();
echo "Failed: " . $e->getMessage();
}
}
return $this->_getData;
}
}
?>
[/PHP]
转载自:
|
|
|
|
|