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.
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
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();
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.
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.
Wenn Sie eine Verbindung zu einer Datenbank mit dem Domänennamen m66.net herstellen möchten, können Sie sie so schreiben: