首頁 後端開發 php教程 php中PDO方式實作資料庫的增刪改查範例程式碼

php中PDO方式實作資料庫的增刪改查範例程式碼

Jul 12, 2017 pm 04:10 PM
php 實現 資料庫

PDO是mysql資料庫操作的一個公用類別了,我們不需要進行自定類別就可以直接使用pdo來操作資料庫了,但是在php預設配置中pdo是未開啟所以我們必須先在php.ini開啟它才可以使用。

需要開啟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(&#39;Error:&#39; . $e->getMessage() . &#39;<br/>&#39;);
    }
  }
}
登入後複製

用於處理欄位映射,使用pdo的欄位映射,可以有效避免sql注入

//字段关联数组处理, 主要用于写入和更新数据、同and 或 or 的查询条件,产生sql语句和映射字段的数组
  public function FDFields($data, $link = &#39;,&#39;, $judge = array(), $aliasTable = &#39;&#39;){
    $sql = &#39;&#39;;
    $mapData = array();
    foreach($data as $key => $value) {
      $mapIndex = &#39;:&#39; . ($link != &#39;,&#39; ? &#39;c&#39; : &#39;&#39;) . $aliasTable . $key;
      $sql .= &#39; &#39; . ($aliasTable ? $aliasTable . &#39;.&#39; : &#39;&#39;) . &#39;`&#39; . $key . &#39;` &#39; . ($judge[$key] ? $judge[$key] : &#39;=&#39;) . &#39; &#39; . $mapIndex . &#39; &#39; . $link;
      $mapData[$mapIndex] = $value;
    }
    $sql = trim($sql, $link);
    return array($sql, $mapData);
  }
  //用于处理单个字段处理
  public function FDField($field, $value, $judge = &#39;=&#39;, $preMap = &#39;cn&#39;, $aliasTable = &#39;&#39;) {
    $mapIndex = &#39;:&#39; . $preMap . $aliasTable . $field;
    $sql = &#39; &#39; . ($aliasTable ? $aliasTable . &#39;.&#39; : &#39;&#39;) . &#39;`&#39; . $field . &#39;`&#39; . $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[&#39;str&#39;]) {
        if (is_string($condition[&#39;str&#39;])) {
          $where = $condition[&#39;str&#39;];
        } else {
          return false;
        }
      }
      if(is_array($condition[&#39;data&#39;])) {
        $link = $condition[&#39;link&#39;] ? $condition[&#39;link&#39;] : &#39;and&#39;;
        list($conSql, $mapConData) = $this->FDFields($condition[&#39;data&#39;], $link, $condition[&#39;judge&#39;]);
        if ($conSql) {
          $where .= ($where ? &#39; &#39; . $link : &#39;&#39;) . $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 .= &#39; limit 1&#39;;
      $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 .= &#39; limit &#39; . (int) $limit[0] . &#39;,&#39; . (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 ? &#39;REPLACE INTO &#39; : &#39;INSERT INTO &#39;;
      list($setSql, $mapData) = $this->FDFields($data);
      $sql .= $tableName . &#39; set &#39; . $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 = &#39;UPDATE &#39; . $tableName . &#39; SET &#39;;
      list($setSql, $mapSetData) = $this->FDFields($data);
      $sql .= $setSql;
      $mapData = array_merge($mapData, $mapSetData);
      list($where, $mapData) = $this->FDCondition($condition, $mapData);
      $sql .= $where ? &#39; WHERE &#39; . $where : &#39;&#39;;
      $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 = &#39;DELETE FROM &#39; . $tableName;
      list($where, $mapData) = $this->FDCondition($condition, $mapData);
      $sql .= $where ? &#39; WHERE &#39; . $where : &#39;&#39;;
      $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(&#39;APP_DIR&#39;, dirname(FILE));
 
if (function_exists(&#39;spl_autoload_register&#39;)) {
  spl_autoload_register(&#39;autoClass&#39;);
} else {
  function auto_load($className){
    autoClass($className);
  }
}
 
function autoClass($className){
  try{
    require_once APP_DIR.&#39;/class/&#39;.$className.&#39;.php&#39;;
  } catch (Exception $e) {
    die(&#39;Error:&#39; . $e->getMessage() . &#39;<br />&#39;);
  }
}
$DB = new DB();
//插入
$inData[&#39;a&#39;] = rand(1, 100);
$inData[&#39;b&#39;] = rand(1, 1000);
$inData[&#39;c&#39;] = rand(1,200) . &#39;.&#39; . rand(1,100);
$ret = $DB->insert(&#39;a&#39;, $inData);
echo &#39;插入&#39; . ($ret ? &#39;成功&#39; : &#39;失败&#39;) . &#39;<br/>&#39;;
//更新
$upConData[&#39;a&#39;] = 100;
$upConJudge[&#39;a&#39;] = &#39;<&#39;;
$upConData[&#39;b&#39;] = 30;
$upConJudge[&#39;b&#39;] = &#39;>&#39;;
list($upConStr, $mapUpConData) = $DB->FDField(&#39;b&#39;, 200, &#39;<&#39;, &#39;gt&#39;);
$condition = array(
  &#39;str&#39; => $upConStr,
  &#39;data&#39; => $upConData,
  &#39;judge&#39; => $upConJudge,
  &#39;link&#39; => &#39;and&#39;
);
$upData[&#39;a&#39;] = rand(1, 10);
$upData[&#39;b&#39;] = 1;
$upData[&#39;c&#39;] = 1.00;
$changeRows = $DB->update(&#39;a&#39;, $upData, $condition, $mapUpConData);
echo &#39;更新行数:&#39; . (int) $changeRows . &#39;<br/>&#39;;
//删除
$delVal = rand(1, 10);
list($delCon, $mapDelCon) = $DB->FDField(&#39;a&#39;, $delVal);
$delRet = $DB->delete(&#39;a&#39;, $delCon, $mapDelCon);
echo &#39;删除a=&#39; . $delVal . ($delRet ? &#39;成功&#39; : &#39;失败&#39;) . &#39;<br/>&#39;;
 
//查询
$data[&#39;a&#39;] = &#39;10&#39;;
$judge[&#39;a&#39;] = &#39;>&#39;;
$data[&#39;b&#39;] = &#39;400&#39;;
$judge[&#39;b&#39;] = &#39;<&#39;;
list($conSql, $mapConData) = $DB->FDFields($data, &#39;and&#39;, $judge);
$mData = $DB->fetch(&#39;select * from a where &#39; . $conSql . &#39; order by `a` desc&#39;, $mapConData);
 
var_dump($mData);
登入後複製

以上是php中PDO方式實作資料庫的增刪改查範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
作曲家:通過AI的幫助開發PHP 作曲家:通過AI的幫助開發PHP Apr 29, 2025 am 12:27 AM

AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。

session_start()函數的意義是什麼? session_start()函數的意義是什麼? May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

如何使用MySQL的函數進行數據處理和計算 如何使用MySQL的函數進行數據處理和計算 Apr 29, 2025 pm 04:21 PM

MySQL函數可用於數據處理和計算。 1.基本用法包括字符串處理、日期計算和數學運算。 2.高級用法涉及結合多個函數實現複雜操作。 3.性能優化需避免在WHERE子句中使用函數,並使用GROUPBY和臨時表。

作曲家:PHP開發人員的軟件包經理 作曲家:PHP開發人員的軟件包經理 May 02, 2025 am 12:23 AM

Composer是PHP的依賴管理工具,通過composer.json文件管理項目依賴。 1)解析composer.json獲取依賴信息;2)解析依賴關係形成依賴樹;3)從Packagist下載並安裝依賴到vendor目錄;4)生成composer.lock文件鎖定依賴版本,確保團隊一致性和項目可維護性。

MySQL的字符集和排序規則如何配置 MySQL的字符集和排序規則如何配置 Apr 29, 2025 pm 04:06 PM

在MySQL中配置字符集和排序規則的方法包括:1.設置服務器級別的字符集和排序規則:SETNAMES'utf8';SETCHARACTERSETutf8;SETCOLLATION_CONNECTION='utf8_general_ci';2.創建使用特定字符集和排序規則的數據庫:CREATEDATABASEexample_dbCHARACTERSETutf8COLLATEutf8_general_ci;3.創建表時指定字符集和排序規則:CREATETABLEexample_table(idINT

如何在MySQL中重命名數據庫 如何在MySQL中重命名數據庫 Apr 29, 2025 pm 04:00 PM

MySQL中重命名數據庫需要通過間接方法實現。步驟如下:1.創建新數據庫;2.使用mysqldump導出舊數據庫;3.將數據導入新數據庫;4.刪除舊數據庫。

如何在C  中實現單例模式? 如何在C 中實現單例模式? Apr 28, 2025 pm 10:03 PM

在C 中實現單例模式可以通過靜態成員變量和靜態成員函數來確保類只有一個實例。具體步驟包括:1.使用私有構造函數和刪除拷貝構造函數及賦值操作符,防止外部直接實例化。 2.通過靜態方法getInstance提供全局訪問點,確保只創建一個實例。 3.為了線程安全,可以使用雙重檢查鎖定模式。 4.使用智能指針如std::shared_ptr來避免內存洩漏。 5.對於高性能需求,可以使用靜態局部變量實現。需要注意的是,單例模式可能導致全局狀態的濫用,建議謹慎使用並考慮替代方案。

作曲家的目的:管理PHP中的項目依賴性 作曲家的目的:管理PHP中的項目依賴性 Apr 30, 2025 am 12:01 AM

我們需要Composer因為它能有效管理PHP項目的依賴,避免版本衝突和手動管理庫的麻煩。 Composer通過composer.json聲明依賴,並使用composer.lock確保版本一致,簡化了依賴管理過程,提高了項目穩定性和開發效率。

See all articles