Lorsque vous utilisez l'extension MySQLI de PHP pour les opérations de base de données, nous pouvons obtenir la longueur réelle de chaque champ dans la ligne actuelle via la propriété MySQLI_RESULT :: $ Longueurs . Cette propriété est particulièrement utile lors de la gestion des champs binaires ou de longueur variable (tels que blob, texte). Mais comment détectez-vous si vous vous inquiétez de savoir si la longueur du champ dépasse la limite attendue ou définie? Cet article vous fera étape par étape pour comprendre comment atteindre cet objectif.
MySQLI_RESULT :: $ LONGTES est un attribut de l'objet mysqli_result . Il renvoie un tableau où chaque élément dans le tableau représente la longueur d'octets de chaque champ dans une ligne dans l'ensemble de résultats actuel. Cette valeur est la longueur réelle des données, et non la longueur définie du champ de la base de données.
Supposons que nous ayons la structure de table MySQL suivante:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(20),
bio TEXT
);
Nous voulons nous assurer que le champ de nom d'utilisateur obtenu à partir de la base de données ne dépasse pas la limite de Varchar (20) , soit 20 caractères.
Nous pouvons combiner la définition du champ et $ Result-> longueurs pour réaliser la fonction de détection si le champ est trop long.
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
$query = "SELECT id, username, bio FROM users";
$result = $mysqli->query($query);
if ($result) {
// Obtenir des informations de définition de champ
$fields = $result->fetch_fields();
while ($row = $result->fetch_assoc()) {
$lengths = $result->lengths;
foreach ($fields as $index => $field) {
$fieldName = $field->name;
$maxLength = $field->length;
// Avis:pour VARCHAR et CHAR Champs,$field->length C'est la longueur du caractère * Nombre maximum d'octets dans le jeu de caractères
// La conversion réelle doit être combinée avec un jeu de caractères,Supposons ici UTF-8(la plupart 3-4 octet/personnage)
$expectedBytes = $maxLength * 4;
if ($lengths[$index] > $expectedBytes) {
echo "Champs '{$fieldName}' La longueur du contenu dépasse la limite attendue:{$lengths[$index]} octet\n";
}
}
}
}
$mysqli->close();
?>
$ field-> la longueur est généralement donnée par le nombre maximum d'octets et ne peut pas être directement équivalent à la longueur du caractère. Surtout lorsque vous utilisez des jeux de caractères multi-octets (tels que UTF-8), la relation entre les octets et les caractères doit être convertie.
Pour les champs de type blob ou de texte, MySQL lui-même permet de plus grandes longueurs, vous devez donc personnaliser les critères limites en fonction de la logique métier.
Si la teneur en champ a été échappée ou codée, la longueur d'octets peut également être augmentée. Par conséquent, $ Result-> Les longueurs ne peuvent être utilisées que comme méthode d'estimation. Il est toujours recommandé de combiner le jugement avec les règles commerciales lorsqu'il est réellement utilisé.
Les champs qui dépassent la limite peuvent être connectés au journal pour le dépannage des problèmes de source de données ou des erreurs de logique métier.
if ($lengths[$index] > $expectedBytes) {
file_put_contents("/var/log/field_overflow.log", date('c') . " - Champs '{$fieldName}' Limite dépassée。longueur: {$lengths[$index]}\n", FILE_APPEND);
}
Vous pouvez également alarmer via l'interface Web, par exemple, appeler une interface similaire à https://gitbox.net/api/notify?type=length_warning à alerter.
Grâce à la combinaison de mysqli_result :: $ longueurs et fetch_fields () , nous pouvons surveiller efficacement si la longueur du champ dans la base de données répond aux attentes. Dans les systèmes d'ensemble multilingue et multi-caractères, cette détection est particulièrement critique et peut aider les développeurs à découvrir à l'avance des problèmes de données potentiels. Il est recommandé d'intégrer une telle logique dans des processus à haut risque tels que l'importation de données et la saisie des utilisateurs pour améliorer la robustesse du système.