PHP PDO(mysql) 封装类
年初在开发站点统计,自己封装的PHP PDO类,现在又改了一点,增加了一点,目前没有加上事务处理,以后会有。
上肉,上绿色无污染的肉(自家养殖场出的):
/**错误函数 Feng.Fox * @param $e 对象 * @param bool $debug * @param string $message 错误信息 * @param string $sql 错误sQL * @return bool */ function halt($e, $debug=true,$message = '', $sql = '') { if ($debug) { if (isset ( $e->errorInfo )) { $errorInfo = $e->errorInfo; $errorno = $e->getCode (); $error = $e->getMessage (); $errorFile = $e->getFile (); $errorLine = $e->getLiNe (); } elseif($e->getCode()) { $errorLine= $e->getLine(); $errorno = $e->getCode(); $error = $e->getMessage(); $errorFile = $e->getFile(); } else { $errorInfo = $e->errorInfo(); $errorno = $errorInfo [1]; $error = $errorInfo [2]; $errorFile = ''; } $errormsg = "<b>MySQL Query : </b> $sql <br /><b> MySQL Error : </b>{$error} <br /> <b>"; $errormsg .= "MySQL Errno : </b>{$errorno} <br /><b>"; $errormsg .= "File : </b>{$errorFile} <br /><b>"; $errormsg .= "Lile : </b>{$errorLine} <br /><b> Message : </b> $message <br />"; $msg = $errormsg; echo '<div style="font-size:12px;text-align:left; border:1px solid #9cc9e0; padding:1px 4px;color:#000000;font-family:Arial, Helvetica,sans-serif;"><span>' . $msg . '</span></div>'; exit (); } else { return false; } }
/** * 数据库工厂类 phpcms */ final class CDbFactory { /** * 当前数据库工厂类静态实例 */ private static $db_factory; /** * 数据库配置列表 */ protected $db_config = array(); /** * 数据库操作实例化列表 */ protected $db_list = array(); private $table=array(); private $db_setting = 'default'; /** * 构造函数 */ public function __construct() { } /** * 返回当前终级类对象的实例 * @param $db_config 数据库配置 * @param $db_setting * @return object */ public static function getInstance($db_setting='default',$db_config = '') { $db_factory=null; if(!empty($db_config)&&!isset($db_config[$db_setting])) { $db_setting = 'default'; } if(self::$db_factory == ''||!is_object(self::$db_factory)) { self::$db_factory = $db_factory= new CDbFactory(); }else{ $db_factory=self::$db_factory; } if(empty($db_factory->db_config)){ if(empty($db_config)) { $db_config = F::loadConfig('database'); } self::$db_factory->db_config=$db_config; }else{ if(!empty($db_config)&& $db_config != $db_factory->db_config){ self::$db_factory->db_config = array_merge($db_config, $db_factory->db_config); } } return $db_factory; } /** * 获取数据库操作实例 * @param $db_setting 数据库配置名称 * @return CPDO */ public function getDatabase($db_setting) { if(!empty($db_setting)&&isset($this->db_config[$db_setting])) { }else{ $db_setting=$this->db_setting; } $object =null; if(!isset($this->db_list[$db_setting]) || !is_object($this->db_list[$db_setting])) { $object = new CPDO(); $object->open($this->db_config[$db_setting]); $object->connect(); $this->db_list[$db_setting] = $object; }else{ $object=$this->db_list[$db_setting]; } return $object; } /** * 获取数据库配置信息 * @param string $db_setting * @param bool $isAll false单个$db_setting数据库配置(默认) ; true全部 * @return array */ public function getDbConfig($db_setting='default',$isAll=false){ $db_config=$this->db_config; if(!empty($db_setting)&&isset($db_config[$db_setting])) { }else{ $db_setting=$this->db_setting; } if(empty($db_config)){ $db_config = F::loadConfig('database'); } return $isAll ? $db_config : $db_config[$db_setting]; } /** * 加载数据库驱动 * @param $db_setting 数据库配置名称 * @return object */ public function connect($db_setting) { $object = new CPDO(); $object->open($this->db_config[$db_setting]); $object->connect(); return $object; } /** * 关闭数据库连接 * @return void */ public function close() { if(is_array($this->db_list)){ foreach($this->db_list as $db) { $db=null; } $this->db_list=null; } } /** * 析构函数 */ public function __destruct() { $this->close(); } }
/**
*
* @author Feng . Fox
*/
final class CPDOStatement
{
public $debug = false;
public $pdo = null;
private $st = null;
/**
* @param $st
* @param bool $debug
* @param $pdo
*/
function CPDOStatement($st, $debug = true, $pdo)
{
$this->st = $st;
$this->pdo = $pdo;
$this->debug = $debug;
}
/**
* @param array $input_parameters
* @return $this|bool
*/
public function execute(array $input_parameters = null)
{
try {
$this->st->execute($input_parameters);
return $this;
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* 输出1行数据
* @param int $fetch_style
* @return array
*/
public function fetch($fetch_style = PDO::FETCH_ASSOC)
{
try {
return $this->st->fetch($fetch_style);
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* @param $parameter
* @param $variable
* @param null $data_type
* @param null $length
* @param null $driver_options
* @return $this|bool
*/
public function bindParam($parameter, &$variable, $data_type = null, $length = null, $driver_options = null)
{
try {
$this->st->bindParam($parameter, $variable, $data_type, $length, $driver_options);
return $this;
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* @param $column
* @param $param
* @param null $type
* @param null $maxlen
* @param null $driverdata
* @return $this|bool
*/
public function bindColumn($column, &$param, $type = null, $maxlen = null, $driverdata = null)
{
try {
$this->st->bindColumn($column, $param, $type, $maxlen, $driverdata);
return $this;
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* 绑定参数
*
* @param string $parameter 字符参数[:num]或数字(从1开始);根据prepare中的SQL语句
* @param string $value 数据
* @param int $data_type 其他
* @return CPDOStatement boolean
*/
public function bindValue($parameter, $value, $data_type = null)
{
try {
$this->st->bindValue($parameter, $value, $data_type);
return $this;
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* 总记录数
* @return int
*/
public function rowCount()
{
return $this->st->rowCount();
}
/**
* 获取第一行的某列,默认第1列
* @param int $column_number 从0开始
* @return boolean
*/
public function fetchColumn($column_number = null)
{
try {
return $this->st->fetchColumn($column_number);
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* 输出全部数据
* @param $fetch_style
* @return array
*/
public function fetchAll($fetch_style = PDO::FETCH_ASSOC)
{
try {
return $this->st->fetchAll($fetch_style);
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* @param null $class_name
* @param array $ctor_args
* @return bool
*/
public function fetchObject($class_name = null, array $ctor_args = null)
{
try {
return $this->st->fetchObject($class_name, $ctor_args);
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* @return mixed
*/
public function errorCode()
{
return $this->st->errorCode();
}
/**
* @return mixed
*/
public function errorInfo()
{
return $this->st->errorInfo();
}
/**
* @param $attribute
* @param $value
* @return $this|bool
*/
public function setAttribute($attribute, $value)
{
try {
$this->st->setAttribute($attribute, $value);
return $this;
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* @param $attribute
* @return $this|bool
*/
public function getAttribute($attribute)
{
try {
$this->st->getAttribute($attribute);
return $this;
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/*
* 结果集列数
*/
public function columnCount()
{
return $this->st->columnCount();
}
/**
* @param $column
* @return $this|bool
*/
public function getColumnMeta($column)
{
try {
$this->st->getColumnMeta($column);
return $this;
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* @param $mode
* @return $this|bool
*/
public function setFetchMode($mode)
{
try {
$this->st->setFetchMode($mode);
return $this;
} catch (PDOException $e) {
halt($e, $this->debug);
return false;
}
}
/**
* @return mixed
*/
public function nextRowset()
{
return $this->st->nextRowset();
}
/**
* @return mixed
*/
public function closeCursor()
{
return $this->st->closeCursor();
}
/**
* @return mixed
*/
public function debugDumpParams()
{
return $this->st->debugDumpParams();
}
/**
*
*/
public function __destruct()
{
$this->closeCursor();
}
}
/** * PDO * @author Feng . Fox 2013.11.11 * */ final class CPDO { /** * 数据库配置信息 */ private $config = null; /** * 数据库连接资源句柄 */ public $pdo = null; public function __construct() { } /** * 打开数据库连接,有可能不真实连接数据库 * * @param $config 数据库连接参数 * $config = [ * 'ms' => 'mysql', * 'host' => 'localhost', * 'prot' => '3306' * 'dbname' => 'test', * 'username' => 'root', * 'password' => 'root', * 'debug' => true, * 'options'=>[ * PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'", * PDO::ATTR_PERSISTENT => true, * PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION * ] * ]; * @return void */ public function open($config) { $this->config = $config; if (isset ($config ['autoconnect']) && $config ['autoconnect'] == 1) { $this->connect(); } } /** * 真正开启数据库连接 * @return void */ public function connect() { try { if (empty ($this->config ['dsn'])) { $dsn = "{$this->config['ms']}:host={$this->config['host']};dbname={$this->config['dbname']}"; $dsn .= empty ($this->config ['port']) ? '' : ';prot=' . $this->config ['port']; } else { $dsn = $this->config ['dsn']; } $this->pdo = new PDO ($dsn, $this->config ['username'], $this->config ['password'], $this->config ['options']); $this->database = $this->config ['dbname']; return $this; } catch (PDOException $e) { halt($e, $this->config['debug'], '[PDOException] Can not connect to MySQL server'); return false; } } /* * 标明回滚起始点 */ public function beginTransaction() { return $this->pdo->beginTransaction(); } /* * 标明回滚结束点,并执行SQL */ public function commit() { return $this->pdo->commit(); } /* * 获取错误码 */ public function errorCode() { return $this->pdo->errorCode(); } /* * 获取错误的信息 */ public function errorInfo() { return $this->pdo->errorInfo(); } /* * 处理一条SQL语句,并返回所影响的条目数 */ public function exec($sql) { try { return $this->pdo->exec($sql); } catch (PDOException $e) { halt($e, $this->config['debug']); return false; } } /* * 获取一个“数据库连接对象”的属性 */ public function getAttribute($attribute) { try { return $this->pdo->getAttribute($attribute); } catch (PDOException $e) { return false; } } /* * 获取有效的PDO驱动器名称 */ public function getAvailableDrivers() { return $this->pdo->getAvailableDrivers(); } /* * 获取写入的最后一条数据的主键值 */ public function lastInsertId() { return $this->pdo->lastInsertId(); } /** * 处理一条SQL语句 返回结果集 * * @param string $sql * @return array */ public function query($sql) { try { return $this->pdo->query($sql); } catch (PDOException $e) { halt($e, $this->config['debug']); return false; } } /** * 生成一个“查询对象” * * @param string $sql * 查询语句 * @return CPDOStatement */ public function prepare($sql) { try { return new CPDOStatement ($this->pdo->prepare($sql), $this->config['debug'], $this->pdo); } catch (PDOException $e) { halt($e, $this->config['debug']); return false; } } /* * 为某个SQL中的字符串添加引号 public function quote(){ } */ /* * 执行回滚 */ public function rollBack() { return $this->pdo->rollBack(); } /* * 为一个“数据库连接对象”设定属性 */ public function setAttribute($attribute, $value) { try { $this->pdo->setAttribute($attribute, $value); return $this; } catch (PDOException $e) { return false; } } /** * 析构函数 */ public function __destruct() { $this->pdo = null; } }
/** * 数据模型基类 * @author Feng . Fox 2013.11.11 */ class CDb { //数据库配置 protected $db_config = ''; //数据库连接 protected $db; //调用数据库的配置项 protected $db_setting = 'default'; //数据表名 protected $table_name = ''; //表前缀 protected $db_tablepre = ''; //数据库 protected $database = ''; /** 配置 * @param $table_name 表名称 * @param string $db_setting 调用数据库配置项 * @param array $db_config 数据库配置 */ public function __construct($table_name, $db_setting = 'default', $db_config = array()) { if (!empty($db_config) && !isset($db_config[$db_setting])) { $db_setting = 'default'; } $this->db_setting = $db_setting; $dbf = CDbFactory::getInstance($db_setting, $db_config); //$this->db=$dbf->getDatabase($db_setting); $this->db_config = $dbf->getDbConfig($db_setting, true); //参数赋值 $this->db_tablepre = $this->db_config[$db_setting]['tablepre']; $this->database = $this->db_config[$db_setting]['dbname']; $this->table_name = $this->db_tablepre . $table_name; } /** * 重置数据库连接参数 * @param string $table_name * @param string $db_setting * @param array $db_config */ public function ReSetDb($table_name = '', $db_setting = 'default', $db_config = array()) { if (!empty($db_config) && !isset($db_config[$db_setting])) { $db_setting = 'default'; } $this->db_setting = $db_setting; $dbf = CDbFactory::getInstance($db_setting, $db_config); $this->db = $dbf->getDatabase($db_setting); $this->db_config = $dbf->getDbConfig($db_setting, true); //参数赋值 $this->db_tablepre = $this->db_config[$db_setting]['tablepre']; $this->database = $this->db_config[$db_setting]['dbname']; if (!empty($table_name)) { $this->table_name = $this->db_tablepre . $table_name; } } /** * 设置 表名称,不包括前缀 * @param $table_name * @return string */ public function setTableName($table_name) { if (!empty($table_name)) { $this->table_name = $this->db_tablepre . $table_name; } return $this->table_name; } /** * 表名称,包括前缀 * @return string */ public function getTableName() { return $this->table_name; } /** * 表前缀 * @return string */ public function getTablePre() { return $this->db_tablepre; } /** * 当前数据库配置,默认当前数据库 * @param string $db_setting * @param bool $isAll true 全部 * @return string */ public function getDbConfig($db_setting = '', $isAll = false) { if (empty($db_setting)) { $db_setting = $this->db_setting; } return $isAll ? $this->db_config : $this->db_config[$db_setting]; } /** pdo 类 * @return CPDO */ final public function pdo() { if ($this->db != '' && is_object($this->db)) { return $this->db; } $this->db = $pdo = CDbFactory::getInstance($this->db_setting)->getDatabase($this->db_setting); return $pdo; } /** * 执行sql查询 * @param $where 查询条件 * 字符串,请按照格式 : * 字符串 [例2:array('catid=:catid AND time>=:time ',array(':catid'=>10,':time'=>'2012-02-10')) ] * 数组时 [例: array('name'=>'phpcms','password'=>'123456')] * @param $fields 需要查询的字段值[例`name`,`gender`,`birthday`] * @param $limit 返回结果范围[例:10或10,10 默认为空] * @param $order 排序方式 [默认按数据库默认方式排序] * @param $group 分组方式 [默认为空] * @return array 查询结果集数组 */ final public function select($where = '', $fields = '*', $limit = '', $order = '', $group = '') { $parameter = array(); $search = ''; if (!empty($where) && is_array($where)) { if (isset($where[1]) && is_array($where[1])) { list($a, $b) = $where; $search = $a; $i = 1; foreach ($b as $k => $r) { $parameter[$i]['key'] = is_numeric($k) ? $i : $k; $parameter[$i]['value'] = $r; $i++; } } else { $i = 1; foreach ($where as $k => $r) { if ($i > 1) { $search .= " AND `$k`=:$k "; } else { $search .= " `$k`=:$k "; } $parameter[$i]['key'] = ':' . $k; $parameter[$i]['value'] = $r; $i++; } } } else { $search = $where; } $where = $search == '' ? '' : ' WHERE ' . $search; $order = $order == '' ? '' : ' ORDER BY ' . $order; $group = $group == '' ? '' : ' GROUP BY ' . $group; $limit = $limit == '' ? '' : ' LIMIT ' . $limit; $field = explode(',', $fields); array_walk($field, array($this, 'add_special_char')); $fields = implode(',', $field); $sql = 'SELECT ' . $fields . ' FROM ' . $this->databaseTable($this->table_name) . $where . $group . $order . $limit; $pdo = $this->pdo(); $smt = $pdo->prepare($sql); if (is_array($parameter) && count($parameter) > 0) foreach ($parameter as $k => $r) { $smt->bindValue($r['key'], $r['value']); } $smt->execute(); return $smt->fetchAll(); } /** * 查询多条数据并分页 * @param $where 查询条件 * 字符串,请按照格式 : * 字符串 [例2:array('catid=:catid AND time>=:time ',array(':catid'=>10,':time'=>'2012-02-10')) ] * 数组时 [例: array('name'=>'phpcms','password'=>'123456')] * @param $fields 字段 *,id * @param $order 排序 id desc ,orderlist asc * @param $page 页码 1 * @param $pagesize 每页条数 * @param $setpages * @param $urlrule * @param $array * @return array */ final public function listinfo($where = '', $fields = '*', $order = '', $page = 1, $pagesize = 20, $setpages = 10, $urlrule = '', $array = array()) { $parameter = array(); $search = ''; if (!empty($where) && is_array($where)) { if (isset($where[1]) && is_array($where[1])) { list($a, $b) = $where; $search = $a; $i = 1; foreach ($b as $k => $r) { $parameter[$i]['key'] = is_numeric($k) ? $i : $k; $parameter[$i]['value'] = $r; $i++; } } else { $i = 1; foreach ($where as $k => $r) { if ($i > 1) { $search .= " AND `$k`=:$k "; } else { $search .= " `$k`=:$k "; } $parameter[$i]['key'] = ':' . $k; $parameter[$i]['value'] = $r; $i++; } } } else { $search = $where; } $where = $search == '' ? '' : ' WHERE ' . $search; $order = $order == '' ? '' : ' ORDER BY ' . $order; $group = ''; $group = $group == '' ? '' : ' GROUP BY ' . $group; $page = max(intval($page), 1); $offset = $pagesize * ($page - 1); $limit = " LIMIT $offset,$pagesize"; $fields = empty($fields) ? '*' : $fields; $field = explode(',', $fields); array_walk($field, array($this, 'add_special_char')); $fields = implode(',', $field); $sql = 'SELECT sql_calc_found_rows ' . $fields . ' FROM ' . $this->databaseTable($this->table_name) . $where . $group . $order . $limit; $pdo = $this->pdo(); $smt = $pdo->prepare($sql); if (is_array($parameter) && count($parameter) > 0) foreach ($parameter as $k => $r) { $smt->bindValue($r['key'], $r['value']); } $smt->execute(); $smt2 = $pdo->prepare("SELECT FOUND_ROWS()"); $smt2->execute(); $this->number = $smt2->fetchColumn(); if ($this->number > 0) { $this->pages = pages($this->number, $page, $pagesize, $urlrule, $array, $setpages); return $smt->fetchAll(); } return array(); } /** * 获取单条记录查询 * @param array $where 查询条件语句 * 字符串,请按照格式 : * 字符串 [例2:array('catid=:catid AND time>=:time ',array(':catid'=>10,':time'=>'2012-02-10')) ] * 数组时 [例: array('name'=>'phpcms','password'=>'123456')] * @param string $fields 需要查询的字段值[例`name`,`gender`,`birthday`] * @param string $order 排序方式 [默认按数据库默认方式排序] * @param string $group 分组方式 [默认为空] * @return array/null 数据查询结果集,如果不存在,则返回空 */ final public function get_one($where, $fields = '*', $order = '', $group = '') { $parameter = array(); $search = ''; if (is_array($where)) { //$where第2个参数为数组 if (isset($where[1]) && is_array($where[1])) { $search = $where[0]; $i = 1; foreach ($where[1] as $k => $r) { $parameter[$i]['key'] = is_numeric($k) ? $i : $k; $parameter[$i]['value'] = $r; $i++; } } else { $i = 1; foreach ($where as $k => $r) { if ($i > 1) { $search .= " AND `$k`=:$k "; } else { $search .= " `$k`=:$k "; } $parameter[$i]['key'] = ':' . $k; $parameter[$i]['value'] = $r; $i++; } } } else { $search = $where; } $where = $search == '' ? '' : ' WHERE ' . $search; $order = $order == '' ? '' : ' ORDER BY ' . $order; $group = $group == '' ? '' : ' GROUP BY ' . $group; $limit = ' LIMIT 1'; $field = explode(',', $fields); array_walk($field, array($this, 'add_special_char')); $fields = implode(',', $field); $sql = 'SELECT ' . $fields . ' FROM ' . $this->databaseTable($this->table_name) . $where . $group . $order . $limit; $pdo = $this->pdo(); $smt = $pdo->prepare($sql); foreach ($parameter as $k => $r) { $smt->bindValue($r['key'], $r['value']); } $smt->execute(); return $smt->fetch(); } /** * 直接执行sql查询 * @param $sql 查询sql语句 * @return boolean/query resource 如果为查询语句,返回资源句柄,否则返回true/false */ final public function query($sql) { return $this->pdo()->query($sql); } /** * 直接执行sql查询 * @param $sql 查询sql语句 * @return int|false */ final public function exec($sql) { return $this->pdo()->exec($sql); } /** * 执行添加记录操作 * @param array $data 要增加的数据,参数为数组。数组key为字段值,数组值为数据取值 * @param bool $return_insert_id 是否返回新建ID号 * @param bool $replace 是否采用 replace into的方式添加数据 * @return boolean */ final public function insert($data, $return_insert_id = false, $replace = false) { if (!is_array($data) || count($data) == 0) { return false; } $fields = array_keys($data); $valuedata = array_values($data); array_walk($fields, array($this, 'add_special_char')); $field = implode(',', $fields); $value = str_repeat('?,', count($fields) - 1) . '?'; $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO'; $sql = $cmd . $this->databaseTable($this->table_name) . ' (' . $field . ') VALUES (' . $value . ')'; $pdo = $this->pdo(); $smt = $pdo->prepare($sql); $i = 1; foreach ($valuedata as $r) { $smt->bindValue($i, empty($r) ? '' : $r); $i++; } $row = $smt->execute(); return $return_insert_id ? $pdo->lastInsertId() : $row; } /** * 获取最后一次添加记录的主键号 * @return int */ final public function insert_id() { return $this->pdo()->lastInsertId(); } /** * 执行更新记录操作 * @param $data 要更新的数据内容,参数为数组 * 为数组时数组key为字段值,数组值为数据取值 * 为数组时[例: array('name'=>'lanmps','password'=>'123456')] * 数组的另一种使用array('name'=>'+=1', 'base'=>'-=1');程序会自动解析为`name` = `name` + 1, `base` = `base` - 1 * 字符串,请按照格式 : * 字符串 [例2:array('catid=:catid AND time>=:time ',array(':catid'=>10,':time'=>'2012-02-10')) ] * @param $where 更新数据时的条件, * 字符串,请按照格式 : * 字符串 [例2:array('catid=:catid AND time>=:time ',array(':catid'=>10,':time'=>'2012-02-10')) ] * 数组时 [例: array('name'=>'lanmps','password'=>'123456')] * @return boolean */ final public function update($data, $where) { $parameter = array(); $i = $j = 1; $field = ''; if (is_array($data)) { $fields = array(); foreach ($data as $k => $v) { switch (substr($v, 0, 2)) { case '+=': $v = substr($v, 2); if (is_numeric($v)) { $fields[] = self::add_special_char($k) . '=' . self::add_special_char($k) . '+' . self::escape_string($v, '', false); } else { continue; } break; case '-=': $v = substr($v, 2); if (is_numeric($v)) { $fields[] = self::add_special_char($k) . '=' . self::add_special_char($k) . '-' . self::escape_string($v, '', false); } else { continue; } break; default: $fields[] = self::add_special_char($k) . '=:' . $k; $parameter[$i]['key'] = ':' . $k; $parameter[$i]['value'] = $v; $i++; } } $field = implode(',', $fields); } else { $field = $data; } $search = ''; if (is_array($where)) { //$where第2个参数为数组 if (isset($where[1]) && is_array($where[1])) { $search = $where[0]; //$i++; foreach ($where[1] as $k => $r) { $parameter[$i]['key'] = is_numeric($k) ? $i : $k; $parameter[$i]['value'] = $r; $i++; } } else { //$i++; $x = 1; foreach ($where as $k => $r) { if ($x > 1) { $search .= " AND `$k`=:$k "; } else { $search .= " `$k`=:$k "; } $parameter[$i]['key'] = ':' . $k; $parameter[$i]['value'] = $r; $i++; $x++; } } } else { $search = $where; } $where = ' WHERE ' . $search; $sql = 'UPDATE ' . $this->databaseTable($this->table_name) . ' SET ' . $field . $where; $pdo = $this->pdo(); $smt = $pdo->prepare($sql); foreach ($parameter as $r) { $smt->bindValue($r['key'], $r['value']); } return $smt->execute(); } /** * 执行删除记录操作 * @param $where 删除数据条件,不充许为空。 * @return boolean */ final public function delete($where) { if (!is_array($where) || count($where) == 0) { return false; } $parameter = array(); $search = ''; if (is_array($where)) { //$where第2个参数为数组 if (isset($where[1]) && is_array($where[1])) { $search = $where[0]; $i = 1; foreach ($where[1] as $k => $r) { $parameter[$i]['key'] = is_numeric($k) ? $i : $k; $parameter[$i]['value'] = $r; $i++; } } else { $i = 1; foreach ($where as $k => $r) { if ($i > 1) { $search .= " AND `$k`=:$k "; } else { $search .= " `$k`=:$k "; } $parameter[$i]['key'] = ':' . $k; $parameter[$i]['value'] = $r; $i++; } } } else { $search = $where; } $where = $search == '' ? '' : ' WHERE ' . $search; $sql = 'DELETE FROM ' . $this->databaseTable($this->table_name) . $where; $pdo = $this->pdo(); $smt = $pdo->prepare($sql); foreach ($parameter as $k => $r) { $smt->bindValue($r['key'], $r['value']); } return $smt->execute(); } /** * 计算记录数 * @param string /array $where 查询条件 */ final public function count($where = '') { $r = self::get_one($where, "COUNT(*) AS num"); return $r['num']; } /** * 将数组转换为SQL语句 * @param array $where 要生成的数组 * @param string $font 连接串。 * @return string */ final public function sqls($where, $font = ' AND ') { if (is_array($where)) { $sql = ''; foreach ($where as $key => $val) { $sql .= $sql ? " $font `$key` = '$val' " : " `$key` = '$val'"; } return $sql; } else { return $where; } } /** * 获取数据表主键 * @return array */ final public function get_primary() { return self::$db->get_primary($this->table_name); } /** * 获取表字段 * @param string $table_name 表名 * @param bool true默认加前缀,false不加前缀 * @return array */ final public function get_fields($table_name = '', $isTablepre = true) { if (empty($table_name)) { $table_name = $this->table_name; } else { $table_name = ($isTablepre ? $this->db_tablepre : '') . $table_name; } $fields = array(); $pdo = $this->pdo(); $smt = $pdo->prepare("SHOW COLUMNS FROM $table_name"); $smt->execute(); while ($r = $smt->fetch()) { $fields[$r['Field']] = $r['Type']; } return $fields; } /** * 检查表是否存在 * @param $table 表名 * @return boolean */ final public function table_exists($table) { $tables = $this->list_tables(); return in_array($this->db_tablepre . $table, $tables) ? 1 : 0; } /** * 检查字段是否存在 * @param $field 字段名 * @return boolean */ public function field_exists($field) { $fields = $this->db->get_fields($this->table_name); return array_key_exists($field, $fields); } /**获取数据库中的所有表 * @return array */ final public function list_tables() { $tables = array(); $pdo = $this->pdo(); $smt = $pdo->prepare("SHOW TABLES"); $smt->execute(); while ($r = $smt->fetch()) { $tables[] = $r['Tables_in_' . $this->database]; } return $tables; } /** * 返回数据结果集 * @return array */ final private function fetch_array() { } /** * 返回数据库版本号 */ final public function version() { return $this->db->version(); } final private function databaseTable($table) { if (strpos($table, $this->db_tablepre) !== 0) { $table = $this->db_tablepre . $table; } return " `{$this->database}`.`{$table}` "; } /** * 对字段两边加反引号,以保证数据库安全 * @param $value 数组值 * @return string */ final public static function add_special_char($value) { if ('*' == $value || false !== strpos($value, '(') || false !== strpos($value, '.') || false !== strpos($value, '`')) { //不处理包含* 或者 使用了sql方法。 } else { $value = '`' . trim($value) . '`'; } if (preg_match('/\b(select|insert|update|delete)\b/i', $value)) { $value = preg_replace('/\b(select|insert|update|delete)\b/i', '', $value); } return $value; } /** * 对字段值两边加引号,以保证数据库安全 * @param $value 数组值 * @param $key 数组key * @param $quotation * @return string */ final public static function escape_string(&$value, $key = '', $quotation = 1) { if ($quotation) { $q = '\''; } else { $q = ''; } $value = $q . $value . $q; return $value; } /** * 获取单条记录查询 * @param array $sql 查询条件语句 * @return array/null 数据查询结果集,如果不存在,则返回空 */ final public function fetch($sql) { $pdo = $this->pdo(); $smt = $pdo->prepare($sql); $smt->execute(); return $smt->fetch(); } /** * 执行sql查询 * @param $sql 查询条件 * @return array 查询结果集数组 */ final public function fetchAll($sql = '') { $pdo = $this->pdo(); $smt = $pdo->prepare($sql); $smt->execute(); return $smt->fetchAll(); } /**第一个参数值 * @param $sql * @return mixed */ final public function resultFirst($sql) { $pdo = $this->pdo(); $smt = $pdo->prepare($sql); $smt->execute(); return $smt->fetchColumn(); } /** * 析构函数 */ public function __destruct() { $dbf = CDbFactory::getInstance(); $dbf->close(); $this->db = null; } }
怎么吃,吃法,使用方法案例:
数据库配置:
在 class CDbFactory 中搜索 F::loadConfig('database') 改成你自己的数据库配置.参数如下 $config = [ 'ms' => 'mysql', 'host' => 'localhost', 'prot' => '3306' 'dbname' => 'test', 'username' => 'root', 'password' => 'root', 'debug' => true, 'options'=>[ PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'", PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ] ]; 这array我用的是PHP5.5中的简写,你自己改下
方法一:我用的就是这种
class adminModel extends CDb { public function __construct() { $this->table_name = 'a_admin'; parent::__construct($this->table_name); } } $test=new adminModel(); $test->insert(array('id'=>1))
方法二:再次封装成静态类
另一个项目用的,那个项目没用PDO,且基本的INSERT,UPDATE,DELETE都没封装,所已我直接一部到位。
http://blog.csdn.net/fenglailea/article/details/15335925