OUJOOD.COM
set_local_infile_handler() : une fonction puissante pour importer des données en PHP
PHP Version: 5+
Définition et utilisation
La fonction set_local_infile_handler() (ou mysqli_set_local_infile_handler() dans l'API orientée objet) permet de définir une fonction de rappel pour le traitement des données importées à l'aide de la commande LOAD DATA LOCAL INFILE.
Paramètres
- handler : la fonction de rappel à définir. Cette fonction doit être de type callable et doit prendre trois paramètres :
- stream : le flux d'entrée contenant les données à importer.
- row : le numéro de ligne courante.
- eof : un drapeau indiquant si la fin du fichier est atteinte.
- handle : un identifiant facultatif pour la fonction de rappel. Cet identifiant peut être utilisé pour supprimer la fonction de rappel ultérieurement à l'aide de la fonction unset_local_infile_handler().
Syntaxes orientées objet et procédurales
La fonction set_local_infile_handler() est disponible dans les deux API, orientée objet et procédurale. La syntaxe est la suivante :
// API procédurale set_local_infile_handler(callable $handler, [int $handle = null]); // API orientée objet mysqli_set_local_infile_handler(mysqli $link, callable $handler, [int $handle = null]);
Valeurs possibles et paramètres
Le paramètre handler peut être une fonction anonyme, une fonction définie par l'utilisateur ou une méthode d'une classe. La fonction doit prendre trois paramètres et retourner un booléen. Si la fonction retourne true, la ligne est importée dans la base de données. Si la fonction retourne false, la ligne est ignorée.
Le paramètre handle est facultatif. Si aucun identifiant n'est fourni, la fonction de rappel est supprimée à la fin de la requête LOAD DATA LOCAL INFILE.
Exemples pratiques
Voici un exemple d'utilisation de la fonction set_local_infile_handler() pour importer des données à partir d'un fichier texte :
Exemple : 📋 Copier le code
<?php function import_data($stream, $row, $eof) { // Traitement des données echo "Ligne $row : " . $stream->readLine() . PHP_EOL; // Retourner true pour importer la ligne return true; } // Importer les données set_local_infile_handler(import_data); $query = "LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE mytable"; mysqli_query($link, $query); ?>
Cet exemple imprime chaque ligne du fichier data.txt dans la console.
Un autre exemple consiste à utiliser la fonction set_local_infile_handler() pour vérifier les données importées avant de les insérer dans la base de données. Par exemple, on pourrait utiliser la fonction suivante pour vérifier que les données sont valides :
Exemple : 📋 Copier le code
<?php function validate_data($stream, $row, $eof) { // Vérifier la validité des données $data = json_decode($stream->readLine(), true); if (!is_array($data) || !array_key_exists("name", $data) || !array_key_exists("age", $data)) { return false; } // Retourner true pour importer la ligne return true; } ?>
Cas d'utilisation de set_local_infile_handler()
Dans ce qui suit nous allons utiliser la base de données 'teste' avec une table 'perso' dont les champs (id, nom, prenom, email et age) et nous utilisons la connexion suivante : $seveur='localhost'; $utilisateur='root'; $motDePasse=''; $ma_base_de_données='teste'; // Connexion à la base de données $link = mysqli_connect($seveur, $utilisateur, $motDePasse, $ma_base_de_données);
Cas 1 : Importer des données d'un fichier texte
Dans ce cas, nous allons importer des données d'un fichier texte appelé 'data.txt' dans la table 'perso'. Le fichier 'data.txt' contient les données suivantes :
Exemple : 📋 Copier le code
id;nom;prenom;email;age 1;John;Doe;john.doe@example.com;25 2;Jane;Doe;jane.doe@example.com;23
Approche procédurale
Exemple : 📋 Copier le code
<?php // Connexion à la base de données $link = mysqli_connect($serveur, $utilisateur, $motDePasse, $ma_base_de_donnees); // Définition de la fonction de rappel function import_data($stream, $row, $eof) { // Lire la ligne du fichier $line = $stream->readLine(); // Divisez la ligne en champs $fields = explode(";", $line); // Importer les données dans la base de données $query = "INSERT INTO perso (id, nom, prenom, email, age) VALUES ($fields[0], '$fields[1]', '$fields[2]', '$fields[3]', $fields[4])"; mysqli_query($link, $query); // Retourner true pour importer la ligne return true; } // Importer les données set_local_infile_handler('import_data'); $query = "LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE perso"; mysqli_query($link, $query); ?>
Approche orientée objet
Exemple : 📋 Copier le code
<?php // Connexion à la base de données $db = new mysqli($serveur, $utilisateur, $motDePasse, $ma_base_de_donnees); // Définition de la fonction de rappel function import_data($stream, $row, $eof) { // Lire la ligne du fichier $line = $stream->readLine(); // Divisez la ligne en champs $fields = explode(";", $line); // Importer les données dans la base de données $query = "INSERT INTO perso (id, nom, prenom, email, age) VALUES ($fields[0], '$fields[1]', '$fields[2]', '$fields[3]', $fields[4])"; $db->query($query); // Retourner true pour importer la ligne return true; } // Importer les données $db->set_local_infile_handler('import_data'); $query = "LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE perso"; $db->query($query); ?>
Cas 2 : Vérifier la validité des données avant l'importation
Dans ce cas, nous allons utiliser la fonction set_local_infile_handler() pour vérifier la validité des données avant de les importer dans la base de données. Nous allons vérifier que les données contiennent au moins un nom et un âge.
Approche procédurale
Exemple : 📋 Copier le code
<?php // Connexion à la base de données $link = mysqli_connect($serveur, $utilisateur, $motDePasse, $ma_base_de_donnees); // Définition de la fonction de rappel function validate_data($stream, $row, $eof) { // Lire la ligne du fichier $line = $stream->readLine(); // Divisez la ligne en champs $fields = explode(";", $line); // Vérifier la validité des données if (empty($fields[1]) || empty($fields[4])) { return false; } // Retourner true pour importer la ligne return true; } // Importer les données set_local_infile_handler('validate_data'); $query = "LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE perso"; mysqli_query($link, $query); ?>
Approche orientée objet
Exemple : 📋 Copier le code
<?php // Connexion à la base de données $db = new mysqli($serveur, $utilisateur, $motDePasse, $ma_base_de_donnees); // Définition de la fonction de rappel function validate_data($stream, $row, $eof) { // Lire la ligne du fichier $line = $stream->readLine(); // Divisez la ligne en champs $fields = explode(";", $line); // Vérifier la validité des données if (empty($fields[1]) || empty($fields[4])) { return false; } // Retourner true pour importer la ligne return true; } // Importer les données $db->set_local_infile_handler('validate_data'); $query = "LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE perso"; $db->query($query); ?>
Ces exemples illustrent comment utiliser set_local_infile_handler() dans les deux approches pour importer des données depuis un fichier texte dans une table MySQL en vérifiant la validité des données avant de les insérer.
Assurez-vous d'adapter le code en fonction de vos besoins spécifiques et de votre structure de base de données.
Astuces et conseils d'utilisation pratique
- La fonction set_local_infile_handler() est utile pour importer des données à partir de fichiers texte ou binaires.
- Il est important de vérifier la validité des données importées avant de les insérer dans la base de données.
- La fonction set_local_infile_handler() peut être utilisée pour importer des données depuis des sources externes, telles que des API ou des services Web.
Pour plus de cas d'utilisation voir autres exemples