formateur informatique

Exporter les données MySql par le code PHP

Accueil  >  Technique  >  Php  >  Php Avancé  >  Exporter les données MySql par le code PHP
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Ecrire les données exportées dans des fichiers

Dans la formation Php précédente, nous avons appris à accéder aux fichiers externes en lecture. Nous avons récolté et consolidé les informations pour les insérer automatiquement en base de données MySql. Dans cette formation, la philosophie est la même. Mais le cheminement est inverse. Nous souhaitons accéder à ces fichiers externes en écriture. L'objectif est de pouvoir exporter des enregistrements de la base de données, de façon automatisée, pour des exploitations tierces.

Sources et présentation de la problématique
Pour réaliser ces travaux, nous avons besoin de données et d'une interface Web à implémenter. Ces sources sont proposées au téléchargement. La décompression fournit les pages Web à la racine. Seul le fichier index.php de la page d'accueil est utile pour nos travaux. Les sous dossiers fournissent les ressources externes. La table de la base de données est proposée dans le sous dossier bdd. Il s'agit d'une exportation au format Sql nommée ids.sql. Dans l'interface d'administration de PhpMyAdmin, vous devez tout d'abord créer la base de données ids. Dès lors, vous devez réaliser l'importation en désignant ce fichier Sql. Il s'agit de répliquer les techniques que nous avons apprises lors de la formation Php pour importer des données dans une base MySql.

Sur cette base de données ids, l'utilisateur suivant doit être construit :
  • Nom d'utilisateur : codePHP,
  • Nom d'Hôte : Votre adresse locale, ici : 127.0.0.1,
  • Mot de passe : php123bd,
Dans les privilèges globaux, vous devez cocher la case Tout cocher pour définir les droits administrateurs et créer le compte. Nous avions abordé ces techniques dans la formation Php pour créer sa première base de données MySql.

C'est sur cette trame qu'est définie la chaîne de connexion Php, initialisant la liaison à la base de données. Vous la trouverez dans le fichier ouvrir.php, situé dans le sous dossier commun :

$liaison = mysqli_connect("127.0.0.1", "codePHP", "php123bd");
mysqli_select_db($liaison, "ids");


A ce titre, vous pouvez donc l'adapter à votre guise.

Ensuite et comme vous le savez, ce projet doit être référencé dans EasyPhp. Un nom doit lui être attribué. Son adresse de stockage dans les répertoires Windows doit être renseignée. Dès lors, un clic sur le lien de l'application serveur permet d'accéder à sa page d'accueil.

La structure de la page Web est donc offerte. Nous pourrons ainsi focaliser notre attention sur les notions qui nous intéressent : Accéder aux fichiers externes en écriture pour exporter des données.

Si vous ne visualisez pas cette page d'accueil, il s'agit sans doute d'un problème de compte utilisateur. La base doit être créée ainsi que l'utilisateur en conformité avec les paramètres définis dans la chaîne de connexion du fichier ouvrir.php.

Page Web avec formulaire pour travaux exportation de données en Php

Vous notez la présence d'une liste déroulante et d'un bouton. Ces deux contrôles Html sont encapsulés dans un formulaire. La liste est statique et vide par défaut. Nous devons la charger des départements purgés de leurs doublons. Ces départements sont issus de la table importée. Cette dernière recense des idées de sorties.

Table de base de données MySql pour exportation sélective par le code PHP

Ainsi, au clic sur le bouton Envoyer, nous devons récolter tous les enregistrements du département. C'est donc une requête Sql, avec une clause Where sur le champ liste_dep qui doit être exécutée. Dès lors, nous pourrons accéder en écriture à un fichier externe afin de proposer une exportation au format CSV. Souvenez-vous, ce format est universel et peut être exploité par n'importe quel gestionnaire de base de données.
  • A la racine du dossier de décompression, cliquer droit sur le fichier index.php,
  • Dans le menu contextuel, choisir de l'ouvrir avec un éditeur tel que le Notepad ++,
Nous accédons ainsi au code de la page d'accueil. Vous notez la présence du formulaire Html entre les lignes 31 et 38 pour un éditeur Notepad :

...
<div class="centre">
<div class="titre_centre" id="titre" style="text-align:left; padding-left:10px;">
<form id="formulaire" name="formulaire" method="post" action="index.php">
<select class="liste" id="choix_dep" name="choix_dep">
</select>

<div class="liste_div" style="float:right;">
<input type="button" id="envoyer" name="envoyer" class="liste" style="width:100px;" value="Envoyer" onClick="document.getElementById('formulaire').submit();"/>
</div>
</form>

</div>
</div>
...


Un code Javascript déclenche la soumission du formulaire au clic sur le bouton. La donnée transmise est unique. Il s'agit de la valeur portée par la liste déroulante au moment de la soumission. Cette liste déroulante est reconnue sous le nom choix_dep. C'est par cette référence que nous la piloterons en Php.

Construire une liste déroulante dynamique
Pour charger cette liste déroulante des départements uniques, nous devons commencer par exécuter une requête sélection sur la base de données. C'est la clause Distinct en Sql qui permet de livrer le contenu d'un champ purgé de ses doublons. Dès lors, nous devrons parcourir l'ensemble des enregistrements résultants pour remplir la liste déroulante. Cette réception de données est une nouveauté. Jusqu'alors, les requêtes que nous avons produites ne retournaient qu'un seul enregistrement. En revanche, au travers de la formation Php sur les tableaux de variables, nous avions déjà simulé la construction dynamique d'une liste.
  • Entre les bornes du contrôle Select pour la liste déroulante, ajouter la section Php suivante :
...
<form id="formulaire" name="formulaire" method="post" action="index.php">
<select class="liste" id="choix_dep" name="choix_dep">
<?php
$requete = "SELECT DISTINCT liste_dep FROM liste_id ORDER BY liste_dep;";
$retours = mysqli_query($liaison, $requete);
?>

</select>
<div class="liste_div" style="float:right;">
<input type="button" id="envoyer" name="envoyer" class="liste" style="width:100px;" value="Envoyer" onClick="document.getElementById('formulaire').submit();" />
</div>
</form>
...


Tout d'abord, nous stockons la syntaxe de la requête Sql dans une variable que nous nommons $requete. La clause DISTINCT en préfixe du champ liste_dep, permet de réaliser cette sélection sans doublons. Cette extraction est bien sûr produite sur la table liste_id (FROM liste_id). Enfin, grâce à la clause ORDER BY, nous choisissons une organisation croissante sur le nom des départements. Ensuite et comme nous l'avions appris, c'est la fonction Php mysqli_query qui permet d'exécuter cette requête passée en second paramètre sur la base de données, selon la chaîne de connexion qui lui est passée en premier paramètre. Il en résulte un tableau de variables. Et c'est la variable $retours qui stocke tous les enregistrements extraits.

Comme nous l'avions appris, c'est la fonction Php mysqli_fetch_array qui permet d'accéder à ces enregistrements en chargeant un nouveau tableau de variables. L'information y est décomposée en fonction des champs restitués. C'est par leur nom que nous pourrons accéder à leurs valeurs. Ici, il n'y en a qu'un. Il s'agit du champ liste_dep. Et c'est une boucle while qui va nous permettre de parcourir toutes les lignes du tableau $retours, soit tous les enregistrements extraits par la requête.
  • A la suite du code PHP, ajouter le traitement itératif suivant :
...
<?php
$requete = "SELECT DISTINCT liste_dep FROM liste_id ORDER BY liste_dep;";
$retours = mysqli_query($liaison, $requete);
while($retour = mysqli_fetch_array($retours))
{
echo "<option value='".utf8_encode($retour["liste_dep"])."'>".utf8_encode($retour["liste_dep"])."</option>";
}

?>
...


La fonction Php mysqli_fetch_array permet donc de découper l'information au niveau du champ, pour chaque enregistrement. Le résultat est stocké dans la variable $retour. Incluse dans une boucle While, elle restitue à chaque passage, les données de champs pour chaque enregistrement. De fait, nous les parcourons tous. Et pour chacun, nous accédons à son contenu par son nom passé en paramètre ($retour["liste_dep"]). Pour gérer les accents en conformité avec le système d'encodage de la page Web, nous traitons l'information réceptionnée par la fonction utf8_encode. Le tout est concaténé dans la balise Html option qui ajoute une nouvelle ligne à la liste déroulante. C'est la fonction Php echo qui permet ces restitutions récursives en lieu et place.
  • Enregistrer les modifications (CTRL + S) et basculer sur le navigateur Web,
  • Enfoncer la touche F5 du clavier pour rafraîchir la page,
Charger une liste déroulante Html de données sans doublons issues de la base MySql

Comme vous le constatez, la liste déroulante est désormais fonctionnelle. Elle a été chargée dynamiquement par le code Php restituant les données récoltées par la requête SQL. Et grâce à la clause DISTINCT, aucune répétition n'est à déplorer.

Réceptionner le choix dans la liste déroulante
Nous le savons désormais, c'est l'instruction Php $_POST qui permet de réceptionner les valeurs transmises par la soumission d'un formulaire Html. Pour cela, nous devons lui passer les noms des contrôles portant ces données. La liste déroulante se nomme choix_dep. Elle doit permettre de récolter le département désigné par l'utilisateur. De fil en aiguille, sur ce département, nous pourrons produire une requête Sql avec clause Where, pour isoler tous les enregistrements correspondants. Dès lors, nous pourrons enclencher l'exportation CSV.

Nous proposons de réaliser ces traitements dans le calque (balise Div) d'identifiant liste, situé à partir de la ligne 49 pour un éditeur Notepad.
  • Dans les bornes du calque liste, ajouter la section PHP suivante :
...
<div class="colonne" id="liste">
<?php
if(isset($_POST["choix_dep"]))
{
$le_dep = $_POST["choix_dep"];
echo $le_dep;
}
?>

</div>
...


Comme toujours, nous exploitons la fonction Php isset pour tester l'existence de la valeur transmise. Au premier chargement de la page, le formulaire ne peut avoir été soumis. De fait, la valeur n'existe pas. Ainsi, aucune erreur n'est générée. Si elle existe, nous la stockons dans la variable $le_dep. Puis, nous l'affichons en lieu et place grâce à la fonction Php echo.
  • Enregistrer les modifications et basculer sur le navigateur Internet,
  • Recharger la page en validant la barre d'adresse par la touche Entrée du clavier,
  • Choisir un département dans la liste déroulante, comme celui de l'Ardèche par exemple,
  • Puis, cliquer sur le bouton Envoyer pour transmettre ce choix au serveur,
Récupérer côté serveur en Php le choix utilisateur dans une liste déroulante Html

Le département sélectionné est parfaitement restitué dans le calque central de la page Web. Nous devons l'exploiter pour attaquer la base de données et récolter tous les enregistrements correspondants.

Extraire les enregistrements selon une Clause Where
Nous avons précédemment construit une requête pour récupérer tous les départements uniques. Désormais, nous devons récupérer tous les enregistrements pour lesquels le département est équivalent au choix formulé par l'utilisateur, par le biais de la liste déroulante. Il s'agit d'une condition à poser. Ces conditions se traduisent en langage SQL par une clause WHERE.
  • Toujours dans les bornes du calque, dans l'instruction conditionnelle et à la place de la ligne de la fonction echo, ajouter le code PHP suivant :
...
<?php
if(isset($_POST["choix_dep"]))
{
$le_dep = $_POST["choix_dep"];

$requete = "SELECT * FROM liste_id WHERE liste_dep='".utf8_decode($le_dep)."';";
$retours = mysqli_query($liaison,$requete);
$compteur=0;
while($retour = mysqli_fetch_array($retours))
{
echo utf8_encode($retour["liste_nom"])."<br />";
$compteur++;
if($compteur>25)
break;
}

}
?>
...


Grâce au symbole de l'étoile, nous initions une requête SQL récoltant tous les champs pour lesquels le département est celui mentionné dans la liste déroulante :

...WHERE liste_dep = '".utf8_decode($le_dep)."';

Comme précédemment, nous exécutons cette requête grâce à la fonction Php mysqli_query. Il en résulte un tableau de variables que nous découpons par champs grâce à la fonction mysqli_fetch_array. Puis, nous parcourons chacun des enregistrements produits grâce à une boucle while. Dès lors, à titre d'essai, nous affichons l'information récoltée sur le nom pour les premiers enregistrements.

C'est un test sur la variable $compteur incrémentée à chaque passage qui permet de mettre fin à l'opération.
  • Enregistrer les modifications et basculer sur le navigateur Web,
  • Recharger la page en validant la barre d'adresse par la touche Entrée,
  • Choisir un département, comme celui de l'Ardèche,
  • Puis, soumettre ce choix en cliquant sur le bouton Envoyer,
Récupérer et afficher en Php tous les enregistrements correspondant au choix internaute depuis le formulaire Web

La réception des données est parfaite comme en atteste la restitution par le code Php dans le calque prévu à cet effet.

Exporter les données au format CSV
Pour chaque enregistrement, toutes les informations de champs doivent être récoltées. Dès lors, ligne à ligne, ces données doivent être inscrites dans un fichier texte externe. Souvenez-vous, chaque colonne doit être séparée d'une autre par un délimiteur, comme le point-virgule. De plus, les informations de champs doivent être inscrites entre guillemets. Ainsi, nous produirons une exportation selon les normes du format CSV.
  • Supprimer toutes les instructions contenues dans la boucle While,
  • Puis, ajouter les instructions PHP suivantes (mentionnées en gras), avant et après cette dernière :
...
if(isset($_POST["choix_dep"]))
{
$le_dep = $_POST["choix_dep"];

$requete = "SELECT * FROM liste_id WHERE liste_dep='".utf8_decode($le_dep)."';";
$retours = mysqli_query($liaison,$requete);
$compteur=0;

$fichier = fopen("bdd/export.txt","w");
fclose($fichier);

$fichier = fopen("bdd/export.txt","w+");
$chaine="";


while($retour = mysqli_fetch_array($retours))
{
}
fclose($fichier);
}
...


Nous avons abordé la fonction Php fopen dans la formation pour accéder au contenu des fichiers externes. Nous l'avions exploitée avec l'attribut r pour Read en second paramètre. Cette fois, nous ne souhaitons pas récupérer le contenu mais l'écrire. Nous lui passons donc l'attribut w pour Write dans un premier temps. Celui-ci permet de créer le fichier ou de supprimer son contenu, selon le chemin d'accès qui lui est passé en premier paramètre. Finalement, cette fonction charge le fichier en mémoire sous forme d'objet dans la variable $fichier. Dès lors nous pouvons le manipuler. Mais nous choisissons de le fermer par la fonction Php fclose. Elle a pour effet de libérer les ressources. En effet, ce premier traitement est une sécurité pour purger le fichier, si d'aventure il existe déjà. Pour pouvoir écrire les informations les unes à la suite des autres, le fichier ne doit pas être écrasé. Et pour cela, l'attribut en second paramètre devient w+. Donc, nous rouvrons ce fichier dans ce nouveau mode d'accès pour y ajouter les informations issues de la base de données, à chaque passage dans la boucle. Nous déclarons la variable $chaine destinée à concaténer chaque information de champ, pour un même enregistrement. Après la boucle, nous n'oublions de libérer la mémoire en fermant le fichier grâce à la fonction fclose.

Désormais, à l'intérieur de la boucle, tant que le fichier est ouvert en écriture, nous devons y insérer les enregistrements reconstruits et résultants de la requête.
  • A l'intérieur de la boucle, ajouter les instructions PHP suivantes :
...
if(isset($_POST["choix_dep"]))
{
$le_dep = $_POST["choix_dep"];

$requete = "SELECT * FROM liste_id WHERE liste_dep='".utf8_decode($le_dep)."';";
$retours = mysqli_query($liaison,$requete);
$compteur=0;

$fichier=fopen("bdd/export.txt","w");
fclose($fichier);

$fichier=fopen("bdd/export.txt","w+");
$chaine="";

while($retour = mysqli_fetch_array($retours))
{
$chaine ="\"".$retour["liste_num"]."\";";
$chaine .="\"".$retour["liste_nom"]."\";";
$chaine .="\"".$retour["liste_activite"]."\";";
$chaine .="\"".$retour["liste_dep"]."\";";
$chaine .="\"".$retour["liste_ville"]."\"";

fwrite($fichier,$chaine."\r\n");

}
fclose($fichier);
echo "L'exportation au format CSV est terminée.";
}
...


A chaque passage et donc pour chaque enregistrement, nous concaténons dans la variable $chaine toutes les informations de champs. Pour les encadrer de doubles côtes, nous utilisons le caractère d'échappement (\"). Nous les séparons les unes des autres par un point-virgule selon la norme imposée par le format CSV. Une fois l'enregistrement consolidé, nous l'ajoutons à la suite dans le fichier externe, grâce à la fonction Php fwrite (fwrite($fichier, $chaine."\r\n");), sans oublier le saut de ligne (\r\n). Ainsi chaque enregistrement sera restitué sur une ligne indépendante. Au sortir de la boucle, nous greffons un message de confirmation.
  • Enregistrer les modifications et basculer sur le navigateur Web,
  • Recharger le page en validant sa barre d'adresse par le touche Entrée,
  • Choisir un département avec la liste déroulante et le soumettre en cliquant sur le bouton,
Message de confirmation Php pour exportation de données MySql réussie

Le message programmé semble confirmer que l'exportation s'est déroulée avec succès.
  • Double cliquer sur le sous dossier commun à la racine du dossier de décompression,
  • Puis, double cliquer sur le fichier export.txt effectivement présent pour l'ouvrir,
Données de base MySql exportées dans un fichier texte au format CSV par le code Php

Comme vous le constatez, tous les enregistrements résultants ont parfaitement été retranscrits au format CSV. Ils sont dès lors exploitables par n'importe quel gestionnaire de bases de données ou même par Excel, pour manipuler et dépouiller ces informations.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn