begin process at 2012 05 27 19:57:49
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > DUMP SQL AVEC SÉLECTION AUTOMATIQUE DES TABLES

DUMP SQL AVEC SÉLECTION AUTOMATIQUE DES TABLES


 Information sur la source

Note :
9,8 / 10 - par 5 personnes
9,80 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Base de données Classé sous :Dump, SQL, Selection automatique Niveau :Débutant Date de création :15/03/2011 Date de mise à jour :17/03/2011 18:51:30 Vu :2 163

Auteur : theptitprince

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

 Description

Voici un petit code de DUMP (sauvegarde) SQL qui fait lui même l'inventaire des tables et vous génère un gz contenant la sauvegarde complète de la base SQL permettant de la réinstaller.

Source

  • <?php
  • /*****************************
  • *
  • * Dump SQL
  • * The P'tit Prince
  • * 28/12/2010
  • * Rev 1 du 28/12/2010
  • *
  • *****************************/
  • // Infos
  • $host = 'localhost';
  • $user = 'root';
  • $login = 'root';
  • $dbname = 'information_schema';
  • ini_set("memory_limit",'64M'); // Afin d'etre sur d'avoir assez d'espace pour les grosses tables
  • $structure = "";
  • $tout_contenu =""';
  • $dstName = 'dumptest/dump'.time().'.sql.gz';
  • // Connexion
  • @mysql_connect($host,$user,$login) or die("Connexion impossible");
  • @mysql_select_db($dbname) or die("Echec de selection de la base");
  • // Creation de la liste de table
  • $req_table = "SHOW TABLES";
  • $result_table = mysql_query($req_table) or die ("Erreur de selection de table");
  • while($table = mysql_fetch_array($result_table)){
  • // Creation de la structure
  • $req_structure = "SHOW CREATE TABLE $table[0]";
  • $result_structure = mysql_query($req_structure) or die ("Erreur creation structure");
  • $donnee_structure = mysql_fetch_array($result_structure);
  • $structure .= $donnee_structure[1].";\n\n\n";
  • // Recuperation du nombre de valeur par table
  • $req_champ = "SHOW COLUMNS FROM $table[0]";
  • $result_champ = mysql_query($req_champ) or die ("Erreur lors de la recuperation du nombre d'entrees");
  • $nbre_champ= mysql_num_rows($result_champ);
  • // Recuperation des entrees de chaque table
  • $req_tout = "SELECT * FROM $table[0]";
  • $result_tout = mysql_query($req_tout) or die ("Erreur lors de la recuperation des donnes");
  • while($donnees_tout = mysql_fetch_array($result_tout)){
  • $contenu = "INSERT INTO ".$table[0]." VALUES (";
  • $i = 0;
  • while($i < $nbre_champ){
  • $contenu .= "'".addslashes($donnees_tout[$i])."',";
  • $i++;
  • }
  • $tout_contenu .= $contenu."); \n";
  • }
  • $tout_contenu .= "\n";
  • }
  • // Suppression de l'inutil
  • $tout_contenu = str_replace(',);',');',$tout_contenu);
  • // Mise en ordre des donnees
  • $data = "";
  • $data .= $structure;
  • $data .= "\n";
  • $data .= $tout_contenu;
  • // Creation du .gz
  • $zp = gzopen($dstName, "w9");
  • gzwrite($zp,$data);
  • gzclose($zp);
  • echo "sauvegarde finie";
  • ?>
<?php
/*****************************
*
*  Dump SQL
*  The P'tit Prince
*  28/12/2010
*  Rev 1 du 28/12/2010
*
*****************************/

// Infos
$host = 'localhost';
$user = 'root';
$login = 'root';
$dbname = 'information_schema';

ini_set("memory_limit",'64M'); // Afin d'etre sur d'avoir assez d'espace pour les grosses tables
$structure = "";
$tout_contenu =""';

$dstName = 'dumptest/dump'.time().'.sql.gz';

// Connexion
@mysql_connect($host,$user,$login) or die("Connexion impossible");
@mysql_select_db($dbname) or die("Echec de selection de la base");

// Creation de la liste de table
$req_table = "SHOW TABLES";
$result_table = mysql_query($req_table) or die ("Erreur de selection de table");

while($table = mysql_fetch_array($result_table)){
	
	// Creation de la structure
	$req_structure = "SHOW CREATE TABLE $table[0]";
	$result_structure = mysql_query($req_structure) or die ("Erreur creation structure");
	$donnee_structure = mysql_fetch_array($result_structure);
	$structure .= $donnee_structure[1].";\n\n\n";
	
	// Recuperation du nombre de valeur par table
	$req_champ = "SHOW COLUMNS FROM $table[0]";
	$result_champ = mysql_query($req_champ) or die ("Erreur lors de la recuperation du nombre d'entrees");
	$nbre_champ= mysql_num_rows($result_champ);
	
	// Recuperation des entrees de chaque table
	$req_tout = "SELECT * FROM $table[0]";
	$result_tout = mysql_query($req_tout) or die ("Erreur lors de la recuperation des donnes");
	
	while($donnees_tout = mysql_fetch_array($result_tout)){
		$contenu = "INSERT INTO ".$table[0]." VALUES (";
			$i = 0;
			while($i < $nbre_champ){
				$contenu .= "'".addslashes($donnees_tout[$i])."',";
				$i++;
			}
		$tout_contenu .= $contenu."); \n";
	}
	$tout_contenu .= "\n";
}

// Suppression de l'inutil
$tout_contenu = str_replace(',);',');',$tout_contenu);

// Mise en ordre des donnees
$data = "";
$data .= $structure;
$data .= "\n";
$data .= $tout_contenu;

// Creation du .gz
$zp = gzopen($dstName, "w9");
gzwrite($zp,$data);
gzclose($zp);

echo "sauvegarde finie";
?>

 Conclusion

On peut directement utiliser le fichier généré dans SQL pour régénérer les tables et leur contenu.


 Historique

16 mars 2011 16:06:56 :
Ajout d'un ini_set("memory_limit",'64M'); afin d'augmenter la capacité de stockage de php pour ce script si on veut sauvegarder de grosses tables.
17 mars 2011 18:51:31 :
Initialisation des variables. Ajout d'une protection des slashes.

 Sources du même auteur

GÉNÉRATEUR DE REQUÊTE SQL

 Sources de la même categorie

Source avec Zip ORM : DAO, ACTIVERECORD ET DBLIST par Reldan
Source avec une capture CET EXTRAIT PERMET D'AJOUTER DANS UN TABLEAU UNE AGRÉGATION ... par Denis007
EXPORT DE BASE AU FORMAT CSV par remib74
Source avec Zip RECHERCHE DES DOUBLONS DANS UNE TABLE MYSQL EN SÉLECTIONNANT... par aladec2007
[CRON] INSERT ON DUPLICATE KEY UPDATE par pierreSabatier

 Sources en rapport avec celle ci

Source avec Zip CLASS SIMPLE CBASEDONNEE par smag42
Source avec Zip Source avec une capture CONVERTIR BASE FIREBIRD EN MYSQL par castelfrederic29
GÉNÉRATEUR DE REQUÊTE SQL par theptitprince
Source avec une capture SQL/EXE EXECUTEUR DE REQUETTES SQL par enokbyreal
Source avec Zip Source avec une capture CRÉER ET ETABLIR UNE PAGE DE MAINTENANCE POUR X HEURES par popolino0

Commentaires et avis

Commentaire de lanner le 16/03/2011 14:26:50 10/10

Bonjour

Ou se définie le mot de passe ?

Commentaire de theptitprince le 16/03/2011 14:40:09

Bonjour.
Je l'accorde, mes noms de variables ne sont pas forcément évident. Tout est défini au début du code avec ses variables:

$host = 'localhost';
$user = 'nomdutilisateur';
$login = 'motdepasse';
$dbname = 'information_schema';

Je pense tout de même qu'en regardant le code, il était possible d'identifier les variables...

Commentaire de lanner le 16/03/2011 15:52:11

oui je l'accorde aussi :) je n'ai pas directement testé, cependant une information il se peu que le memory_limit soit trop bas est provoque une erreur et du coup ne fonctionera pas
sur le script on peu ajouter (si on a pas accès a la configuration)

ini_set("memory_limit",'16M');

Dans mon cas j'avais l'erreur : Allowed memory size of 8388608 bytes exhausted

Commentaire de theptitprince le 16/03/2011 16:02:48

En effet, en fonction de la taille de la base sauvegardée, il est possible que le memory_limit soit trop petit (limité à 8M il me semble, si ma mémoire est bonne). Après, à chacun de le modifier en conséquence!

Commentaire de vincseize le 17/03/2011 17:45:01

Hi

parfait

cependant
je me suis permis néanmoins d'ajouter

en ligne 28

// init variables
$structure = '';
$tout_contenu = '';

pour eviter le message d'erreur non bloquant 'variables indéfinies'

Commentaire de vincseize le 17/03/2011 18:25:18 10/10

Et suite

pour ceux qui ont des problemes de slashes (voir magic_quotes)

changer:

$contenu .= "'".$donnees_tout[$i]."',";

par

$contenu .= "'".addslashes($donnees_tout[$i])."',";

Commentaire de theptitprince le 17/03/2011 18:48:37

En effet, je n'y ai pas pensé des le début (en fait, j'ai tiré ce script de mon site, et les variables contenu et $structure et $tout_contenu sont initialisés des le lancement de index.php. Je rajoute donc!
Merci de la remarque pour les slashes!

Commentaire de vincseize le 17/03/2011 18:54:38

Le truc en fait,

ce serait de detecter si la conf serveur est en agic quote ou non
car la mon patch (un peu grave vite fait), evites les erreurs , mais
retire tous les guillemets du coup ...


ceci dit
je pense que c'est à l insert de données avant dans la base, donc le fameux addslash
auquel il faut penser ds le cas de magic_quotes on ou off

:)

Commentaire de lanner le 17/03/2011 21:17:58

re-Coucou
PS : petite faute dans cette partie , un ' de trop :) > $tout_contenu =""';

Commentaire de vincseize le 18/03/2011 01:55:06

non, non:

$contenu .= "'".addslashes($donnees_tout[$i])."',";

Commentaire de vincseize le 18/03/2011 01:55:43

et suite non non

$tout_contenu = '';

Commentaire de lanner le 18/03/2011 12:42:16

ah ben sous dreamweaver on voit bien le bug la colorisation de syntaxe en prend un coup si on ne fait pas ce que j'ai marqué .. enfin bref c'est juste l'information , la correction

Pour moi la variable c'est forcement :
Ligne 13
$tout_contenu ="";

Commentaire de pmtjnden le 21/03/2011 17:38:54

bonjour,
quelque soit la taille que l'on alloue (même si on enlève la ligne d'allocation mémoire) sur Free, un message d'erreur apparait :

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 1024 bytes) in /mnt/160/sdb/9/8/nomdusite/chemin/page.php on line xxx (48)

la ligne xxx correspondant à la ligne :
while($donnees_tout = mysql_fetch_array($result_tout)){
en cas de grosse base....

ou à la ligne (61) :
$tout_contenu = str_replace(',);',');',$tout_contenu);
en cas de base plus petite

Commentaire de pmtjnden le 21/03/2011 17:53:01 9/10

bravo pour le script... ca marche super en local.
Je vais voir si je trouve une solution pour Free...(je la déposerais ici)
Si quelqu'un a une idée je suis preneur.

Commentaire de RudiRatlos le 26/03/2011 09:40:31 10/10

parfait :) 10/10

Commentaire de christobal le 27/03/2011 23:39:25 10/10

C'est parfait, exactement se que j'avais besoin.
Juste une chose dans "$req_tout" vous pensez qu'il est possible de mettre une close where et LIKE du style :
$req_tout = 'SELECT * FROM ' . $table[0] . ' WHERE ' . $table[0] . ' LIKE \'' . $prefix. '%\' ' ;

parce que je n'y arrive pô :)

merki

Commentaire de christobal le 27/03/2011 23:50:21

Pfff, pô les yeux en face des trous ce soir.
bon le plus simple c'est de le mettre dans "$req_table" :

$req_table = 'SHOW TABLES LIKE \'' . $client . '%\' ' ;

@++ et encore merki pour la source ;)

Commentaire de theptitprince le 27/03/2011 23:53:25

Merci a tous pour vos commentaire et vos notes :)

@ Christobal :
Je ne vois pas vraiment l'utilité d'une close LIKE puisque le but est de sauvegarder l'intégralité d'un base SQL.
Cependant, je pense en effet qu'il est possible de mettre une close LIKE, mais pas avec un ' WHERE '.$table[0] puisque $table[0] est le nom de la table... Il faut mettre un nom de colonne, et encore...
Pour obtenir le nom de la colonne, tu peux passer par un explode(",",$donnee_structure[1])... Mais tu serais après obligé pendant toute la sauvegarde de faire un like d'un numéro de colonne fixe sans pouvoir changer de colonne, a condition que la dite colonne existe...
Quoiqu'il en soit, je n'en vois pas une grande utilité pour une sauvegarde.... Peux-tu me dire pourquoi tu as besoin d'un LIKE?

@ Autre:
Je ne sais pas si free permet de changer l'allocation maximale... C'est assez bridé Free de ce que je m'en souviens...

Commentaire de christobal le 28/03/2011 08:38:08

@theptitprince
:D je ne souhaite pas faire un simple dump de ma base (elle est archivé quotidiennement) mais uniquement sauvegarder les tables propre a un client "prefix" a un instant.
Le tout est dans une fonction qui archive la db puis les supprimes :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Convertir un nombre en expression literrale en PL/SQL [ par ThReM ] bonjour je cherche une source pour convertir un nombre en ce meme nombre mais ecris en toutes lettre (99 ==&gt; quatre vingt dix neuf) en langage PL/S Astuce du jour #1: Comment configurer une erreur de la base de donné MySql [ par SmallToad ] Quand vous avez de des erreurs de la base de donnée, êtes-vous déjà demander comment configurer le message d'erreur de la base de donnée MySql C'est Formulaire et SQL [ par Christophe46 ] Salut,J'espère trouver de l'aide sur ce forum,J'ai fait une base de données MySql, avec une table et des champs comme nom, prenom, telephone, adresse, Formulaire et SQL [ par Christophe46 ] Salut,J'espère trouver de l'aide sur ce forum,J'ai fait une base de données MySql, avec une table et des champs comme nom, prenom, telephone, adresse, LA taille d'une base de donnée sql [ par FleX ] ba en fait je suis sur Free et j'ai une base de donnée que je manipule en php.J'aimerai savoir comment c'est ty qu'on peut bien faire pour obtenir la Debuter une base SQL pour faire du PHP [ par bowen ] Bonjour je suis nouveau sur ce site et aussi a la prog !Bon je vous expliques mon probleme je veux creer un site sur le cinema asiatique et je vais do SQL [ par ProGMaN007 ] Salut,$dbserver = "localhost"; ok ça c ok$dbuser = je met quoi ?????? j utilise EasyPHP. Je met root ?$dbpass = mot de pas PROBLEME SIMPLE [ par g0belin ] sa me repond sa---------------------------ERREUR--------------------Réponse serveur SQL : You have an error in your SQL syntax near '@msn.com, 1234567 PROBLEME UPDATE [ par g0belin ] JE FAIS SA:$requete2= "UPDATE membre SET cle = $id WHERE LIKE '%$login%'";ET SA ME DIS SA:Réponse serveur SQL : You have an error in your SQL syntax n SQL Injection [ par thebigbang ] bonjour à tous,Je cherche des infos sur la méthode du SQL Injection.. Si vous vous y connaissez un peu, merci de m'aider, me renseigner ... me donner


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

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,406 sec (3)

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