Heim  >  Artikel  >  Datenbank  >  So schreiben Sie Ihr eigenes Datenbankpaket (2)

So schreiben Sie Ihr eigenes Datenbankpaket (2)

PHPz
PHPzOriginal
2017-04-04 14:23:051276Durchsuche


Connector.php

  • Verantwortlich für die Kommunikation mit der Datenbank, das Hinzufügen, Löschen, Ändern und Lesen (CRUD)

Erstellen Sie zunächst eine Connector-Klasse und legen Sie die Attribute fest

<?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,
    ];
}

Der obige Code sollte mit den Kommentaren verständlich sein, also habe ich gewonnen Ich erkläre nicht mehr und gehe direkt zu Funktion

  • buildConnectString – dient zum Generieren einer DSN-Verbindungszeichenfolge, sehr einfach

      protected function buildConnectString() {
          return "$this->driver:host=$this->host;dbname=".self::$db;
      }
          // "mysql:host=localhost;dbname=sakila;"
  • verbinden - Mit der Datenbank verbinden

      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());
          }
      }
  • einstellenDatenbank - Datenbank wechseln

      public function setDatabase($db) {
          self::$db = $db;
          return $this;
      }
  • _construct - zuerst nach dem Generieren der Instanz. Was ist der Zweck des Schritts?

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

Die nächsten beiden Funktionsausdrücke werden zusammen verwendet. Möglicherweise sind Sie verwirrt indem Sie sie allein betrachten. Verwenden Sie das Beispiel, um in einem Schritt zu debuggen

$a = new Connector();

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

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

bindValues ​​​​- Bringen Sie die zugehörigen Parameter der PDO-Instanz ein

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)
    Sie verstehen also?
  • _( :3‖∠)

      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);
      }
  • Aktualisieren - Daten neu schreiben

          // 从例子中可以看出, 我用在预处理的变量为?, 这是因为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
              );
          }
      }

    Löschen

    -
  • Löschen
  • Daten

      // 与read不同的地方在于, read返回数据, update返回boolean(true/false)
      public function update($sql, $bindings) {
          $statement = $this->connection->prepare($sql);
          $this->bindValues($statement, $bindings);
          return $statement->execute();
      }
  • create – Daten hinzufügen

    lastInsertId – Gibt

    neu hinzugefügte
    // 与update一样, 分开是因为方便日后维护制定
      public function delete($sql, $bindings) {
          $statement = $this->connection->prepare($sql);
          $this->bindValues($statement, $bindings);
          return $statement->execute();
      }
    id zurück 🎜>
  • Zu fortgeschrittene und komplexe SQL-Anweisungen werden möglicherweise nicht gekapselt. Daher wurden zwei Funktionen vorbereitet, die mithilfe einer RAW-Abfrage direkt mit der Datenbank kommunizieren können
    // 返回最新的自增ID, 如果有
      public function create($sql, $bindings) {
          $statement = $this->connection->prepare($sql);
          $this->bindValues($statement, $bindings);
          $statement->execute();
          return $this->lastInsertId();
      }
  • exec – geeignet für Ergänzungen, Löschungen und Änderungen

      // pdo自带,只是稍微封装
      public function lastInsertId() {
          $id = $this->connection->lastInsertId();
          return empty($id) ? null : $id;
      }
  • Query – geeignet für Lesen

  • kapselt die Funktionen im Zusammenhang mit Datenbanktransaktionen, unkompliziert, daher gibt es keine Kommentare

      public function exec($sql) {
          return $this->connection->exec($sql);
      }
    Vollständiger Code
  • Fragen in dieser Ausgabe

      public function query($sql) {
          $q = $this->connection->query($sql);
          return $q->fetchAll(PDO::FETCH_OBJ);
      }
    1.) Aufgrund der Eigenschaften von PHP Standardmäßig werden alle Codeklassen von selbst zerstört und pdo wird die Verbindung automatisch trennen. Ich weiß es nicht. Ist das eine schlechte Vorgehensweise? Die beiden Funktionen zum Hinzufügen und Umschreiben von Daten unterstützen nicht das gleichzeitige Hinzufügen mehrerer Datensätze und können nur die Daten gleichzeitig hinzufügen. Der Grund dafür ist, dass ich es zuvor geschrieben habe und es zu umständlich war, also habe ich es gelöscht , durchdachte Kinderschuhe können Lösungen bieten

Das obige ist der detaillierte Inhalt vonSo schreiben Sie Ihr eigenes Datenbankpaket (2). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn