begin process at 2012 05 27 16:52:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > BACKUP MYSQL EN PHP

BACKUP MYSQL EN PHP


 Information sur la source

Note :
Aucune note
Catégorie :Application Classé sous :mysql, php, backup Niveau :Débutant Date de création :24/09/2010 Date de mise à jour :02/01/2011 09:56:33 Vu :4 584

Auteur : brouno

Ecrire un message privé
Commentaire sur cette source (20)
Ajouter un commentaire et/ou une note

 Description

Ce script permet de sauvagarder une base Mysql et ses tables .
Il est configuré par défaut pour Easyphp en local .

Source

  • <?php ob_start();
  • $nom_de_la_base ='test';
  • define('FC',date('d').'-'.date('m').'-'.date('Y').'.php');
  • define('H','localhost');define('N','root');define('P','');define('T',$nom_de_la_base);
  • $cnt = mysql_connect(H,N,P)or die(mysql_error());mysql_select_db(T,$cnt)or die(mysql_error());
  • echo 'DROP DATABASE IF EXISTS `'.$nom_de_la_base.'`;
  • CREATE DATABASE `'.$nom_de_la_base.'` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
  • USE `'.$nom_de_la_base.'`;'."\n\n";
  • $aa = mysql_query('show tables');while ($a = mysql_fetch_row($aa)){
  • $bb = mysql_query('SELECT * FROM '.$a[0].''); $tt = mysql_num_rows($bb); $nb = mysql_num_fields($bb);
  • echo 'DROP TABLE IF EXISTS `'.$a[0].'`;';
  • $sct = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$a[0].''));
  • echo "\n".$sct[1].";\n\n";
  • if($tt > 0){ echo 'INSERT INTO '.$a[0].' VALUES';
  • $t=0;while( $b = mysql_fetch_array($bb)){ echo '(';
  • for($i = 0; $i < $nb; $i++){if($i == 0){echo "'$b[$i]'";} else { echo ',\''.mysql_real_escape_string($b[$i]).'\'';}}
  • $t++; if($t < $tt){ echo '),'."\n";} else {echo ');'."\n";}}
  • echo "\n\n\n"; }}
  • define('FP',fopen(FC,'w')); fwrite(FP,ob_get_contents());fclose(FP);ob_end_clean(); ?>
<?php ob_start();
$nom_de_la_base ='test';
define('FC',date('d').'-'.date('m').'-'.date('Y').'.php');

define('H','localhost');define('N','root');define('P','');define('T',$nom_de_la_base);
$cnt = mysql_connect(H,N,P)or die(mysql_error());mysql_select_db(T,$cnt)or die(mysql_error());

echo 'DROP DATABASE IF EXISTS `'.$nom_de_la_base.'`;
CREATE DATABASE `'.$nom_de_la_base.'` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `'.$nom_de_la_base.'`;'."\n\n";

$aa = mysql_query('show tables');while ($a = mysql_fetch_row($aa)){
$bb = mysql_query('SELECT * FROM '.$a[0].''); $tt = mysql_num_rows($bb); $nb = mysql_num_fields($bb);

echo 'DROP TABLE IF EXISTS `'.$a[0].'`;';
$sct = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$a[0].''));
echo "\n".$sct[1].";\n\n";

if($tt > 0){ echo 'INSERT INTO '.$a[0].' VALUES';

$t=0;while( $b = mysql_fetch_array($bb)){ echo '(';
for($i = 0; $i < $nb; $i++){if($i == 0){echo "'$b[$i]'";} else { echo ',\''.mysql_real_escape_string($b[$i]).'\'';}}
$t++; if($t < $tt){ echo '),'."\n";} else {echo ');'."\n";}}

echo "\n\n\n"; }}

define('FP',fopen(FC,'w')); fwrite(FP,ob_get_contents());fclose(FP);ob_end_clean(); ?>



 Historique

24 septembre 2010 15:19:18 :
Modification de champ
25 septembre 2010 11:59:16 :
Correction d'erreurs dans les variables
21 octobre 2010 22:10:56 :
Multiples ajouts , drop database ,charset , drop table , mise en tampon au lieu des concaténations de variables , cette source , si elle marche est toujours en test
02 janvier 2011 09:56:33 :
Remplacement de la commande "mysql_list_tables" qui est dorénavant dépréciée , remplacée par "show tables" .

 Sources de la même categorie

Source avec une capture PHPREPOGENERATOR + REPO (WIN) par alvinp
Source avec Zip IPHONE - ICÔNE D'APPEL TÉLÉPHONIQUE SUR L'ÉCRAN D'ACCUEIL par Rainbow
Source avec Zip Source avec une capture [APP WEB]SERVEUREXPLOREUR par thematrix01
Source avec Zip Source avec une capture MY.BOOKMARKS par inwebo
Source avec Zip M.V.C M.E.D par faceme

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture EL COYOTOS LIVRE D'OR PHP 5 par elcoyotos
Source avec Zip CLASS MYSQL 5/PHP5 AVEC GESTION DES EXCEPTION ET DES REQUÊTE... par devil_may_cry
Source avec Zip Source avec une capture PAGINATION JAVASCRIPT PHP MYSQL par cod57
Source avec Zip Source avec une capture GESTION DE SCOLARITÉ [PHP] ET [MYSQL] par ayoubshadow
SYSTÈME DE PAGINATION AVEC BDD ET IMAGES (FICHIERS) par begueradj

Commentaires et avis

Commentaire de jdalton42 le 25/09/2010 10:46:32

alors, j'ai pas exécuté le code mais rien qu'en le regardant, déjà des erreurs:
à la ligne 5 : define('T',$nom_de_la_table); || $nom_de_la_table => $nom_de_la_base
à la ligne 13 : mysql_list_tables($nom_de_la_table); || $nom_de_la_table => $nom_de_la_base

je pense que c'est tout

Commentaire de brouno le 25/09/2010 11:54:24

Tu as raison , merci .
Je corrige .

Commentaire de jdalton42 le 25/09/2010 12:40:56

pas de problème ;)

j'ai pas encore testé le code mais très court, sa a l'air pas mal ;)
je testerai tout à l'heure

Commentaire de brouno le 25/09/2010 13:16:11

En fait c'est un exercise , car j'ai eu beau essayer , je n'ai pas trouvé le moyen d'émuler correctement la fonction create table , j'ai deux versions , mais aucune n'as une syntaxe parfaite .

Mysqldump reste la solution la plus fiable , évidemment .

Commentaire de neigedhiver le 25/09/2010 15:18:46

Salut,

Je ne suis pas convaincu par cette source... Bon, tu dis que c'est un excercice, alors soyons indulgent...

Il y a deux choses qui me gênent profondément :
- l'utilisation des fonction mysql_*
- la non sauvegarde de la structure...

Que veux-tu dire par "je n'ai pas trouvé le moyen d'émuler correctement la fonction create table" ?
Le terme "émuler" me semble inapproprié, du coup, je n'ai aucune idée de ce que tu veux réellement dire... Donc je ne peux rien proposer...

Commentaire de brouno le 26/09/2010 12:31:24

Voila , j'ai trouvé la solution pour la fonction create table ,
c'est on ne peut plus simple ,
http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html

je complèterai donc le script a la manière de mysqldump , if table exists
drop table puis create table .

Je me suis un peu compliqué la vie , j'ai voulu éviter les multiples instances "insert into" par une virgule , le gain est minime , je pense qu'il vaut mieux simplifier pour avoir un code plus sur et rapide , quitte a prendre des kilos .

Commentaire de neigedhiver le 26/09/2010 13:13:30

Sincèrement, les performances et la taille, sur un script d'administration, c'est vraiment pas une priorité...
Si ton script doit mettre 10 secondes pour s'exécuter alors que tu pourrais descendre à 7, on s'en cogne pas mal... Le seul utilisateur impacté, c'est l'admin qui fait son backup et qui SAIT que c'est long...

Commentaire de Kimjoa le 26/09/2010 16:16:40

sinon il y a le jar mysqldump livré dans mysql qui est fait pour ca. Après je sais pas si on peux l'invoquer sur un serveur mutualisé...

Commentaire de alphanono le 27/09/2010 07:35:14

Hello. Ok pour l'exercice. Au cas où un débutant tomberait sur cette source et souhaiterait lui aussi sauvegarder sa DB sans problème (d'accent par exemple), voila ma fonction en vrac, (sans la connexion à la DB) :

//--------------
private function sauvegarde_mysql(){
    $date = date("Y_m_d");
    switch($this->format){
        case "bzip2":
            $extension = ".sql.bz2";
            break;
        case "gzip":
            $extension = ".sql.gz";
            break;
        default:
            $this->erreur("Format de compression <b>" . $this->format . "</b> non pris en charge.");
            break;
    }
    $fichier = $this->dossierSauv . $this->nomDb . "_" . $date . $extension;
    exec('mysqldump --user="' . $this->utilisateur . '" --password="' . $this->motDePasse . '" "' . $this->nomDb . '" | ' . $this->format . ' > "' . $fichier . '"');
    $this->response->setVar("message", "Sauvegarde effectuée. Fichier <b>" . $fichier . "</b> sauvegardé");
    $this->response->setVar("dossierSauv ", $this->dossierSauv);
    $this->response->setVar("nomDuFichier", $this->nomDb . "_" . $date . $extension);
}
//-------------

Le fait de gziper ou bziper la sauvegarde (suivant les dispos du serveur) permet de ne pas avoir de problèmes d'accents lors de la réimportation de la sauvegarde. A savoir que PHPMySQL permet une importation directe du .bz2 ou du .gz

Commentaire de neigedhiver le 27/09/2010 08:46:29

Je crois sincèrement qu'il n'y a vraiment aucun lien entre les accents et la compression du fichier SQL...
Vraiment... En fait, ce n'est absolument pas lié.

Commentaire de alphanono le 27/09/2010 09:38:06

Oui Oui ... sauf que fait des essais d'export mysqldump et réimport sans compression, et tu verras que c'est pas gagné. Les caractères UTF-8 sont transformés en double caractères. La même chose avec un bon vieux bz2 et le problème est réglé. Je pense que le fond du problème vient de l'encodage natif du fichier txt en sortie de mysqldump. Quand les données sont intégrées dans le bz2, on n'a plus ce problème.

Commentaire de neigedhiver le 27/09/2010 09:40:26

C'est ce que je voulais dire : compresser fait "disparaitre" la problématique sans la résoudre réellement.
Je sais, je joue sur les mots et on se fout un peu de cette digression dans les commentaires de cette source...

Commentaire de brouno le 27/09/2010 11:58:21

Bonjour Kim

Oui , je travaille avec winscp a partir de mon bureau , cryptage ssh , mysqldump .
Mais c'est vrai que les mutus n'ont pas ces fonctions , certains du moins .
Il faut avouer que c'est tentant de la jouer en php , si on dispose d'une fonction de cryptage , on peut crypter certaines tables comme celles de login .

Jour alpha , chacun a sa manière de coder , je ne discuterai pas ça , vu que c'est une question de gout .

Mais tu soulèves un problème intéressant , il y en a un autre et de taille ,
on risque de réinjecter une attaque sql si sur le site on a utilisé , par exemple les procédures préparées avec pdo ou mysqli , il faut prendre en compte cette possibilité , mysql_real_escape_string ne protège pas complètement des injections , donc , c'est un problème a résoudre , j'ai un début de réponse , employer preg_quote en complément .

Il est clair qu'il vaut mieux discuter concept que manière , pour le deuxième , on a tous des choix différents . Objet ou procédural , chacun ses gouts .

Commentaire de brouno le 27/09/2010 12:16:11

Oups , excuse Alpha , je t'avait lu rapidement , mais c'est vrai que tu as raison .

Commentaire de neigedhiver le 27/09/2010 12:31:36

Je vois pas le rapport entre preg_quote et les données dans une bdd...
preg_quote sert à protéger une chaîne de caractères devant servir de masque pour une expression régulière compatible perl (PCRE). Cela signifie que les caractères spéciaux seront échapés (par spéciaux, j'entends ayant un sens pour une PCRE), ainsi que le caractère servant de délimiteur. C'EST TOUT !!
Les fonctions de protections des données fournies par les extensions relatives aux bases de données protègent elles, contre les valeurs dangereuses. Cela inclu des valeurs binaires qui ne sont pas du tout impactées par preg_quote.
Ce sont des fonctions qui ont des rôles différents : il convient donc de les utiliser pour ce à quoi elles sont destinées, il peut être dangereux de les détourner de leur utilisation première.

Commentaire de brouno le 27/09/2010 14:06:33

Dangereux , non , il s'agit simplement d'une fonction d'échappement devant des caractères spéciaux , les injections sql peuvent étre très complexes , quelquefois le signe - est utilisé , preg_quote s'en occupe .
Il s'agit ni plus ni moins d'une  fonction sur une chaine de type string , opérationnelle sous php .
Quand au danger d'injections réinjectées , la oui , je ne suis pas sur de moi ,
faut voir .

Commentaire de neigedhiver le 27/09/2010 14:08:20

Des fois j'ai l'impression de ne pas être lu. Pourtant on me répond...

A ce que tu dis, je ne peux que répondre le contenu de mon message précédent...

Commentaire de masternico le 27/09/2010 20:56:45

+1 pour neigedhiver.
Pour protéger une requette mysql il faut utiliser mysql_real_escape_string($requette) sans quoi ça rique de coincer

Commentaire de brouno le 05/10/2010 14:55:49

D'ici peu , je mettrai le code a jour avec create table ,
cette fonction est si précise dans son résultat que je suis a peu près sur qu'elle nous vient de mysqldump

je doit ahjouter également en entête le charset de la table et l'inter classement ou collation ,
afin d'éviter les conflits possibles .
Pour l'écriture du backup , il n'y a bien sur aucun danger en cas d'injection sql enregistrée , c'est au moment de la restauration , ce sera la deuxième étape .

Commentaire de masternico le 05/10/2010 22:12:32

hmmm...
On tourne un peut en rond ici   ;)
Ce que je voulais dire ne s'applique pas uniquement à l'injection. En fait, lorsque je fait une requette, je protège systématiquement les données avec mysql_real_escape_string parceque sinon la requette peut planter. Pour illustrer, voici un exemple:
$clients_nom = 'Bouchard';
$clients_prenom = 'Gérard';
$requette = 'INSERT INTO `clients` (`clients_nom`,`clients_prenom`) VALUES (\'' . $clients_nom . '\',\'' . $clients_prenom . '\')';
$db_resource = mysql_query($requette);

Pas de problème. Mais si on change les valeurs:
$clients_nom = 'l\'enruhmé';  //ne rigolez pas je connais qqu'un qui s'appelle comme ça
$clients_prenom = 'Gérard';

$requette = 'INSERT INTO `clients` (`clients_nom`,`clients_prenom`) VALUES (\'' . $clients_nom . '\',\'' . $clients_prenom . '\')';
$db_resource = mysql_query($requette);

Là ça plante, donc il faut:
$requette = 'INSERT INTO `clients` (`clients_nom`,`clients_prenom`) VALUES (\'' . mysql_real_escape_string($clients_nom) . '\',\'' . mysql_real_escape_string($clients_prenom) . '\')';

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Backup Base de données [ par sidalilo ] bonjour j'ai une application de gestion developpée en php et la base de données en mysql dans xp et je veux faire un backup automatique de cette base insert into [ par casper77610 ] Bonjour à tous, J'ai un formulaire d'inscription, Une tbl1 ou il y a déjà les adhérents et une tbl2 ou les adhérents peuvent s'inscrire à une sortie Affichage d'un enregistrement (PHP BDD MySQL) [ par begueradj ] Bonjour, J'ai implémenté une petite classe que voici: je passe la table dans laquelle se trouve mon enregistrement désiré, et son identificateur à un Utilitaire PHP [ par bouss12 ] Bonjour Tous je suis nouveau sur ce site codesource, en fait je suis developpeur dans un centre de recherche(j'utilise habituellement Access pour mes php / mysql [ par honey87 ] bonjour tout le monde, je voudrais faire une newsletter dans mon site mais je ne sais pas pourquoi les valeurs qu'on saisie dans la zone de texte ne s espace membre php/mysql [ par kingramizy ] Bonjour, Voilà, le débute dans le php et MySQl et je suis à la recherche pour mon nouveau site d'un script pour créer un espace membre et une adminis installation de MySQL de Wampserver2 [ par Georges97427 ] onjour, (Débutant) Je programme pour la 1 fois MySQL sous Wampserver2. 1-Il parle d'"interclassement" pour français que faut-il choisir (je me suis Correction svp ! [ par Sinsitrus ] Salut ! J'ai bidulé un script php et je souhaiterai que vous me corrigez si ça ne vous derrange pas : [code=php]<?php if (isset($_POST["Valid"])) {$V PHP MySQL requete d'affichage [ par babygamer ] Bonjours a tous et a toutes !! voici mon problème: Je voudrai récupérer une valeur saisi dans un formulaire afin de la tester si elle est égale a la c communication PHP MySQL [ par mrassaa ] Salut, J'ai un problème de communication entre PHP et MySQL. En fait, j'ai réalisé une petite application avec Macromedia Flash 8 et j'ai voulu enreg


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales