Aktueller Standort: Startseite> Neueste Artikel> Schreiben Sie eine allgemeine Verbindungsklasse, die automatisch Zeichensätze erkennt und festlegt.

Schreiben Sie eine allgemeine Verbindungsklasse, die automatisch Zeichensätze erkennt und festlegt.

M66 2025-05-18

In der PHP -Entwicklung sind Charakter -Set -Probleme ein häufiges, aber leicht übersehenes Detail. Wenn der Zeichensatz nicht korrekt festgelegt ist, kann er chinesischen verstümmelten Code, Datenspeicherausnahmen und sogar Sicherheitslücken (z.
In diesem Artikel wird beschrieben, wie Sie ein schreiben, das den aktuell verwendeten Zeichen automatisch erkennt, nachdem er eine Verbindung zur Datenbank hergestellt hat, und wechselt automatisch auf den angegebenen Zeichensatz, um sicherzustellen, dass die Anwendung mehrsprachige Daten stabil und zuverlässig verarbeitet.

Warum mySqli :: get_charset und set_charset inkapseln?

Die MySQLI -Erweiterung enthält die Methoden get_charset () und set_charset () :

  • get_charset () wird verwendet, um die Zeichensatzinformationen der aktuellen Verbindung zu erhalten.

  • set_charset () wird verwendet, um den von der Verbindung verwendeten Zeichensatz festzulegen.

Im tatsächlichen Gebrauch vergessen jedoch viele Entwickler häufig, den Zeichensatz nach dem Erstellen einer Verbindung zu überprüfen oder zu ändern und den Standardwert (normalerweise Latin1 ) direkt zu verwenden, der versteckte Gefahren für mehrsprachige Unterstützung darstellt.

Das Einkapseln dieser beiden Methoden in eine gemeinsame Verbindungsklasse kann dies tun:
? Erkennen Sie automatisch den aktuellen Zeichensatz
? Wechseln Sie automatisch auf den erforderlichen Zeichensatz (z. B. UTF8MB4 )
? Stellen Sie eine kurze und konsistente Schnittstelle zur Reduzierung des doppelten Codes an

Code implementieren

Im Folgenden finden Sie eine einfache Implementierung der DBConnection -Klasse, die die Verbindungslogik von MySQLI zusammenfasst und den Zeichensatz nach der Verbindung automatisch anpasst.

 <?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('Verbindung ist fehlgeschlagen: ' . $this->mysqli->connect_error);
        }

        // Erkennen Sie den aktuellen Zeichensatz
        $currentCharsetInfo = $this->mysqli->get_charset();
        if ($currentCharsetInfo) {
            $currentCharset = $currentCharsetInfo->charset;
            if (strtolower($currentCharset) !== strtolower($this->charset)) {
                // Eingestellt auf den angegebenen Zeichensatz
                if (!$this->mysqli->set_charset($this->charset)) {
                    die('Versäumte das Set -Zeichensatz: ' . $this->mysqli->error);
                }
            }
        } else {
            die('Die aktuellen Zeichensatzinformationen können nicht erhalten werden: ' . $this->mysqli->error);
        }
    }

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

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

// Beispiel für die Nutzung
$db = new DbConnection('localhost', 'db_user', 'db_pass', 'db_name');

// Eine Frage ausführen
$result = $db->getConnection()->query('SELECT * FROM example_table');

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

$db->close();

Codeschlüsselanalyse

1 ?? Der Konstruktor empfängt Verbindungsinformationen und Zielzeichenset <br> Der Standard -Zielzeichenset ist UTF8MB4 , der empfohlene MySQL -Zeichensatz, der Emoji und mehrsprachige Inhalte besser unterstützen kann.

2 ?? Überprüfen Sie den aktuellen Zeichen, der nach einer erfolgreichen Verbindung <br> festgelegt ist Rufen Sie get_charset () auf, um den von der aktuellen Verbindung verwendeten Zeichensatz zu erhalten.

3 ?? Wenn unterschiedlich, wechseln Sie automatisch <br> Aufrufen von set_charset () Änderungen am Zielzeichen, um zu vermeiden, dass sie auf die Standardkonfiguration von MySQL stützen.

4 ?? Bereitstellung einer Abschlussmethode <br> Rufen Sie aktiv Close () an , wenn keine Verbindung erforderlich ist, um eine Anschlusse zu vermeiden.

Erweiterungen: Verbindungskonfiguration und Fehlerprotokoll

In einem realen Projekt möchten Sie möglicherweise Datenbankparameter aus einer Konfigurationsdatei (z. B. config.php ) laden oder sich in einer Datei protokollieren, wenn ein Fehler anstelle von Die () auftritt. Zum Beispiel:

 error_log('Datenbankfehler: ' . $this->mysqli->error, 3, '/var/log/db_errors.log');

Sie können auch PDO oder andere Datenbankbibliotheken kombinieren, um allgemeinere Methoden wie Transaktionen, Vorverarbeitungsabfragen usw. zu verkapulieren, usw.

Beispiel: Stellen Sie eine Verbindung zur Datenbank M66.net her

Wenn Sie eine Verbindung zu einer Datenbank mit dem Domänennamen m66.net herstellen möchten, können Sie sie so schreiben: