Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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.
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.
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,
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,
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,
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,
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,
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.