>  기사  >  데이터 베이스  >  자신만의 데이터베이스 패키지를 작성하는 방법 (2)

자신만의 데이터베이스 패키지를 작성하는 방법 (2)

PHPz
PHPz원래의
2017-04-04 14:23:051325검색


Connector.php

  • 데이터베이스와의 통신, 추가, 삭제, 수정 및 읽기(CRUD)를 담당합니다.

먼저 커넥터 클래스를 생성하고 속성

<?php
class Connector {
    // 数据库地址前缀,常见的有mysql,slqlsrv,odbc等等等
    private $driver = &#39;mysql&#39;;
    // 数据库地址
    private $host = &#39;localhost&#39;;
    // 数据库默认名称, 设置为静态是因为有切换数据库的需求
    private static $db = &#39;sakila&#39;;
    // 数据库用户名
    private $username = &#39;root&#39;;
    // 数据库密码
    private $password = &#39;&#39;;
    // 当前数据库连接
    protected $connection;
    // 数据库连接箱,切换已存在的数据库连接不需要重新通信,从这里取即可
    protected static $container = [];

    // PDO默认属性配置,具体请自行查看文档
    protected $options = [
        PDO::ATTR_CASE => PDO::CASE_NATURAL,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
        PDO::ATTR_STRINGIFY_FETCHES => false,
    ];
}

를 설정합니다. 위 코드는 주석으로 이해할 수 있어야 하므로 생략하겠습니다. 더 자세히 설명하고 함수

  • buildConnectString으로 직접 이동하세요. DSN 연결 문자열을 생성하는 것입니다. 매우 간단합니다

      protected function buildConnectString() {
          return "$this->driver:host=$this->host;dbname=".self::$db;
      }
          // "mysql:host=localhost;dbname=sakila;"
  • connect - 데이터베이스에 연결

      public function connect() {
          try {
              // 连接数据库,生成pdo实例, 将之赋予$connection,并存入$container之中
              self::$container[self::$db] = $this->connection = new PDO($this->buildConnectString(), $this->username, $this->password, $this->options);
              // 返回数据库连接
              return $this->connection;
          } catch (Exception $e) {
              // 若是失败, 返回原因
              // 还记得dd()吗?这个辅助函数还会一直用上
              dd($e->getMessage());
          }
      }
  • set데이터베이스 - 데이터베이스 전환

      public function setDatabase($db) {
          self::$db = $db;
          return $this;
      }
  • _construct - 인스턴스 생성 후 첫 번째 단계는 무엇입니까

      function construct() {
          // 如果从未连接过该数据库, 那就新建连接
          if(empty(self::$container[self::$db])) $this->connect();
          // 反之, 从$container中提取, 无需再次通信
          $this->connection = self::$container[self::$db];
      }

다음 두 함수 표현식은 함께 사용되므로 예제를 사용하여 디버깅할 수 있습니다. 단계별

$a = new Connector();

$bindValues = [
    'PENELOPE',
    'GUINESS'
];

dd($a->read('select * from actor where first_name = ? and last_name = ?', $bindValues));
반환 값

array (size=1)
  0 => 
    object(stdClass)[4]
      public 'actor_id' => string '1' (length=1)
      public 'first_name' => string 'PENELOPE' (length=8)
      public 'last_name' => string 'GUINESS' (length=7)
      public 'last_update' => string '2006-02-15 04:34:33' (length=19)
  • 읽기 - 데이터 읽기

      public function read($sql, $bindings) {
          // 将sql语句放入预处理函数
          // $sql = select * from actor where first_name = ? and last_name = ?
          $statement = $this->connection->prepare($sql);
          // 将附带参数带入pdo实例
          // $bindings = ['PENELOPE', 'GUINESS']
          $this->bindValues($statement, $bindings);
          // 执行
          $statement->execute();
          // 返回所有合法数据, 以Object对象为数据类型
          return $statement->fetchAll(PDO::FETCH_OBJ);
      }
  • bindValues ​​​​- 가져오기 첨부된 매개변수를 pdo 인스턴스에

          // 从例子中可以看出, 我用在预处理的变量为?, 这是因为pdo的局限性, 有兴趣可以在评论区讨论这个问题
      public function bindValues($statement, $bindings) {
          // $bindings = ['PENELOPE', 'GUINESS']
          // 依次循环每一个参数
          foreach ($bindings as $key => $value) {
              // $key = 0/1
              // $value = 'PENELOPE'/'GUINESS'
              $statement->bindValue(
                  // 如果是字符串类型, 那就直接使用, 反之是数字, 将其+1
                  // 这里是数值, 因此返回1/2
                  is_string($key) ? $key : $key + 1,
                  // 直接放入值
                  // 'PENELOPE'/'GUINESS'
                  $value,
                  // 这里直白不多说
                  // PDO::PARAM_STR/PDO::PARAM_STR
                  is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR
              );
          }
      }
    그럼 이해하셨나요

    _( :3 ∠)

  • update - rewrite data

      // 与read不同的地方在于, read返回数据, update返回boolean(true/false)
      public function update($sql, $bindings) {
          $statement = $this->connection->prepare($sql);
          $this->bindValues($statement, $bindings);
          return $statement->execute();
      }
  • 삭제 - 데이터삭제

  • 생성 - 데이터 추가

    // 与update一样, 分开是因为方便日后维护制定
      public function delete($sql, $bindings) {
          $statement = $this->connection->prepare($sql);
          $this->bindValues($statement, $bindings);
          return $statement->execute();
      }
  • lastInsertId -

    Add id를 반환합니다.

    // 返回最新的自增ID, 如果有
      public function create($sql, $bindings) {
          $statement = $this->connection->prepare($sql);
          $this->bindValues($statement, $bindings);
          $statement->execute();
          return $this->lastInsertId();
      }
너무 고급스럽고 복잡한 SQL 문은 캡슐화되지 않을 수 있으므로 두 가지를 준비했습니다. RAW 쿼리

  • exec를 이용하여 데이터베이스와 직접 통신할 수 있는 함수 - 추가, 삭제, 수정

      // pdo自带,只是稍微封装
      public function lastInsertId() {
          $id = $this->connection->lastInsertId();
          return empty($id) ? null : $id;
      }
  • 쿼리에 적합 - 읽기에 적합

      public function exec($sql) {
          return $this->connection->exec($sql);
      }
데이터베이스 트랜잭션 관련 기능을 간단하게 캡슐화하여 코멘트가 없습니다.

  public function query($sql) {
      $q = $this->connection->query($sql);
      return $q->fetchAll(PDO::FETCH_OBJ);
  }
전체 코드

        public function beginTransaction() {
        $this->connection->beginTransaction();
        return $this;
    }

    public function rollBack() {
        $this->connection->rollBack();
        return $this;
    }

    public function commit() {
        $this->connection->commit();
        return $this;
    }

    public function inTransaction() {
        return $this->connection->inTransaction();
    }

이 문제에 대한 질문

1.) PHP 자체의 특성상 기본적으로 모든 코드 클래스는 실행 후 스스로 소멸되며, pdo는 자동으로 연결을 끊기 때문에 연결을 끊지 않고() pdo 연결을 끊게 하는 것이 나쁜 것인지 궁금합니다. 연습?

2.) 데이터 추가와 다시 쓰기 두 가지 기능은 여러 데이터 세트를 한 번에 추가하는 것을 지원하지 않습니다. 이유는 너무 번거롭다고 생각해서 삭제했기 때문입니다. .사려 깊은 어린이 신발이 솔루션을 제공할 수 있습니다


위 내용은 자신만의 데이터베이스 패키지를 작성하는 방법 (2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.