OUJOOD.COM
set_charset() / mysqli_set_charset() en PHP PHP 5+
Définition et utilisation
La fonction set_charset() a la définition suivante :
bool set_charset(string $charset, mysqli $link)
Elle prend deux paramètres :
- charset: le jeu de caractères à utiliser (ex: utf8, utf8mb4, latin1).
- link: un objet mysqli représentant la connexion à la base de données.
Valeur de retour : true
si l'opération a réussi, false
sinon.
Syntaxes orientées objet et procédurales
La fonction set_charset() est disponible en deux syntaxes :
- Syntaxe orientée objet (recommandée) :
$mysqli->set_charset("utf8mb4");
- Syntaxe procédurale :
mysqli_set_charset($link, "utf8mb4");
Valeurs possibles et paramètres
La valeur du paramètre charset peut être le nom d'un jeu de caractères MySQL ou le nom d'un jeu de caractères correspondant à une collation MySQL.
Valeurs couramment utilisées :
- utf8mb4 - Recommandé : Support complet Unicode avec emojis
- utf8 - Support Unicode limité (déprécié pour les nouveaux projets)
- latin1 - Caractères latins de base
- gb2312 - Chinois simplifié
- cp1252 - Windows-1252 (Europe occidentale)
Exemples pratiques
Exemple complet avec gestion d'erreurs (orienté objet)
Exemple : 📋 Copier le code
<?php try { $mysqli = new mysqli("localhost", "root", "", "database"); // Vérification de la connexion if ($mysqli->connect_error) { throw new Exception("Erreur de connexion : " . $mysqli->connect_error); } // Configuration du jeu de caractères AVANT toute requête if (!$mysqli->set_charset("utf8mb4")) { throw new Exception("Erreur lors de la définition du charset : " . $mysqli->error); } echo "✅ Connexion établie avec le charset : " . $mysqli->character_set_name() . "\n"; // Exemple d'insertion avec caractères spéciaux $stmt = $mysqli->prepare("INSERT INTO users (name, comment) VALUES (?, ?)"); $name = "Jean-François"; $comment = "Excellent travail ! 👍 😊"; $stmt->bind_param("ss", $name, $comment); if ($stmt->execute()) { echo "✅ Données insérées avec succès\n"; } $stmt->close(); $mysqli->close(); } catch (Exception $e) { echo "❌ Erreur : " . $e->getMessage(); } ?>
Exemple en syntaxe procédurale avec vérifications
Exemple : 📋 Copier le code
<?php $link = mysqli_connect("localhost", "root", "", "database"); // Vérification de la connexion if (mysqli_connect_error()) { die("❌ Erreur de connexion : " . mysqli_connect_error()); } // Configuration du charset avec vérification if (!mysqli_set_charset($link, "utf8mb4")) { die("❌ Erreur charset : " . mysqli_error($link)); } echo "✅ Charset configuré : " . mysqli_character_set_name($link) . "\n"; // Test avec requête préparée $stmt = mysqli_prepare($link, "SELECT * FROM users WHERE name LIKE ?"); $search = "%é%"; // Recherche avec accent mysqli_stmt_bind_param($stmt, "s", $search); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); while ($row = mysqli_fetch_assoc($result)) { echo "Utilisateur : " . $row['name'] . "\n"; } mysqli_stmt_close($stmt); mysqli_close($link); ?>
Exemple de fonction utilitaire réutilisable
Exemple : 📋 Copier le code
<?php class DatabaseConnection { private $mysqli; public function __construct($host, $username, $password, $database, $charset = 'utf8mb4') { $this->mysqli = new mysqli($host, $username, $password, $database); if ($this->mysqli->connect_error) { throw new Exception("Connexion échouée: " . $this->mysqli->connect_error); } // Configuration automatique du charset if (!$this->mysqli->set_charset($charset)) { throw new Exception("Erreur charset: " . $this->mysqli->error); } } public function getConnection() { return $this->mysqli; } public function getCurrentCharset() { return $this->mysqli->character_set_name(); } public function close() { $this->mysqli->close(); } } // Utilisation try { $db = new DatabaseConnection("localhost", "root", "", "database"); echo "✅ Connecté avec charset: " . $db->getCurrentCharset(); // Utiliser $db->getConnection() pour les requêtes $mysqli = $db->getConnection(); // ... vos requêtes ici } catch (Exception $e) { echo "❌ " . $e->getMessage(); } ?>
Astuces et conseils d'utilisation pratique
- Définissez TOUJOURS le jeu de caractères immédiatement après la connexion à la base de données.
- Utilisez le même charset dans votre base de données, vos tables, et votre connexion PHP.
- Vérifiez le charset actuel avec
character_set_name()
en cas de doute.
- utf8mb4 est recommandé pour les nouveaux projets (support complet Unicode)
- Vérifiez toujours le succès de
set_charset()
avant d'exécuter des requêtes - Configurez aussi le charset dans votre fichier de configuration MySQL (
my.cnf
) - Utilisez des requêtes préparées pour éviter les injections SQL
Dépannage des problèmes courants
Cliquez pour voir les solutions aux problèmes fréquents
Caractères affichés incorrectement (????, é, etc.)
- Vérifiez que le charset de la connexion correspond à celui de la base
- Assurez-vous que votre fichier PHP est encodé en UTF-8
- Ajoutez
header('Content-Type: text/html; charset=utf-8');
Emojis non supportés
- Utilisez
utf8mb4
au lieu d'utf8
- Vérifiez que vos colonnes de base de données utilisent
utf8mb4_unicode_ci
Compatibilité et versions
- PHP 5.0+ : Support de base de mysqli_set_charset()
- PHP 5.6+ : Support complet d'utf8mb4
- MySQL 5.5.3+ : Support d'utf8mb4
- MariaDB 5.5+ : Support d'utf8mb4
Conclusion
La fonction set_charset() est un outil essentiel pour garantir l'intégrité des données échangées entre le serveur PHP et le serveur MySQL. En définissant le jeu de caractères approprié (de préférence utf8mb4), vous éviterez les erreurs d'encodage et assurerez un support complet des caractères internationaux et des emojis.