Importer des données CSV dans une base distant via une application Slim Framework

Imaginez que vous vous retrouvez avec une base de données au quelle vous ne pouvez que passer via une langage de développement pour réaliser des modifications ! Comment s’y prendre ?

Je me suis retrouvé dans cette situation avec un mini portail que j’ai développé en PHP. Pour son hébergement, je ne me suis pas trop cassé la tête. Je l’ai hébergé sur mini serveur connecté au réseau local de l’entreprise.

Je passais directement par phpmyadmin pour créer des tables et importer des données. Depuis le début du confinement en prévention du COVID-19, je peux accéder à l’outil en étant connecté sur le VPN de l’entreprise mais je ne peux pas accéder à phpmyadmin car malheureusement je ne l’ai pas configuré pour être accessible à distance.

J’aurais pu gérer le poste à distance ! me diriez-vous. Mais NON ! Il n’étais pas question que je prends la main sur ce serveur car plus d’une applications indispensable tournent dessus.

La solution

La solution, la plus simple en tout cas, est de passer par PHP pour réaliser les taches voulues. Les étapes à réaliser sont les suivants:

écrire le code SQL pour la création de la table voulue

CREATE TABLE `NOM_TABLE` (
	`id` varchar(250) NOT NULL,
	`name` varchar(250) NOT NULL,
	`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, 
	`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Exécuter ce code SQL via Slim Framework

Je ne vais pas m’attarder sur l’utilisation de Slim. Ceci n’étant pas l’objectif de ce tutoriel. Sachez seulement que la méthode en soi ne dépend pas de Slim. Vous pouvez exécuter le même code avec PDO sans trop de difficulté.

Pour ma part, j’utilise Slim Framework avec l’ORM « Eloquent » avec la possibilité d’accéder à une instance d’une connexion à ma base de donnée dans chaque « Controller ». Le code à exécuter pour créer la base de donnée est simple. il suffit d’appeler l’instruction suivant dans une méthode de mon « Controller » :

$this->db->connection()->statement($req);

une petite précision mais important s’impose: le code tourne depuis le serveur distant. j’ai eu juste à mapper un lecteur pour commencer à ajouter les fichiers nécessaires.

Téléverser le ficheir CSV sur le serveur

Maintenant que ma table est créer, il faut pouvoir le remplir avec mes données CSV. Pour ça il faut commencer par téléverser le fichier dans un accessible par l’application sur serveur. Là encore je ne vais rien vous proposer. La documentation Slim propose ICI une solution assez simple à mettre en place.

Une fois le fichier téléversé, nous pouvons le lire et enregistrer les données dans un tableau (Array). a fonction que j’ai utilisé est la suivante:

private function readMyCsvFile($filepath = '') {

		//ne pas verifier le SSL
		$arrContextOptions=array(
		    "ssl"=>array(
		        "verify_peer"=>false,
		        "verify_peer_name"=>false,
		    ),
		); 
          // Lecture du fichier
          $file = fopen($filepath,"r", false,stream_context_create($arrContextOptions));

          $MyCsvData_arr = array();
          $i = 0;

          while (($filedata = fgetcsv($file, 1000, ";")) !== FALSE) {
          	
             $num = count($filedata );
             
             // Sauter l'entete du fichier CSV
             if($i == 0){
                $i++;
                continue; 
             }
             
             for ($c=0; $c < $num; $c++) {
                $MyCsvData_arr[$i][] = $filedata [$c];
             }
             $i++;

          }
          fclose($file);

          return $MyCsvData_arr;
	}

Attention: Mon petit serveur tourne sur le port 443 mais aucun certificat valide n’est installé. Calmez-vous !! c’est un petit serveur qui est accessible seulement dans le réseau local de l’entreprise VPN y compris. il n’y a donc « aucun » danger.

le problème est que l’instruction « fopen » renverra une erreur de vérification SSL si nous ne lui demandons pas d’ignorer cette étape. c’est à ça que sert le code au tout début de la fonction. à partir de php5.6, il est possible de désactiver, « il est possible de désactiver la vérification de certificats par paire our une requête en définissant l’option de contexte verify_peer à FALSE, et pour désactiver la validation du nom des paires, en configurant l’option de contexte verify_peer_name à FALSE« . Ceci est à éviter pour un serveur accessible via internet. voir la doc PHP.

Pour utiliser cette fonction avec mon application Slim j’exécute le code suivant dans mon controller.

//récupération des données du fichier CSV dans un tableau array
$data_arr= $this->readMyCsvFile("PATH_TO_FILE");

//itération du tableau 
foreach($data_arr as $data){
	$row= [
		"id"=>$data[0],
		"name"=>$data[1],
		];
        //écriture d'une ligne dans la base de donnée
	User::create($row);
}

Nous arrivons à la fin de ce mini tutoriel plus théorique que technique. Il est tout à fait possible d’aller un peu plus loin dans cette démarche en créant un formulaire web dans lequel on peut écrire nos commande SQL directement. il ne demanderais pas beaucoup d’énergie sauf si vous décides de le mettre à disposition d’autre personnes. au tel cas il faudrait travailler un peu plus la sécurité pour éviter les surprises.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *