PHP에서 PDO 메소드를 사용하여 데이터베이스를 추가, 삭제, 수정 및 쿼리하는 예제 코드

怪我咯
풀어 주다: 2023-03-13 19:08:01
원래의
1342명이 탐색했습니다.

PDO는 mysql 데이터베이스 작업을 위한 공개 클래스입니다. 클래스를 사용자 정의하지 않고도 pdo를 사용하여 직접 데이터베이스를 작업할 수 있습니다. 그러나 php의 기본 구성에서는 pdo가 활성화되어 있지 않으므로 먼저 php에서 설정해야 합니다. ini 전원을 켜야만 사용할 수 있습니다.

php5.1 이상에서 지원되는 PHP의 pdo 지원을 활성화해야 합니다.

데이터베이스 연결의 단일화를 달성하려면 정적 변수, 정적 인스턴스화 방법 및 비공개 constructor 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!