php中PDO方式实现数据库的增删改查


Posted in PHP onMay 17, 2015

需要开启php的pdo支持,php5.1以上版本支持

实现数据库连接单例化,有三要素 静态变量、静态实例化方法、私有构造函数 DPDO.php

class DPDO{
  private $DSN;
  private $DBUser;
  private $DBPwd;
  private $longLink;
  private $pdo;
  //私有构造函数 防止被直接实例化
  private function __construct($dsn, $DBUser, $DBPwd, $longLink = false) {
    $this->DSN = $dsn;
    $this->DBUser = $DBUser;
    $this->DBPwd = $DBPwd;
    $this->longLink = $longLink;
    $this->connect();
  }
  //私有 空克隆函数 防止被克隆
  private function __clone(){}
  //静态 实例化函数 返回一个pdo对象
  static public function instance($dsn, $DBUser, $DBPwd, $longLink = false){
    static $singleton = array();//静态函数 用于存储实例化对象
    $singIndex = md5($dsn . $DBUser . $DBPwd . $longLink);
    if (empty($singleton[$singIndex])) {
      $singleton[$singIndex] = new self($dsn, $DBUser, $DBPwd, $longLink = false);
    }
    return $singleton[$singIndex]->pdo;
  }
   
  private function connect(){
    try{
      if($this->longLink){
        $this->pdo = new PDO($this->DSN, $this->DBUser, $this->DBPwd, array(PDO::ATTR_PERSISTENT => true));
      }else{
        $this->pdo = new PDO($this->DSN, $this->DBUser, $this->DBPwd);
      }
      $this->pdo->query('SET NAMES UTF-8');
    } catch(PDOException $e) {
      die('Error:' . $e->getMessage() . '<br/>');
    }
  }
}

用于处理字段映射,使用pdo的字段映射,可以有效避免sql注入

//字段关联数组处理, 主要用于写入和更新数据、同and 或 or 的查询条件,产生sql语句和映射字段的数组
  public function FDFields($data, $link = ',', $judge = array(), $aliasTable = ''){
    $sql = '';
    $mapData = array();
    foreach($data as $key => $value) {
      $mapIndex = ':' . ($link != ',' ? 'c' : '') . $aliasTable . $key;
      $sql .= ' ' . ($aliasTable ? $aliasTable . '.' : '') . '`' . $key . '` ' . ($judge[$key] ? $judge[$key] : '=') . ' ' . $mapIndex . ' ' . $link;
      $mapData[$mapIndex] = $value;
    }
    $sql = trim($sql, $link);
    return array($sql, $mapData);
  }
  //用于处理单个字段处理
  public function FDField($field, $value, $judge = '=', $preMap = 'cn', $aliasTable = '') {
    $mapIndex = ':' . $preMap . $aliasTable . $field;
    $sql = ' ' . ($aliasTable ? $aliasTable . '.' : '') . '`' . $field . '`' . $judge . $mapIndex;
    $mapData[$mapIndex] = $value;
    return array($sql, $mapData);
  }
  //使用刚方法可以便捷产生查询条件及对应数据数组
  public function FDCondition($condition, $mapData) {
    if(is_string($condition)) {
        $where = $condition;
    } else if (is_array($condition)) {
      if($condition['str']) {
        if (is_string($condition['str'])) {
          $where = $condition['str'];
        } else {
          return false;
        }
      }
      if(is_array($condition['data'])) {
        $link = $condition['link'] ? $condition['link'] : 'and';
        list($conSql, $mapConData) = $this->FDFields($condition['data'], $link, $condition['judge']);
        if ($conSql) {
          $where .= ($where ? ' ' . $link : '') . $conSql;
          $mapData = array_merge($mapData, $mapConData);
        }
      }
    }
    return array($where, $mapData);
  }

增删改查的具体实现DB.php

public function fetch($sql, $searchData = array(), $dataMode = PDO::FETCH_ASSOC, $preType = array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)) {
    if ($sql) {
      $sql .= ' limit 1';
      $pdoStatement = $this->pdo->prepare($sql, $preType);
      $pdoStatement->execute($searchData);
      return $data = $pdoStatement->fetch($dataMode);
    } else {
      return false;
    }
  }
   
  public function fetchAll($sql, $searchData = array(), $limit = array(0, 10), $dataMode = PDO::FETCH_ASSOC, $preType = array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)) {
    if ($sql) {
      $sql .= ' limit ' . (int) $limit[0] . ',' . (intval($limit[1]) > 0 ? intval($limit[1]) : 10);
      $pdoStatement = $this->pdo->prepare($sql, $preType);
      $pdoStatement->execute($searchData);
      return $data = $pdoStatement->fetchAll($dataMode);
    } else {
      return false;
    }
  }
   
  public function insert($tableName, $data, $returnInsertId = false, $replace = false) {
    if(!empty($tableName) && count($data) > 0){
      $sql = $replace ? 'REPLACE INTO ' : 'INSERT INTO ';
      list($setSql, $mapData) = $this->FDFields($data);
      $sql .= $tableName . ' set ' . $setSql;
      $pdoStatement = $this->pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
      $execRet = $pdoStatement->execute($mapData);
      return $execRet ? ($returnInsertId ? $this->pdo->lastInsertId() : $execRet) : false;
    } else {
      return false;
    }
  }
   
  public function update($tableName, $data, $condition, $mapData = array(), $returnRowCount = true) {
    if(!empty($tableName) && count($data) > 0) {
      $sql = 'UPDATE ' . $tableName . ' SET ';
      list($setSql, $mapSetData) = $this->FDFields($data);
      $sql .= $setSql;
      $mapData = array_merge($mapData, $mapSetData);
      list($where, $mapData) = $this->FDCondition($condition, $mapData);
      $sql .= $where ? ' WHERE ' . $where : '';
      $pdoStatement = $this->pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
      $execRet = $pdoStatement->execute($mapData);
      return $execRet ? ($returnRowCount ? $pdoStatement->rowCount() : $execRet) : false;
    } else {
      return false;
    }
  }
   
  public function delete($tableName, $condition, $mapData = array()) {
    if(!empty($tableName) && $condition){
      $sql = 'DELETE FROM ' . $tableName;
      list($where, $mapData) = $this->FDCondition($condition, $mapData);
      $sql .= $where ? ' WHERE ' . $where : '';
      $pdoStatement = $this->pdo->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
      $execRet = $pdoStatement->execute($mapData);
      return $execRet;
    }
  }

测试文件test.php

header("Content-type: text/html; charset=utf-8");
define('APP_DIR', dirname(__FILE__));
 
if (function_exists('spl_autoload_register')) {
  spl_autoload_register('autoClass');
} else {
  function __auto_load($className){
    autoClass($className);
  }
}
 
function autoClass($className){
  try{
    require_once APP_DIR.'/class/'.$className.'.php';
  } catch (Exception $e) {
    die('Error:' . $e->getMessage() . '<br />');
  }
}
$DB = new DB();
//插入
$inData['a'] = rand(1, 100);
$inData['b'] = rand(1, 1000);
$inData['c'] = rand(1,200) . '.' . rand(1,100);
$ret = $DB->insert('a', $inData);
echo '插入' . ($ret ? '成功' : '失败') . '<br/>';
//更新
$upConData['a'] = 100;
$upConJudge['a'] = '<';
$upConData['b'] = 30;
$upConJudge['b'] = '>';
list($upConStr, $mapUpConData) = $DB->FDField('b', 200, '<', 'gt');
$condition = array(
  'str' => $upConStr,
  'data' => $upConData,
  'judge' => $upConJudge,
  'link' => 'and'
);
$upData['a'] = rand(1, 10);
$upData['b'] = 1;
$upData['c'] = 1.00;
$changeRows = $DB->update('a', $upData, $condition, $mapUpConData);
echo '更新行数:' . (int) $changeRows . '<br/>';
//删除
$delVal = rand(1, 10);
list($delCon, $mapDelCon) = $DB->FDField('a', $delVal);
$delRet = $DB->delete('a', $delCon, $mapDelCon);
echo '删除a=' . $delVal . ($delRet ? '成功' : '失败') . '<br/>';
 
//查询
$data['a'] = '10';
$judge['a'] = '>';
$data['b'] = '400';
$judge['b'] = '<';
list($conSql, $mapConData) = $DB->FDFields($data, 'and', $judge);
$mData = $DB->fetch('select * from a where ' . $conSql . ' order by `a` desc', $mapConData);
 
var_dump($mData);

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
如何分别全角和半角以避免乱码
Oct 09 PHP
PHP+MYSQL的文章管理系统(二)
Oct 09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
php生成略缩图代码
Jul 16 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
Jun 26 PHP
PHP 使用memcached简单示例分享
Mar 05 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
ecshop添加菜单及权限分配问题
Nov 21 PHP
Laravel框架实现定时Task Scheduling例子
Oct 22 PHP
thinkphp 框架数据库切换实现方法分析
May 18 PHP
PHP图像处理类库及演示分享
May 17 #PHP
递归实现php数组转xml的代码分享
May 14 #PHP
php编写批量生成不重复的卡号密码代码
May 14 #PHP
php编写的抽奖程序中奖概率算法
May 14 #PHP
深入浅出php socket编程
May 13 #PHP
PHP中的traits简单使用实例
May 13 #PHP
PHP中的traits实现代码复用使用实例
May 13 #PHP
You might like
如何开发一个虚拟域名系统
2006/10/09 PHP
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
微信支付的开发流程详解
2016/09/13 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
详解Python self 参数
2019/08/30 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
python中np是做什么的
2020/07/21 Python
Python通过format函数格式化显示值
2020/10/17 Python
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
《比的意义》教学反思
2016/02/18 职场文书
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript