MySQLI :: Get_Warnings Renvoie une chaîne d'objets MySQLI_WARNING contenant tous les avertissements lors de l'exécution des instructions SQL. Utilisez cette fonction pour saisir des problèmes non mortels tels que la troncature des données, le décalage du type de données, la défaillance de l'index, etc., pour un traitement ultérieur facile.
Cependant, il est lourd d'appeler directement cette méthode et nécessite la traversée de la structure de liste liée retournée. Après l'avoir encapsulé dans une méthode de classe, le processus d'appel peut être simplifié et les informations d'avertissement peuvent être gérées uniformément.
Ajoutez une méthode publique pour obtenir des informations d'avertissement dans la classe Database Driver.
Cette méthode appelle Mysqli :: get_warnings et itère sur la liste d'avertissement, en triant tous les avertissements dans un tableau ou une chaîne.
Fournit une sortie formatée pour une journalisation ou un affichage facile.
Cette méthode est appelée proactive après avoir effectué des opérations SQL pour saisir des problèmes potentiels.
<?php
class DatabaseDriver
{
/** @var mysqli */
protected $mysqli;
public function __construct($host, $user, $password, $dbname, $port = 3306)
{
$this->mysqli = new mysqli($host, $user, $password, $dbname, $port);
if ($this->mysqli->connect_errno) {
throw new Exception("Connect failed: " . $this->mysqli->connect_error);
}
}
/**
* mettre en œuvre SQL Requête
*
* @param string $sql
* @return mysqli_result|bool
*/
public function query(string $sql)
{
$result = $this->mysqli->query($sql);
// Requête后可以检查警告
$warnings = $this->getWarnings();
if (!empty($warnings)) {
// Vous pouvez faire de l'exploitation forestière ou des exceptions ici
foreach ($warnings as $warning) {
error_log("MySQL Warning [{$warning['errno']}]: {$warning['message']} (SQLSTATE: {$warning['sqlstate']})");
}
}
return $result;
}
/**
* Obtenez tous les messages d'avertissement pour la connexion actuelle
*
* @return array Arrimage des messages d'avertissement,Chaque élément contient errno, sqlstate, message
*/
public function getWarnings(): array
{
$warnings = [];
$warning = $this->mysqli->get_warnings();
while ($warning) {
$warnings[] = [
'errno' => $warning->errno,
'sqlstate' => $warning->sqlstate,
'message' => $warning->message,
];
$warning = $warning->next;
}
return $warnings;
}
public function close()
{
$this->mysqli->close();
}
}
// Exemple d'utilisation
$db = new DatabaseDriver('localhost', 'root', 'password', 'testdb');
$db->query("INSERT INTO users (id, name) VALUES (1, 'Alice')");
$db->close();
get_warnings renvoie un avertissement pour la connexion actuelle et peut lire à plusieurs reprises d'anciens avertissements s'ils ne sont pas nettoyés ou utilisés correctement. Habituellement, les avertissements peuvent être lus et nettoyés après l'exécution de chaque instruction, ou si nécessaire, MySqli :: Clear_Warnings () (pris en charge par PHP 8.1+) peut être appelé pour effacer la chaîne d'avertissement pour empêcher les interférences avec les opérations ultérieures.
Il est recommandé de retourner des informations d'avertissement dans un tableau dans l'encapsulation. La couche d'appel peut décider d'enregistrer des journaux ou de lancer des exceptions en fonction des besoins, ce qui améliore la flexibilité.
Certaines versions PHP précoces ont une prise en charge incomplète pour Get_Warnings . La compatibilité des versions doit être prise en compte lors de l'encapsulation ou la vérification des versions doit être utilisée pour se replier sur d'autres méthodes de traitement des erreurs.
L'encapsulation MySQLI :: Get_Warnings dans la classe de pilote de base de données améliore non seulement la réutilisabilité du code, mais facilite également la capture et la gestion des problèmes d'exécution SQL potentiels. Grâce à l'encapsulation et à l'appel raisonnables, les capacités de robustesse et de débogage du système peuvent être considérablement améliorées.
Si vous concevez ou maintenez une classe de pilote de base de données, il est fortement recommandé d'inclure des mécanismes de capture d'avertissement et de les combiner avec des mécanismes de journal ou d'exception pour rendre les opérations de base de données plus transparentes et sécurisées.