[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Non-Officiels
> Site Web
> PHP
> Base de données
> Lecture du tutoriel
Sauvegarder ses tables MySQL via un code PHP
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Bonjour à tous !
Vous désirez faire une sauvegarde de vos tables à l'aide d'un lien au sein de votre site dans un fichier
.txt ?
Seul problème : vous ne connaissez pas (bien) le langage MySQL ! Ou comme moi, vous ne savez pas utiliser le "client MySQL", appelé aussi le "MySQL en ligne de commande" ?! Pas de souci : dans ce tuto, vous allez apprendre à le faire grâce à un script PHP.
Cliquez sur l'image pour voir ce que vous allez enregistrer dans le fichier .txt
On va également utiliser les "fichiers".
Nous allons avoir besoin de 2 choses :
- d'une base de données avec des tables
- d'un fichier PHP pour le script que nous allons appeler "tuto_sauv_table.php"
La base de données
Et si je n'en ai pas encore ou ne désire pas utiliser une de mes bases existantes ?
Pas de souci, pour ceux qui veulent apprendre en se basant uniquement sur ce tuto, je vais vous donner 1 base et 3 tables. Vous n'aurez qu'à les mettre dans votre PhpMyAdmin
La base de données s'appelle
'test' ;
et les 3 tables :
'forum' ,
'jeux' ,
'livre_or'
Table forum
Code : SQL 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | --
-- Structure de la table `forum`
--
CREATE TABLE `forum` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pseudo` varchar(200) collate latin1_general_ci NOT NULL,
`message` longtext collate latin1_general_ci NOT NULL,
`date` date NOT NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_bin COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;
--
-- Contenu de la table `forum`
--
INSERT INTO `forum` VALUES (1, 'Thomas', 'Bonjour, Voilà, je suis sur le jeu de Tomb Raider et je suis bloqué à un niveau du jeu. Quelqu''un peut m''aider ?', '2006-10-12');
INSERT INTO `forum` VALUES (2, 'zebulon', 'Peut-être pourrais-tu nous dire où tu es coincé exactement ?', '2006-10-12');
|
Table jeux
Code : SQL 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | --
-- Structure de la table `jeux`
--
CREATE TABLE `jeux` (
`id` mediumint(10) NOT NULL AUTO_INCREMENT,
`prenom` varchar(200) collate latin1_general_ci NOT NULL,
`titre` varchar(200) collate latin1_general_ci NOT NULL,
`console` varchar(255) collate latin1_general_ci NOT NULL,
`genre` varchar(200) collate latin1_general_ci NOT NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ;
--
-- Contenu de la table `jeux`
--
INSERT INTO `jeux` VALUES (1, 'Thomas', 'Tomb Raider 2', 'PS2', 'Aventure');
INSERT INTO `jeux` VALUES (2, 'Paul', 'Arthur', 'PS2', 'Aventure');
INSERT INTO `jeux` VALUES (3, 'Sylvain', 'Star Wars', 'Gamecube', 'Rôle');
|
Table livre_or
Code : SQL 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | --
-- Structure de la table `livre_or`
--
CREATE TABLE `livre_or` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pseudo` varchar(200) collate latin1_general_ci NOT NULL,
`message` varchar(255) collate latin1_general_ci NOT NULL,
`date` date NOT NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;
--
-- Contenu de la table `livre_or`
--
INSERT INTO `livre_or` VALUES (1, 'bals', 'Site super génial ! Bonne continuation', '2006-10-02');
INSERT INTO `livre_or` VALUES (2, 'idefix', 'Site en construction mais d''après ce que je vois, ça promet d''être bien !!', '2006-08-03');
|
Comme vous pouvez le voir, j'ai rempli les tables mais en mettant n'importe quoi
Maintenant que le point concernant la base de données est réglé, passons au 2ème point.
Le fichier tuto_sauv_table.php
Voici un petit script tout simple montrant la page (x)HTML ainsi que la connexion au serveur, le choix de la base (pour nous ce sera donc "test") et la déconnexion.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict// EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-Strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title> Sauvegarder ses tables </title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
h2
{
text-align: center;
color: #4682b4;
}
p
{
text-align: center;
}
.titre_table
{
font-size: 20px;
}
</style>
</head>
<body>
<!-- On commence par mettre un titre à sa page -->
<h2> Programme PHP pour sauvegarder les tables de ma base "TEST" </h2> <br /> <br />
<?php
// on va se connecter au serveur et choisir sa base de données
$connection = mysql_connect("localhost","root","");
$base = mysql_select_db ("test");
echo " Voici la liste des différentes tables de la base \"test\" : <br /> <br/> ";
//*************************************************************************
// Emplacement concernant les différentes requêtes que l'on va utiliser
//*************************************************************************
// on ferme sa connexion au serveur
mysql_close();
?>
</body>
</html>
|
Comme vous pouvez le voir, je vous ai montré l'emplacement où nous allons écrire nos requêtes mais aussi l'affichage des résultats.
Dans la suite du tuto, je continuerai à mettre des commentaires dans le script.
Mais ne vous inquiétez pas, pour les Zér0s, je vais aussi fournir des explications en-dehors des scripts
Bon là, pour la connexion, la déconnexion et le choix de la base, je ne fournis aucune explication puisque vous êtes censé(e) avoir les bases
Si ce n'est pas le cas, je vous conseille vivement d'aller étudier le tuto de M@téo dont j'ai donné le lien au début de ce tuto.
Je ne vais quand même pas tout faire

, hein !
Par contre, je vous mets une image de ce que cela donne à l'affichage dans le navigateur :
Cliquez sur l'image pour l'agrandir

Allez maintenant que nous avons tout ce qu'il faut pour travailler, passons à la suite...
Alors par quoi allons-nous commencer ?
Eh bien, il me paraît judicieux en premier de savoir combien il existe de tables dans la base "test". Mais le plus important, à mon goût, c'est surtout de pouvoir afficher le nom de ces différentes tables.
Nous allons donc poser une requête, récupérer le résultat dans un tableau et afficher tout ça sous forme de liens

.
Ok, c'est bien beau ça mais on utilise quelle requête pour connaître le nom des tables ?
Allez, à vous de jouer maintenant, je vous ai expliqué le déroulement et donné la fonction.
Si tout s'est bien passé, voilà ce que vous devriez avoir à l'écran :
Cliquez sur l'image pour l'agrandir

Secret (cliquez pour afficher)Code : PHP1
2
3
4
5
6
7
8
9 | // on va faire une requête pour rechercher toutes les tables de la bdd concernée
$req_table = "SHOW TABLES";
$result_table = mysql_query($req_table) or die ("Impossible d'exécuter la requête concernant la recherche des tables - ".mysql_error());
// et on va les afficher sous forme de lien
while ($donnees_table = mysql_fetch_array($result_table))
{
echo ' <a href="tuto_sauv_table.php?table='.$donnees_table[0].'">'.$donnees_table[0].'</a> <br /> ';
}
|
Allez, on passe à la suite...
Continuons sur notre lancée...
Nous allons tester si la variable
table de l'URL existe et, si c'est le cas, créer un tout petit formulaire contenant un bouton
submit qui servira à la sauvegarde de la table choisie.
Rien de bien compliqué là-dedans.
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | if (isset($_GET['table']))
{
$table = $_GET['table'];
// on va créer un bouton pour sauvegarder
echo ' <br /> <br /> <br />
<p> Vous avez sélectionné la table <b> <span class="titre_table"> '. $table .' </span> </b> </p>
<br />
<form action="" method="post">
<p> <input type="submit" name="sauvegarde" value="Sauvegarder la table" /> </p>
</form> ';
// autres instructions à suivre
}
|
Là, je ne vous mets pas d'image, il suffit de voir par vous-mêmes dans votre navigateur !!!
En revanche, j'attire l'attention des Zér0s : pour être sûrs de ne pas oublier de fermer les accolades qui ont été ouvertes, faites-le dès que vous avez ouvert l'accolade et notez votre code entre les deux.
Bon, moi je suis pressé(e), c'est simple ça. On entre quand dans le vif du sujet ?
Maintenant, maintenant, n'ayez crainte. Il faut penser aux Zér0s, voyons !
Maintenant, nous allons commencer par afficher le "titre" qui concernera la structure de la table.
Hé oui, à partir d'ici nous allons procéder par "morceaux". Et tout ce que nous allons écrire remplacera la phrase "// autres instructions à suivre".
Mais nous allons commencer par initialiser les variables au fur et à mesure pour éviter ce genre de message d'erreur :
Notice: Undefined variable:...... qui signifie que le nom de la variable qui suit n'a pas été définie.
Ce genre de message apparaît selon la configuration définie dans le fichier php.ini.
Code : PHP1
2
3
4
5
6 | // on va créer une variable pour y mettre le texte concernant l'en-tête de la structure qui sera écrit dans le fichier .txt
$titre_structure = "";
$titre_structure .= "-- <br /> ";
$titre_structure .= "-- Structure de la table ` ".$table." ` <br />";
$titre_structure .= "-- <br /> <br /> ";
echo $titre_structure;
|
Une petite explication s'impose pour les ZérOs
- Vous avez sûrement remarqué que dans la 1ère variable $titre_structure, j'avais affecté -- <br /> (j'ai donc utilisé le signe " = " qui est le signe d'affectation).
- En revanche, sur les autres lignes, vous pourrez voir que j'ai écrit ".=" (un point suivi immédiatement du signe égal). Ça, c'est ce que l'on appelle un opérateur combiné.
Mais qu'est-ce qu'elle nous raconte ? C'est quoi ça ? Ça signifie quoi ?
Pas de panique, j'explique.
Si je mettais un simple =, cela écraserait le texte précédent. Or, ce que je veux c'est que ça se mette à la suite : donc, on combine le point de la concaténation et le = de l'affectation. Ce qui revient à dire "je rajoute ça à ce qui est déjà dans la variable".
Génial, non ?
Bon, on a notre titre de la structure, maintenant passons à son contenu.
On va donc poser la requête, récupérer le résultat dans un tableau, créer une nouvelle variable
$structure et y
rajouter le résultat, et pourquoi pas, l'afficher.
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10 | // on va demander la "création" de la table
$req_structure = "SHOW CREATE TABLE $table ";
$result_structure = mysql_query($req_structure) or die ("Impossible de trouver la structure de ". $table .mysql_error());
$donnee_structure = mysql_fetch_array($result_structure);
$structure = "";
$structure .= $donnee_structure[1] ;
$structure .= "; <br /> <br />" ;
// on affiche la structure sur la page PHP
echo "<pre>". $structure ."</pre>" ;
|
Et voilà ce que vous devriez voir en cliquant ensuite sur le lien
Forum (de votre navigateur) :
Cliquez sur l'image pour voir la structure de la table forum
Wouaaahhhh ! C'est génial !
Allez, maintenant continuons avec le contenu des tables...
Allez, commençons par écrire le titre "Contenu de la table" comme on l'a fait auparavant avec "Structure de la table".
Code : PHP1
2
3
4
5
6
7 | // on crée une variable pour le titre du contenu de la table
$titre_contenu = "";
$titre_contenu .= "-- <br />";
$titre_contenu .= "-- Contenu de la table ` ".$table."` <br />";
$titre_contenu .= "-- <br /> ";
echo $titre_contenu;
|
Et voici l'image du résultat :
Allez, un petit clic sur la photo

Bon là, pour les ZérOs, je n'explique pas à nouveau pour l'opérateur combiné puisque je l'ai déjà fait pour
$titre_structure.
Je ne vais pas radoter.
Si vous ne vous en souvenez plus, retournez voir dans la partie
Fonction SHOW CREATE TABLE.
Alors : nous avons notre titre pour le contenu, maintenant, allons chercher le contenu en lui-même.
Nous allons donc poser notre requête pour connaitre le nombre de champs et récupérer le résultat.
Pour compter le nombre de champs, en plus de la fonction SHOW COLUMNS, nous allons donc utiliser une autre fonction : mysql_num_rows, et voilà comment nous allons l'utiliser concrètement dans notre cas :
Code : PHP1
2
3
4 | // on va récupérer le nombre de champs présents dans la table
$req_champ = "SHOW COLUMNS FROM $table";
$result_champ = mysql_query ($req_champ) or die ("Impossible de trouver les champs de ". $table .mysql_error());
$nbre_champ = mysql_num_rows($result_champ);
|
À présent, nous allons chercher réellement le contenu des différents champs se trouvant dans la table concernée, c'est-à-dire que l'on va rechercher TOUS les enregistrements en intégral.
C'est quoi, un "
enregistrement"

?
Je vous guide :
- il faut poser une requête pour rechercher tous les champs de la table,
- récupérer les données dans un tableau,
- on va boucler jusqu'à la fin des enregistrements ,
- on va demander à écrire INSERT INTO nomdelatable VALUES(,
- et là, on va boucler jusqu'à la fin des champs pour afficher les différents contenus des champs entre apostrophes, et les séparer les uns des autres par une virgule ;
- puis nous allons écrire ); (sans oublier de demander un retour à la ligne pour l'enregistrement suivant),
- et nous allons mettre tout ça dans la variable $contenu. Un simple petit code PHP tout simple. Un echo de la variable $titre_contenu dans laquelle on va utiliser l'opérateur combiné.

Je vous laisse vous creuser un peu la tête.
Bon allez, si vous n'y arrivez pas, cliquez pour voir le code.
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | // on va rechercher TOUS les enregistrements de la table concernée
$req_tout = "SELECT * FROM $table ";
$result_tout = mysql_query($req_tout) or die ("Impossible de trouver les enregistrements de ". $table .mysql_error());
$contenu = "";
$tout_contenu = "";
// on va boucler pour sortir toutes les données
while($donnees_tout = mysql_fetch_array($result_tout))
{
$contenu = "INSERT INTO " . $table . " VALUES (";
$i = 0;
// on va boucler tous les champs
while ( $i < $nbre_champ )
{
// et on affiche les résultats en fonction des champs et dans l'ordre des champs
$contenu .= "'" . $donnees_tout[$i] . " ',";
$i++;
}
$contenu .= ") ; \n ";
echo "<br /> ";
$tout_contenu .= $contenu;
// on affiche le contenu sur la page PHP
echo $contenu;
}
|
Et maintenant, explication pour les Zér0s...
Bon, je pense que pour la 1ère requête vous n'avez pas eu de difficulté, c'est vraiment une chose qu'on utilise fréquemment.
Je pense que vous avez dû vous embrouiller à partir de la 1ère boucle.
Explication
Un petit clic sur l'image pour l'agrandir !
Mais si vous comparez cette image avec celle de l'introduction du tuto, vous allez voir qu'il y a un petit problème.
Bah, lequel ?
Si si, regardez bien, vous voyez ? Juste après chaque dernier champ de chacun des enregistrements, il y a une virgule en trop

. Mais nous n'avons pas besoin de cette virgule. Nous allons donc utiliser une fonction PHP qui est
substr() pour la supprimer.
La fonction susbtr() permet de soustraire une sous-chaine d'une chaîne. Sa syntaxe est :
$variable = susbtr(chaîne à traiter,début de la sous-chaîne à extraire, nombre de caractères à extraire).
Je sais que ça paraît un peu compliqué, mais je vais vous expliquer pour notre code.
Et pour celui ou celle qui le souhaite, je vous renvoie à la documentation officielle pour plus de détails sur cette fonction
substr().
- Bon, nous voulons juste enlever la dernière virgule de chaque enregistrement. Nous connaissons déjà la variable concernée : c'est $contenu.
- On va dire à la fonction qu'elle doit créer une sous-chaîne en partant du 1er caractère. On va donc saisir "0" qui correspond au caractère 1.
- Ensuite, nous devons lui dire de ne pas prendre le dernier caractère car, si vous regardez bien ce que l'on a écrit après la virgule, il n'y a rien d'autre, même pas une espace ! Donc, on va simplement lui dire de ne pas prendre le dernier caractère de la chaîne. Si on retire 1 caractère en partant de la fin de cette chaîne, il faut donc écrire "-1".
Si, à la suite de la virgule, on avait mis une espace, alors il faudrait compter et la virgule elle-même mais aussi l'espace, ce qui donnerait 2 caractères à enlever. Et pour cela, il faudrait alors noter non pas " -1" mais " -2".
Voilà donc le code modifié :
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | // on va rechercher TOUS les enregistrements de la table concernée
$req_tout = "SELECT * FROM $table ";
$result_tout = mysql_query($req_tout) or die ("Impossible de trouver les enregistrements de ". $table .mysql_error());
$contenu = "";
$tout_contenu = "";
// on va boucler pour sortir toutes les données
while($donnees_tout = mysql_fetch_array($result_tout))
{
$contenu = "INSERT INTO " . $table . " VALUES (";
$i = 0;
// on va boucler tous les champs
while ( $i < $nbre_champ )
{
// et on affiche les résultats en fonction des champs et dans l'ordre des champs
$contenu .= "'" . $donnees_tout[$i] . " ',";
$i++;
}
// on va enlever la dernière virgule
$contenu = substr($contenu,0,-1);
$contenu .= ") ; \n ";
echo "<br /> ";
$tout_contenu .= $contenu;
// on affiche le contenu sur la page PHP
echo $contenu;
}
|
Et voilà, le script pour cette partie est terminé.
Et voici une petite image du résultat obtenu sur votre navigateur, toujours pour la table
forum.
Un petit clic sur l'image pour l'agrandir !
Mais vous pouvez aussi tester en cliquant sur les liens des autres tables.
Bon, cette partie est terminée. On a récupéré la structure et le contenu des différentes tables mais ce n'est pas encore sauvegardé dans un fichier
.txt !
Allez, on passe à la dernière partie ...
Et nous voilà presque à la fin de notre travail.
Nous avons donc récupéré tout ce qui constitue notre table : sa structure et son contenu, et nous avons reproduit l'image que je vous avez montrée dans l'introduction, vous vous souvenez ? Non ? Allez donc voir un peu.
Maintenant, on attaque la dernière ligne droite, on va enfin sauvegarder notre table dans un fichier
.txt.
Bon : vous vous souvenez de ce formulaire qu'on a écrit dans la partie
Fonction SHOW CREATE TABLE où on a mis un bouton
submit Sauvegarder la table ?
C'est le fait de cliquer dessus qui va lancer l'écriture de la table dans le fichier correspondant, donc la sauvegarde en elle-même.
Donc, nous allons commencer notre code en testant si on a cliqué dessus ou non.
Si oui, on va alors écrire dans le fichier
.txt. Si non, on ne fait rien.
Secret (cliquez pour afficher)Code : PHP1
2
3
4
5
6 | if (isset($_POST['sauvegarde']))
{
// ici le code pour écrire dans le fichier .txt
}
|
Bon : de quoi avons-nous besoin pour écrire dans le fichier ? D'un nom pour le fichier, bien sûr !
On va créer un nom pour le fichier
.txt. Dans notre cas, on veut qu'il prenne le nom de la table sélectionnée, donc voilà le code :
Code : PHP1
2
3 | // on commence par créer un nom pour le fichier .txt correspondant à la table
$nom_table = $table;
$nom_table .= ".txt";
|
Explication pour les ZérOs
On met la variable
$table, qui correspond au lien sur lequel on a cliqué, dans une variable
$nom_table.
Ensuite, comme on veut que ce soit un fichier
.txt, il faut lui
rajouter l'extension
.txt.
Maintenant, on va tester si le fichier existe déjà avec la fonction file_exists() ; si c'est le cas, on va le supprimer avec la fonction unlink() :
Secret (cliquez pour afficher)Code : PHP1
2
3
4
5
6 | // on teste si le fichier .txt existe déjà
if(file_exists($nom_table))
{
// si oui, on le supprime
unlink($nom_table);
}
|
Si vous désirez sauvegarder le fichier .txt dans un répertoire bien précis, il faut alors l'indiquer comme ceci :
file_exists("chemin_du_dossier".$nom_table).
Nous allons ouvrir le fichier en écriture-création avec le bon mode (c'est-à-dire que si le fichier n'existe pas, il doit être automatiquement créé. Choisissez la bonne lettre

).
Puis nous allons maintenant remplacer les
<br /> par des
\n dans les variables
$titre_structure,
$structure,
$titre_contenu et <police nom="contenu">$tout_contenu</police>.
Et on fait comment ?

Je ne me souviens plus...
En utilisant tout simplement la fonction PHP str_replace() dont voilà la syntaxe :
$variable = str_replace(chaîne à remplacer, chaîne de remplacement, chaîne à traiter);.
Nous allons écrire tout ça dans le fichier
.txt et une fois terminé, il suffira de fermer le fichier.
Je vous laisse vous débrouiller tout seuls puisque vous avez tous les éléments en votre possession.
Allez, allez, un petit effort, les ZérOs...
Secret (cliquez pour afficher)Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | // on ouvre le fichier .txt en écriture et on le crée en même temps s'il est inexistant
$sauve = fopen($nom_table , "a+");
// on remplace les <br /> par \n pour écrire la structure dans le fichier .txt
$titre_structure = str_replace("<br />" , "\n", $titre_structure);
fputs($sauve, $titre_structure);
$structure = str_replace("<br />" , "\n", $structure);
fputs($sauve, $structure);
// on fait la même chose pour le contenu dans le fichier .txt
$titre_contenu = str_replace("<br />" , "\n", $titre_contenu);
fputs($sauve, $titre_contenu);
fputs($sauve, $tout_contenu);
// on ferme le fichier .txt
fclose($sauve);
|
Et voilà le résultat final !
Pour le voir, vous devez allez là où vous avez sauvegardé votre fichier
.txt et l'ouvrir sous Notepad++.
Un dernier petit clic ?
Vous êtes contents de votre fichier ?
C'est vrai qu'il est beau ce fichier mais je ne sais pas, je n'ai pas envie de vous laisser partir comme ça, moi.
Il y a encore un dernier détail à résoudre. Petit comme ça mais en fait,
très important.
On a créé un fichier pour sauvegarder des tables. C'est bien, on sait que de ce côté-là, ça fonctionne. Mais on n'a pas fait un fichier comme ça juste pour faire joli et mettre des Ko en plus dans notre PC !
Ben, que veux-tu qu'on fasse d'autre avec ?
Si un jour -je ne vous le souhaite pas- vous rencontrez un problème avec une de vos tables ou avec votre base de données, vous allez sûrement vous dire : "Pas grave, j'ai une sauvegarde dans un fichier
.txt, je vais simplement créer à nouveau ma table (mes tables)

!
Et bien non, là, ça ne marchera pas !!!
Bah pourquoi ? Je ne comprends pas...
Tout simplement parce qu'il y a bug dans le fichier.
Je vous explique...
Si par exemple vous supprimez purement et simplement votre table
forum de votre base de données et que vous y mettez à la place le fichier
forum.txt comme vous l'avez fait au début de ce tuto, vous allez avoir une belle erreur dans votre PhpMyAdmin.
Pourquoi ?
Tout simplement parce que ça va s'arrêter et bugger au niveau du mot
Quelqu' car cette apostrophe va être considérée comme l'apostrophe fermante puiqu'elle n'a pas été
protégée.
Ah, ben c'est malin, ça ! Nous donner un code erroné !
Pas de panique, il suffit simplement de rajouter une seule ligne dans la deuxième boucle
while pour remplacer une apostrophe par deux.
Et comme vous avez été patients, voilà mon petit cadeau.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict// EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-Strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title> Sauvegarder ses tables </title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
h2
{
text-align: center;
color: #4682b4;
}
p
{
text-align: center;
}
.titre_table
{
font-size: 20px;
}
</style>
</head>
<body>
<!-- On commence par mettre un titre à sa page -->
<h2> Programme PHP pour sauvegarder les tables de ma base "TEST" </h2> <br /> <br />
<?php
// on va se connecter au serveur et choisir sa base de données
$connection = mysql_connect("localhost","root","");
$base = mysql_select_db ("test");
echo " Voici la liste des différentes tables de la base \"test\" : <br /> <br/> ";
// on va faire une requête pour rechercher toutes les tables de la bdd concernée
$req_table = "SHOW TABLES";
$result_table = mysql_query($req_table) or die ("Impossible d'exécuter la requête concernant la recherche des tables - ".mysql_error());
// et on va les afficher sous forme de lien
while ($donnees_table = mysql_fetch_array($result_table))
{
echo ' <a href="tuto_sauv_table.php?table='.$donnees_table[0].'">'.$donnees_table[0].'</a> <br /> ';
}
if (isset($_GET['table']))
{
$table = $_GET['table'];
// on va créer un bouton pour sauvegarder
echo ' <br /> <br /> <br />
<p> Vous avez sélectionné la table <b> <span class="titre_table"> '. $table .' </span> </b> </p>
<br />
<form action="" method="post">
<p> <input type="submit" name="sauvegarde" value="Sauvegarder la table" /> </p>
</form> ';
// on va créer une variable pour y mettre le texte concernant l'en-tête de la structure qui sera écrit dans le fichier .txt
$titre_structure = "";
$titre_structure .= "-- <br />";
$titre_structure .= "-- Structure de la table ` ".$table." ` <br />";
$titre_structure .= "-- <br /> <br /> ";
echo $titre_structure;
// on va demander la "création" de la table
$req_structure = "SHOW CREATE TABLE $table ";
$result_structure = mysql_query($req_structure) or die ("Impossible de trouver la structure de ". $table .mysql_error());
$donnee_structure = mysql_fetch_array($result_structure);
$structure = "";
$structure .= $donnee_structure[1] ;
$structure .= "; <br /> <br />" ;
// on affiche la structure sur la page PHP
echo "<pre>". $structure ."</pre>" ;
// on crée une variable pour le titre du contenu de la table
$titre_contenu = "";
$titre_contenu .= "-- <br />";
$titre_contenu .= "-- Contenu de la table ` ".$table."` <br />";
$titre_contenu .= "-- <br /> <br />";
echo $titre_contenu;
// on va récupérer le nombre de champs présents dans la table
$req_champ = "SHOW COLUMNS FROM $table";
$result_champ = mysql_query ($req_champ) or die ("Impossible de trouver les champs de ". $table .mysql_error());
$nbre_champ = mysql_num_rows($result_champ);
// on va rechercher TOUS les enregistrements de la table concernée
$req_tout = "SELECT * FROM $table ";
$result_tout = mysql_query($req_tout) or die ("Impossible de trouver les enregistrements de ". $table .mysql_error());
$contenu = "";
$tout_contenu = "";
// on va boucler pour sortir toutes les données
while($donnees_tout = mysql_fetch_array($result_tout))
{
$contenu = "INSERT INTO " . $table . " VALUES (";
$i = 0;
// on va boucler tous les champs
while ( $i < $nbre_champ )
{
// Nous allons remplacer les apostrophes du contenu par 2 apostrophes
$donnees_tout[$i] = str_replace("'","''",$donnees_tout[$i]);
// et on affiche les résultats en fonction des champs et dans l'ordre des champs
$contenu .= "'" . $donnees_tout[$i] . "',";
$i++;
}
// on va enlever la dernière virgule
$contenu = substr($contenu,0,-1);
$contenu .= ");\n";
echo "<br />";
$tout_contenu .= $contenu;
// on affiche le contenu sur la page PHP
echo $contenu;
}
if (isset($_POST['sauvegarde']))
{
// on commence par créer un nom pour le fichier .txt correspondant à la table
$nom_table = $table;
$nom_table .= ".txt";
// on teste si le fichier .txt existe déjà
if(file_exists($nom_table))
{
// si oui, on le supprime
unlink($nom_table);
}
// on ouvre le fichier .txt en écriture et on le crée en même temps s'il est inexistant
$sauve = fopen($nom_table , "a+");
// on remplace les <br /> par \n pour écrire la structure dans le fichier .txt
$titre_structure = str_replace("<br />" , "\n", $titre_structure);
fputs($sauve, $titre_structure);
$structure = str_replace("<br />" , "\n", $structure);
fputs($sauve, $structure);
// on écrit le contenu dans le fichier .txt
$titre_contenu = str_replace("<br />" , "\n", $titre_contenu);
fputs($sauve, $titre_contenu);
fputs($sauve, $tout_contenu);
// on ferme le fichier .txt
fclose($sauve);
}
}
// on ferme sa connexion au serveur
mysql_close();
?>
</body>
</html>
|
Voilà, ici s'achève ce tuto.
J'espère de tout coeur qu'il vous aura été très instructif.
Bien sûr, on peut arranger et améliorer ce tuto. Voici quelques pistes :
- mettre un beau design ;
- déplacer le bouton Sauvegarder la table pour qu'il soit en dessous et non au-dessus du descriptif de la table ;
- envoyer sur une page différente de celle de l'accueil quand on clique sur le lien d'une des tables ;
- envoyer sur une autre page quand la sauvegarde est faite en y mettant un petit message du style La table..... a bien été sauvegardée et en rajoutant sur cette page un lien ou un bouton pour retourner sur la page d'accueil.
Si vous avez des questions ou des suggestions concernant ce tuto, n'hésitez pas à m'en faire part.