温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在php中利用PDO方式对数据库进行增删改查操作

发布时间:2020-12-23 16:22:04 来源:亿速云 阅读:180 作者:Leah 栏目:开发技术

怎么在php中利用PDO方式对数据库进行增删改查操作?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

需要开启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中利用PDO方式对数据库进行增删改查操作的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI