PDO封装问题。
网上载了一个PDO的Mysql封装。怎么看都觉得有点问题啊。小弟以前学JAVA的,刚刚接触PHP。代码如下:
<?php
/**
* 数据库PDO操作
*/
class MysqlPdo {
public static $PDOStatement = null;
/**
* 数据库的连接参数配置
* @var array
* @access public
*/
public static $config = array ();
/**
* 是否使用永久连接
* @var bool
* @access public
*/
public static $pconnect = false;
/**
* 错误信息
* @var string
* @access public
*/
public static $error = '';
/**
* 单件模式,保存Pdo类唯一实例,数据库的连接资源
* @var object
* @access public
*/
protected static $link;
/**
* 是否已经连接数据库
* @var bool
* @access public
*/
public static $connected = false;
/**
* 数据库版本
* @var string
* @access public
*/
public static $dbVersion = null;
/**
* 当前SQL语句
* @var string
* @access public
*/
public static $queryStr = '';
/**
* 最后插入记录的ID
* @var integer
* @access public
*/
public static $lastInsertId = null;
/**
* 返回影响记录数
* @var integer
* @access public
*/
public static $numRows = 0;
// 事务指令数
public static $transTimes = 0;
/**
* 构造函数,
* @param $dbconfig 数据库连接相关信息,array('ServerName', 'UserName', 'Password', 'DefaultDb', 'DB_Port', 'DB_TYPE')
*/
public function __construct($dbConfig = '') {
if (! class_exists ( 'PDO' ))
throw_exception ( "不支持:PDO" );
//若没有传输任何参数,则使用默认的数据定义
if (! is_array ( $dbConfig )) {
$dbConfig = array ('hostname' => DB_HOST, 'username' => DB_USER, 'password' => DB_PWD, 'database' => DB_NAME, 'hostport' => DB_PORT, 'dbms' => DB_TYPE, 'dsn' => DB_TYPE . ":host=" . DB_HOST . ";dbname=" . DB_NAME );
}
if (empty ( $dbConfig ['hostname'] ))
throw_exception ( "没有定义数据库配置" );
self::$config = $dbConfig; //将传入的配置参数,传给Static变量。
if (empty ( self::$config ['params'] )) //???????????????????
self::$config ['params'] = array ();
/*************************************华丽分隔线*******************************************/
if (! isset ( self::$link )) {
$configs = self::$config; //复制一份配置信息。
if (self::$pconnect) {
$configs ['params'] [constant ( 'PDO::ATTR_PERSISTENT' )] = true;
}
try {
self::$link = new PDO ( $configs ['dsn'], $configs ['username'], $configs ['password'], $configs ['params'] );
} catch ( PDOException $e ) {
throw_exception ( $e->getMessage () );
//exit('连接失败:'.$e->getMessage());
}
if (! self::$link) {
throw_exception ( 'PDO CONNECT ERROR' );
return false;
}
self::$link->exec ( 'SET NAMES ' . DB_CHARSET );
self::$dbVersion = self::$link->getAttribute ( constant ( "PDO::ATTR_SERVER_INFO" ) );
// 标记连接成功
self::$connected = true;
// 注销数据库连接配置信息
unset ( $configs );
}
return self::$link;
}
/**
* 释放查询结果
* @access function
*/
static function free() {
self::$PDOStatement = null;
}
/*********************************************************************************************************/
/* 数据库操作 */
/*********************************************************************************************************/
/**
* 获得所有的查询数据
* @access function
* @return array
*/
static function getAll($sql = null) {
self::query ( $sql );
//返回数据集
$result = self::$PDOStatement->fetchAll ( constant ( 'PDO::FETCH_ASSOC' ) );
return $result;
}
/**
* 获得一条查询结果
* @access function
* @param string $sql SQL指令
* @param integer $seek 指针位置
* @return array
*/
static function getRow($sql = null) {
self::query ( $sql );
// 返回数组集
$result = self::$PDOStatement->fetch ( constant ( 'PDO::FETCH_ASSOC' ), constant ( 'PDO::FETCH_ORI_NEXT' ) );
return $result;
}
/**
* 执行sql语句,自动判断进行查询或者执行操作
* @access function
* @param string $sql SQL指令
* @return mixed
*/
static function doSql($sql = '') {
if (self::isMainIps ( $sql )) {
return self::execute ( $sql );
} else {
return self::getAll ( $sql );
}
}
/**
* 根据指定ID查找表中记录(仅用于单表操作)
* @access function
* @param integer $priId 主键ID
* @param string $tables 数据表名
* @param string $fields 字段名
* @return ArrayObject 表记录
*/
static function findById($tabName, $priId, $fields = '*') {
$sql = 'SELECT %s FROM %s WHERE id=%d';
return self::getRow ( sprintf ( $sql, self::parseFields ( $fields ), $tabName, $priId ) );
}
/**
* 查找记录
* @access function
* @param string $tables 数据表名
* @param mixed $where 查询条件
* @param string $fields 字段名
* @param string $order 排序
* @param string $limit 取多少条数据
* @param string $group 分组
* @param string $having
* @param boolean $lock 是否加锁
* @return ArrayObject
*/
static function find($tables, $where = "", $fields = '*', $order = null, $limit = null, $group = null, $having = null) {
$sql = 'SELECT ' . self::parseFields ( $fields ) . ' FROM ' . $tables . self::parseWhere ( $where ) . self::parseGroup ( $group ) . self::parseHaving ( $having ) . self::parseOrder ( $order ) . self::parseLimit ( $limit );
$dataAll = self::getAll ( $sql );
if (count ( $dataAll ) == 1) {
$rlt = $dataAll [0];
} else {
$rlt = $dataAll;
}
return $rlt;
}
/**
* 插入(单条)记录
* @access function
* @param mixed $data 数据
* @param string $table 数据表名
* @return false | integer
*/
static function add($data, $table) {
//过滤提交数据
$data = self::filterPost ( $table, $data );
foreach ( $data as $key => $val ) {
if (is_array ( $val ) && strtolower ( $val [0] ) == 'exp') {
$val = $val [1]; // 使用表达式 ???
} elseif (is_scalar ( $val )) {
$val = self::fieldFormat ( $val );
} else {
// 去掉复合对象
continue;
}
$data [$key] = $val;
}
$fields = array_keys ( $data );
array_walk ( $fields, array ($this, 'addSpecialChar' ) );
$fieldsStr = implode ( ',', $fields );
$values = array_values ( $data );
$valuesStr = implode ( ',', $values );
$sql = 'INSERT INTO ' . $table . ' (' . $fieldsStr . ') VALUES (' . $valuesStr . ')';
return self::execute ( $sql );
}
/**
* 更新记录
* @access function
* @param mixed $sets 数据
* @param string $table 数据表名
* @param string $where 更新条件
* @param string $limit
* @param string $order
* @return false | integer
*/
static function update($sets, $table, $where, $limit = 0, $order = '') {
$sets = self::filterPost ( $table, $sets );
$sql = 'UPDATE ' . $table . ' SET ' . self::parseSets ( $sets ) . self::parseWhere ( $where ) . self::parseOrder ( $order ) . self::parseLimit ( $limit );
return self::execute ( $sql );
}
/**
* 保存某个字段的值
* @access function
* @param string $field 要保存的字段名
* @param string $value 字段值
* @param string $table 数据表
* @param string $where 保存条件
* @param boolean $asString 字段值是否为字符串
* @return void
*/
static function setField($field, $value, $table, $condition = "", $asString = false) {
// 如果有'(' 视为 SQL指令更新 否则 更新字段内容为纯字符串
if (false === strpos ( $value, '(' ) || $asString)
$value = '"' . $value . '"';
$sql = 'UPDATE ' . $table . ' SET ' . $field . '=' . $value . self::parseWhere ( $condition );
return self::execute ( $sql );
}
/**
* 删除记录
* @access function
* @param mixed $where 为条件Map、Array或者String
* @param string $table 数据表名
* @param string $limit
* @param string $order
* @return false | integer
*/
static function remove($where, $table, $limit = '', $order = '') {
$sql = 'DELETE FROM ' . $table . self::parseWhere ( $where ) . self::parseOrder ( $order ) . self::parseLimit ( $limit );
return self::execute ( $sql );
}
/**
+----------------------
* 修改或保存数据(仅用于单表操作)
* 有主键ID则为修改,无主键ID则为增加
* 修改记录:
+----------------------
* @access function
+----------------------
* @param $tabName 表名
* @param $aPost 提交表单的 $_POST
* @param $priId 主键ID
* @param $aNot 要排除的一个字段或数组
* @param $aCustom 自定义的一个数组,附加到数据库中保存
* @param $isExits 是否已经存在 存在:true, 不存在:false
+----------------------
* @return Boolean 修改或保存是否成功
+----------------------
*/
static function saveOrUpdate($tabName, $aPost, $priId = "", $aNot = "", $aCustom = "", $isExits = false) {
if (empty ( $tabName ) || ! is_array ( $aPost ) || is_int ( $aNot ))
return false;
if (is_string ( $aNot ) && ! empty ( $aNot ))
$aNot = array ($aNot );
if (is_array ( $aNot ) && is_int ( key ( $aNot ) ))
$aPost = array_diff_key ( $aPost, array_flip ( $aNot ) );
if (is_array ( $aCustom ) && is_string ( key ( $aCustom ) ))
$aPost = array_merge ( $aPost, $aCustom );
if (empty ( $priId ) && ! $isExits) { //新增
$aPost = array_filter ( $aPost, array ($this, 'removeEmpty' ) );
return self::add ( $aPost, $tabName );
} else { //修改
return self::update ( $aPost, $tabName, "id=" . $priId );
}
}
/**
* 获取最近一次查询的sql语句
* @access function
* @param
* @return String 执行的SQL
*/
static function getLastSql() {
$link = self::$link;
if (! $link)
return false;
return self::$queryStr;
}
/**
* 获取最后插入的ID
* @access function
* @param
* @return integer 最后插入时的数据ID
*/
static function getLastInsId() {
$link = self::$link;
if (! $link)
return false;
return self::$lastInsertId;
}
/**
* 获取DB版本
* @access function
* @param
* @return string
*/
static function getDbVersion() {
$link = self::$link;
if (! $link)
return false;
return self::$dbVersion;
}
/**
* 取得数据库的表信息
* @access function
* @return array
*/
static function getTables() {
$info = array ();
if (self::query ( "SHOW TABLES" )) {
$result = self::getAll ();
foreach ( $result as $key => $val ) {
$info [$key] = current ( $val );
}
}
return $info;
}
[解决办法]