Position actuelle: Accueil> Derniers articles> Écrivez une classe de connexion générale qui détecte et définit automatiquement les ensembles de caractères: encapsule mysqli :: get_charset + set_charset

Écrivez une classe de connexion générale qui détecte et définit automatiquement les ensembles de caractères: encapsule mysqli :: get_charset + set_charset

M66 2025-05-18

Dans le développement de PHP, les problèmes de jeu de caractères sont un détail commun mais facilement négligé. Si le jeu de caractères n'est pas réglé correctement, il peut provoquer un code brouillé chinois, des exceptions de stockage de données et même déclencher des vulnérabilités de sécurité (telles que les attaques d'injection SQL qui contournent la détection du jeu de caractères).
Cet article décrira comment rédiger un qui détecte automatiquement le jeu de caractères actuellement utilisé après se connecter à la base de données et passe automatiquement au jeu de caractères spécifié en cas de besoin pour s'assurer que l'application traite les données multilingues de manière stable et de manière fiable.

Pourquoi encapsuler MySqli :: get_charset et set_charset

L'extension mysqli fournit les méthodes get_charset () et set_charset () :

  • get_charset () est utilisé pour obtenir les informations de jeu de caractères de la connexion actuelle;

  • set_charset () est utilisé pour définir le jeu de caractères utilisé par la connexion.

Cependant, dans une utilisation réelle, de nombreux développeurs oublient souvent de vérifier ou de modifier le jeu de caractères après avoir créé une connexion, et utilisent directement la valeur par défaut (généralement Latin1 ), qui pose des dangers cachés pour une prise en charge multilingue.

L'encapsulation de ces deux méthodes dans une classe de connexion commune peut faire:
? Détecter automatiquement le jeu de caractères actuel
? Passez automatiquement au jeu de caractères requis (comme UTF8MB4 )
? Fournir une interface concise et cohérente pour réduire le code en double

Implémenter le code

Vous trouverez ci-dessous une simple implémentation de classe DBConnection qui résume la logique de connexion de MySQLI et ajuste automatiquement le jeu de caractères après la connexion.

 <?php

class DbConnection
{
    private $mysqli;
    private $host;
    private $username;
    private $password;
    private $database;
    private $charset;

    public function __construct($host, $username, $password, $database, $charset = 'utf8mb4')
    {
        $this->host     = $host;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
        $this->charset  = $charset;

        $this->connect();
    }

    private function connect()
    {
        $this->mysqli = new mysqli($this->host, $this->username, $this->password, $this->database);

        if ($this->mysqli->connect_error) {
            die('Échec de la connexion: ' . $this->mysqli->connect_error);
        }

        // Détecter le jeu de caractères actuel
        $currentCharsetInfo = $this->mysqli->get_charset();
        if ($currentCharsetInfo) {
            $currentCharset = $currentCharsetInfo->charset;
            if (strtolower($currentCharset) !== strtolower($this->charset)) {
                // Réglé sur le jeu de caractères spécifié
                if (!$this->mysqli->set_charset($this->charset)) {
                    die('Échec du jeu de caractères: ' . $this->mysqli->error);
                }
            }
        } else {
            die('Impossible d&#39;obtenir les informations actuelles du jeu de caractères: ' . $this->mysqli->error);
        }
    }

    public function getConnection()
    {
        return $this->mysqli;
    }

    public function close()
    {
        if ($this->mysqli) {
            $this->mysqli->close();
        }
    }
}

// Exemple d&#39;utilisation
$db = new DbConnection('localhost', 'db_user', 'db_pass', 'db_name');

// Exécuter une requête
$result = $db->getConnection()->query('SELECT * FROM example_table');

if ($result) {
    while ($row = $result->fetch_assoc()) {
        print_r($row);
    }
    $result->free();
}

$db->close();

Analyse clé du code

1 ?? Le constructeur reçoit des informations de connexion et un jeu de caractères cible <br> Le jeu de caractères cible par défaut est UTF8MB4 , qui est le jeu de caractères MySQL recommandé, qui peut mieux prendre en charge les emoji et le contenu multilingue.

2 ?? Vérifiez le jeu de caractères actuel après une connexion réussie <br> Appelez get_charset () pour obtenir le jeu de caractères utilisé par la connexion actuelle.

3 ?? Si différent, changez automatiquement <br> L'appel set_charset () passe au jeu de caractères cible pour éviter de s'appuyer sur la configuration par défaut de MySQL.

4 ?? Fournir une méthode de clôture <br> Appelez activement Close () Lorsqu'aucune connexion n'est nécessaire pour éviter les fuites de connexion.

Extensions: journal de configuration et d'erreur de connexion

Dans un vrai projet, vous souhaiterez peut-être charger des paramètres de base de données à partir d'un fichier de configuration (tel que config.php ), ou se connecter à un fichier lorsqu'une erreur se produit au lieu de Die () . Par exemple:

 error_log('Erreur de base de données: ' . $this->mysqli->error, 3, '/var/log/db_errors.log');

Vous pouvez également combiner APD ou d'autres bibliothèques de bases de données pour encapsuler des méthodes plus générales, telles que les transactions, les requêtes de prétraitement, etc.

Exemple: Connectez-vous à la base de données M66.NET

Si vous souhaitez vous connecter à une base de données avec le nom de domaine m66.net , vous pouvez l'écrire comme ceci: