Table des matières
Connector.php
Maison base de données tutoriel mysql Comment écrire votre propre package de base de données (2)

Comment écrire votre propre package de base de données (2)

Apr 04, 2017 pm 02:23 PM
数据库封装


Connector.php

  • Responsable de la communication avec la base de données, de l'ajout, de la suppression, de la modification et de la lecture (CRUD)

Tout d'abord, créez une classe Connector et définissez les attributs

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<?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,

    ];

}

Copier après la connexion

Le code ci-dessus devrait être compréhensible avec l' annotation, j'ai donc gagné Je n'explique pas plus et allons directement à Fonction

  • buildConnectString - consiste à générer une chaîne de connexion DSN, très simple

    1

    2

    3

    4

      protected function buildConnectString() {

          return "$this->driver:host=$this->host;dbname=".self::$db;

      }

          // "mysql:host=localhost;dbname=sakila;"

    Copier après la connexion
  • connecter - Se connecter à la base de données

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

      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());

          }

      }

    Copier après la connexion
  • setBase de données - changer de base de données

    1

    2

    3

    4

      public function setDatabase($db) {

          self::$db $db;

          return $this;

      }

    Copier après la connexion
  • _construct - d'abord après avoir généré l'instance Quel est le but de l'étape ?

    1

    2

    3

    4

    5

    6

      function construct() {

          // 如果从未连接过该数据库, 那就新建连接

          if(empty(self::$container[self::$db])) $this->connect();

          // 反之, 从$container中提取, 无需再次通信

          $this->connection = self::$container[self::$db];

      }

    Copier après la connexion

Les deux expressions fonctionnelles suivantes sont utilisées ensemble. Vous pouvez être confus. en les regardant seuls. Utilisez l'exemple pour déboguer en une seule étape

1

2

3

4

5

6

7

8

$a new Connector();

 

$bindValues = [

    'PENELOPE',

    'GUINESS'

];

 

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

Copier après la connexion

Valeur de retour

1

2

3

4

5

6

7

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)

Copier après la connexion
  • lire - lire les données.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

      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);

      }

    Copier après la connexion
  • bindValues ​​​​- apportez les paramètres d'accompagnement de l'instance pdo

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

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

              );

          }

      }

    Copier après la connexion

    Alors vous comprenez ?_( :3‖∠)

  • mettre à jour - réécrire les données

    1

    2

    3

    4

    5

    6

      // 与read不同的地方在于, read返回数据, update返回boolean(true/false)

      public function update($sql$bindings) {

          $statement $this->connection->prepare($sql);

          $this->bindValues($statement$bindings);

          return $statement->execute();

      }

    Copier après la connexion
  • supprimer - Supprimerles données

    1

    2

    3

    4

    5

    6

    // 与update一样, 分开是因为方便日后维护制定

      public function delete($sql$bindings) {

          $statement $this->connection->prepare($sql);

          $this->bindValues($statement$bindings);

          return $statement->execute();

      }

    Copier après la connexion
  • create - Ajouter des données

    1

    2

    3

    4

    5

    6

    7

    // 返回最新的自增ID, 如果有

      public function create($sql$bindings) {

          $statement $this->connection->prepare($sql);

          $this->bindValues($statement$bindings);

          $statement->execute();

          return $this->lastInsertId();

      }

    Copier après la connexion
  • lastInsertId - Renvoie id nouvellement ajouté s'il y a <.>

    1

    2

    3

    4

    5

      // pdo自带,只是稍微封装

      public function lastInsertId() {

          $id $this->connection->lastInsertId();

          return empty($id) ? null : $id;

      }

    Copier après la connexion
Les instructions SQL trop avancées et complexes peuvent ne pas être encapsulées, j'ai donc préparé deux fonctions pouvant communiquer directement avec la base de données à l'aide d'une requête RAW

  • exec - adapté aux ajouts, suppressions et modifications

    1

    2

    3

      public function exec($sql) {

          return $this->connection->exec($sql);

      }

    Copier après la connexion
  • requête - adapté à la lecture

    1

    2

    3

    4

      public function query($sql) {

          $q $this->connection->query($sql);

          return $q->fetchAll(PDO::FETCH_OBJ);

      }

    Copier après la connexion
Encapsuler les fonctions liés aux transactions de base de données, simples donc il n'y a pas de commentaires

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

        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();

    }

Copier après la connexion
Code complet

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

<?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,

    ];

 

    function construct() {

        // 如果从未连接过该数据库, 那就新建连接

        if(empty(self::$container[self::$db])) $this->connect();

        // 反之, 从$container中提取, 无需再次通信

        $this->connection = self::$container[self::$db];

    }

 

    // 生成DSN连接串

    protected function buildConnectString() {

        return "$this->driver:host=$this->host;dbname=".self::$db;

    }

 

    // 连接数据库

    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($e->getMessage());

        }

    }

 

    // 切换数据库

    public function setDatabase($db) {

        self::$db $db;

        return $this;

    }

 

    // 读取数据

    public function read($sql$bindings) {

        // 将sql语句放入预处理函数

        $statement $this->connection->prepare($sql);

        // 将附带参数带入pdo实例

        $this->bindValues($statement$bindings);

        // 执行

        $statement->execute();

        // 返回所有合法数据, 以Object对象为数据类型

        return $statement->fetchAll(PDO::FETCH_OBJ);

    }

 

    // 将附带参数带入pdo实例

    public function bindValues($statement$bindings) {

        // 依次循环每一个参数

        foreach ($bindings as $key => $value) {

            $statement->bindValue(

                // 如果是字符串类型, 那就直接使用, 反之是数字, 将其+1

                is_string($key) ? $key $key + 1,

                // 直接放入值

                $value,

                // 这里直白不多说

                is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR

            );

        }

    }

 

    // 改写数据

    public function update($sql$bindings) {

        // 与read不同的地方在于, read返回数据, update返回boolean(true/false)

        $statement $this->connection->prepare($sql);

        $this->bindValues($statement$bindings);

        return $statement->execute();

    }

 

    // 删除数据

    public function delete($sql$bindings) {

        $statement $this->connection->prepare($sql);

        $this->bindValues($statement$bindings);

        return $statement->execute();

    }

 

    // 增加数据

    public function create($sql$bindings) {

        $statement $this->connection->prepare($sql);

        $this->bindValues($statement$bindings);

        $statement->execute();

        return $this->lastInsertId();

    }

 

    // 返回新增id, 如果有

    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();

    }

}

Copier après la connexion
Questions dans ce numéro

1.) En raison des caractéristiques de PHP lui-même, par défaut, toutes les classes de code seront détruites d'elles-mêmes et pdo se déconnectera automatiquement, donc je n'ai pas déconnecté() et laissé pdo se déconnecter, je ne sais pas. Est-ce une mauvaise pratique ?

2.) Les deux. les fonctions d'ajout et de réécriture de données ne prennent pas en charge l'ajout de plusieurs ensembles de données à la fois et ne peuvent ajouter que les données à la fois. La raison est que je l'ai écrit auparavant et que c'était trop fastidieux, alors je l'ai supprimé. les chaussures pour enfants peuvent apporter des solutions


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
4 Il y a quelques semaines By DDD
Musée à deux points: toutes les expositions et où les trouver
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment modifier une table dans MySQL en utilisant l'instruction ALTER TABLE? Comment modifier une table dans MySQL en utilisant l'instruction ALTER TABLE? Mar 19, 2025 pm 03:51 PM

L'article discute de l'utilisation de l'instruction ALTER TABLE de MySQL pour modifier les tables, notamment en ajoutant / abandon les colonnes, en renommant des tables / colonnes et en modifiant les types de données de colonne.

Comment configurer le cryptage SSL / TLS pour les connexions MySQL? Comment configurer le cryptage SSL / TLS pour les connexions MySQL? Mar 18, 2025 pm 12:01 PM

L'article discute de la configuration du cryptage SSL / TLS pour MySQL, y compris la génération et la vérification de certificat. Le problème principal est d'utiliser les implications de sécurité des certificats auto-signés. [Compte de caractère: 159]

Comment gérez-vous les grands ensembles de données dans MySQL? Comment gérez-vous les grands ensembles de données dans MySQL? Mar 21, 2025 pm 12:15 PM

L'article traite des stratégies pour gérer de grands ensembles de données dans MySQL, y compris le partitionnement, la rupture, l'indexation et l'optimisation des requêtes.

Quels sont les outils de GUI MySQL populaires (par exemple, MySQL Workbench, PhpMyAdmin)? Quels sont les outils de GUI MySQL populaires (par exemple, MySQL Workbench, PhpMyAdmin)? Mar 21, 2025 pm 06:28 PM

L'article traite des outils de GUI MySQL populaires comme MySQL Workbench et PhpMyAdmin, en comparant leurs fonctionnalités et leur pertinence pour les débutants et les utilisateurs avancés. [159 caractères]

Comment déposez-vous une table dans MySQL à l'aide de l'instruction TABLE DROP? Comment déposez-vous une table dans MySQL à l'aide de l'instruction TABLE DROP? Mar 19, 2025 pm 03:52 PM

L'article discute de la suppression des tables dans MySQL en utilisant l'instruction TABLE DROP, mettant l'accent sur les précautions et les risques. Il souligne que l'action est irréversible sans sauvegardes, détaillant les méthodes de récupération et les risques potentiels de l'environnement de production.

Comment représentez-vous des relations en utilisant des clés étrangères? Comment représentez-vous des relations en utilisant des clés étrangères? Mar 19, 2025 pm 03:48 PM

L'article discute de l'utilisation de clés étrangères pour représenter les relations dans les bases de données, en se concentrant sur les meilleures pratiques, l'intégrité des données et les pièges communs à éviter.

Comment créez-vous des index sur les colonnes JSON? Comment créez-vous des index sur les colonnes JSON? Mar 21, 2025 pm 12:13 PM

L'article discute de la création d'index sur les colonnes JSON dans diverses bases de données comme PostgreSQL, MySQL et MongoDB pour améliorer les performances de la requête. Il explique la syntaxe et les avantages de l'indexation des chemins JSON spécifiques et répertorie les systèmes de base de données pris en charge.

Comment sécuriser MySQL contre les vulnérabilités communes (injection SQL, attaques par force brute)? Comment sécuriser MySQL contre les vulnérabilités communes (injection SQL, attaques par force brute)? Mar 18, 2025 pm 12:00 PM

L'article discute de la sécurisation MySQL contre l'injection SQL et les attaques brutales à l'aide de déclarations préparées, de validation des entrées et de politiques de mot de passe solides (159 caractères)

See all articles