Aller au menu - Aller au contenu

[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

Avatar
Auteur : caline
Créé : le 12/10/2006 15:55:47
Modifié : le 28/05/2008 18:53:28
Noter et commenter ce tutoriel
Imprimer ce tutoriel
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
Image utilisateur

On va également utiliser les "fichiers".

Il va sans dire qu'il faut bien sûr avoir des bases en langage PHP. Si ce n'est pas le cas, je vous renvoie vers le tuto de M@teo21 http://www.siteduzero.com/tuto-3-4-0-u [...] avec-php.html.

Sommaire du chapitre :

Les éléments de base

Nous allons avoir besoin de 2 choses :
  1. d'une base de données avec des tables
  2. 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 :p

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 :p
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 :lol:

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 :p
Image utilisateur




Allez maintenant que nous avons tout ce qu'il faut pour travailler, passons à la suite...


Fonction SHOW TABLES

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 :D .

Ok, c'est bien beau ça mais on utilise quelle requête pour connaître le nom des tables ?

On va utiliser la fonction SHOW TABLES, ce qui signifie en anglais "montrer les tables", de cette manière :
Code : PHP
1
$req_table = "SHOW 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 :p
Image utilisateur


Secret (cliquez pour afficher)
Code : PHP
1
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... :o

Fonction SHOW CREATE TABLE

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. :p

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 ? o_O


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 : PHP
1
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



Bon, on a notre titre de la structure, maintenant passons à son contenu. :p

Nous allons poser une nouvelle requête et pour cela, on va utiliser la fonction SHOW CREATE TABLE, qui veut dire en anglais "montre la création de la table" (qu'il faut traduire par "montre la structure de la table") et on va l'utiliser ainsi :
Code : PHP
1
$req_structure = "SHOW CREATE TABLE $table ";


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
Image utilisateur


Wouaaahhhh ! C'est génial ! :p

Allez, maintenant continuons avec le contenu des tables...

Fonction SHOW COLUMNS

Allez, commençons par écrire le titre "Contenu de la table" comme on l'a fait auparavant avec "Structure de la table".

Code : PHP
1
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 ^^

Image utilisateur


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. :p
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. :p

Nous allons apprendre une nouvelle fonction : SHOW COLUMNS. Elle signifie en anglais "montrer les colonnes", mais nous allons la traduire par "montrer les champs".
Code : PHP
1
$req_champ = "SHOW COLUMNS FROM $table";



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 : PHP
1
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" :( ?

Pour simplifier les choses, un enregistrement, c'est l'équivalent d'une ligne dans la table.
Pour la table Forum, nous avons 2 lignes, donc 2 enregistrements. :p


Je vous guide :


Je vous laisse vous creuser un peu la tête. :p

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. :p

Explication




Un petit clic sur l'image pour l'agrandir ! ;)
Image utilisateur


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 :p . 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().

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é. :p
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 ! ;)
Image utilisateur


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 ...

Écrire dans un fichier

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 : PHP
1
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 ! :p

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 : PHP
1
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 : PHP
1
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 :p ).

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 ? :euh: 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... :p

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 ? ^^
Image utilisateur


Vous êtes contents de votre fichier ? :p

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 ? :o

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) :D !
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. :euh:
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é ! :colere2:

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. :D
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>

Q.C.M.

À quoi sert la fonction SHOW TABLE ?
Quelle est la bonne fonction pour afficher la structure d'une table ?
Quelle est la requête pour afficher les noms des champs de la table TOTO de la base BEBE ?
Quelle est la bonne fonction pour écrire et créer un fichier ?
À quoi sert la fonction fputs() ?


Voilà, ici s'achève ce tuto. :p
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 :


Si vous avez des questions ou des suggestions concernant ce tuto, n'hésitez pas à m'en faire part. :D
Image utilisateur
Auteur : caline
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 645 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.1761s (0.1616s)