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

前端技术 2023/09/09 PHP

需要开启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);

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

本文地址:https://www.stayed.cn/item/25475

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。