Script PHP sauvegardes tables d'une base de données

Bonjour à tous et toutes,

J’ai trouvé un script PHP qui me permet de sauvegarder une base de données complète :


#!/usr/local/bin/php

<?php
// création d'une fonction comportant les identifiants de connexion au FTP :


function mysql_structure() {
$host = 'xxxx';
$user = 'xxxx';
$pass = 'xxxx';
$base = 'xxxx';

// création d'un fichier affichant en boucle le contenu des tuples de la base :

mysql_connect($host, $user, $pass);
mysql_select_db($base);
$tables = mysql_list_tables($base);
while ($donnees = mysql_fetch_array($tables))
{
$table = $donnees[0];
$res = mysql_query("SHOW CREATE TABLE $table");
if ($res)
{
$insertions = "";
$tableau = mysql_fetch_array($res);
$tableau[1] .= ";";
$dumpsql[] = str_replace("\n", "", $tableau[1]);
$req_table = mysql_query("SELECT * FROM $table");
$nbr_champs = mysql_num_fields($req_table);
while ($ligne = mysql_fetch_array($req_table))
{
$insertions .= "INSERT INTO $table VALUES(";
for ($i=0; $i<=$nbr_champs-1; $i++)
{
$insertions .= "'" . mysql_real_escape_string($ligne[$i]) . "', ";
}
$insertions = substr($insertions, 0, -2);
$insertions .= ");\n";
}
if ($insertions != "")
{
$dumpsql[] = $insertions;
}
}
}
return implode("\r", $dumpsql);
}


// creation d'une fonction file_put_content si le script est en PHP4 :

if(!function_exists('file_put_contents')) {
function file_put_contents($filename, $data, $file_append = false) {
$fp = fopen($filename, (!$file_append ? 'w+' : 'a+'));
if(!$fp) {
trigger_error('file_put_contents ne peut pas écrire dans le fichier.', E_USER_ERROR);
return;
}
fputs($fp, $data);
fclose($fp);
}
}


// création du fichier de dump sur le même niveau que ce fichier dump.php

file_put_contents("sqldump_".date("d-n-Y").".sql", mysql_structure());

// effacement du fichier precedant (créé 7 jours plus tot)
$time_old = getdate(mktime()-(7*24*3600));
$an = $time_old['year'];
$mois = $time_old['mon'];
$jour = $time_old['mday'];


// formatage des jours à 1 chiffre

for($k=1; $k<10; $k++)
{
if ($jour==$k)
{
$jour='0'.$jour;
}
}

$date_old=$jour.'-'.$mois.'-'.$an;
$file_old="sqldump_".$date_old.".sql";
unlink($file_old);
?>

Ca fonctionne bien, mais j’aimerai modifier ce script afin de ne sauvegarder que certaines tables d’une bases de données (en indiquant les tables à sauvegarder dans le script). Est-ce que certains d’entre-vous pourraient me donner un coup de main ?

Merci d’avance…et bonne année !
Edité le 02/01/2012 à 16:46

Personne pour m’aider ? Je ne serai pas dans la bonne section ?

Dans ce morceau de code


$tables = mysql_list_tables($base);
while ($donnees = mysql_fetch_array($tables))
{
$table = $donnees[0];

La 1ère ligne te liste les tables de ta bdd, il faut remplacer ça par un tableau par exemple, puis itérer sur ce tableau en remplaçant par exemple ta boucle while par un foreach.

On obtiendrait quelque chose comme ça:


$tables = array("table1", "table2");
foreach ($tables as $table) 
{

Merci, je vais tester cela.
Et si je veux rajouter la fonction DROP TABLE IF EXIST, ça serait où ?

Je dirais avant cette ligne qui ajoute la création de la table:

$tableau = mysql_fetch_array($res);

En ajoutant:


$dumpsql[] = "DROP TABLE IF EXIST $table;";

J’ai rien testé hein, des erreurs de syntaxe sont possibles.
Edité le 03/01/2012 à 16:51

Nickel pour le Drop Table, ça marche. Je teste pour les bases !

Zut, ça ne marche pas en sélectionnant les tables, j’ai ce code d’erreur :

bWarning/b:  implode() [a href='function.implode'function.implode/a]: Invalid arguments passed in b/homez.42/guillaumn/www/backup/Velo/scriptguillaumnvelo2.php/b on line b45/bbr / br /
bWarning/b:  unlink(sqldump_27-12-2011.sql) [a href='function.unlink'function.unlink/a]: No such file or directory in b/homez.42/guillaumn/www/backup/Velo/scriptguillaumnvelo2.php/b on line b87/bbr /

Le 1er warning, c’est parce qu’il n’y a rien à écrire dans le fichier, as-tu bien renseigné les noms des tables que tu veux sauvegarder ?


$tables = array("table1", "table2", etc...);

Pour l’autre warning, c’est qu’il essaye de supprimer le fichier précédent mais il n’existe pas.
Edité le 04/01/2012 à 10:13

Oui, j’ai bien renseigné le nom des tables.

Pour le second warning, ok, c’est normal.

Peux-tu me montrer ton script modifié que je le teste ?

Le voici :


#!/usr/local/bin/php

<?php
// création d'une fonction comportant les identifiants de connexion au FTP :


function mysql_structure() {
$host = '*****';
$user = '*****';
$pass = '*****';
$base = '*****';

// création d'un fichier affichant en boucle le contenu des tuples de la base :

mysql_connect($host, $user, $pass);
mysql_select_db($base);
$tables = array("dcculture_blog", "dccycloblog_media"); foreach ($tables as $table) { 
$table = $donnees[0];
$res = mysql_query("SHOW CREATE TABLE $table");
if ($res)
{
$insertions = "";
$dumpsql[] = "DROP TABLE IF EXIST $table;"; 
$tableau = mysql_fetch_array($res);
$tableau[1] .= ";";
$dumpsql[] = str_replace("\n", "", $tableau[1]);
$req_table = mysql_query("SELECT * FROM $table");
$nbr_champs = mysql_num_fields($req_table);
while ($ligne = mysql_fetch_array($req_table))
{
$insertions .= "INSERT INTO $table VALUES(";
for ($i=0; $i<=$nbr_champs-1; $i++)
{
$insertions .= "'" . mysql_real_escape_string($ligne[$i]) . "', ";
}
$insertions = substr($insertions, 0, -2);
$insertions .= ");\n";
}
if ($insertions != "")
{
$dumpsql[] = $insertions;
}
}
}
return implode("\r", $dumpsql);
}


// creation d'une fonction file_put_content si le script est en PHP4 :

if(!function_exists('file_put_contents')) {
function file_put_contents($filename, $data, $file_append = false) {
$fp = fopen($filename, (!$file_append ? 'w+' : 'a+'));
if(!$fp) {
trigger_error('file_put_contents ne peut pas écrire dans le fichier.', E_USER_ERROR);
return;
}
fputs($fp, $data);
fclose($fp);
}
}


// création du fichier de dump sur le même niveau que ce fichier dump.php

file_put_contents("sqltables_".date("d-n-Y").".sql", mysql_structure());

// effacement du fichier precedant (créé 7 jours plus tot)
$time_old = getdate(mktime()-(7*24*3600));
$an = $time_old['year'];
$mois = $time_old['mon'];
$jour = $time_old['mday'];


// formatage des jours à 1 chiffre

for($k=1; $k<10; $k++)
{
if ($jour==$k)
{
$jour='0'.$jour;
}
}

$date_old=$jour.'-'.$mois.'-'.$an;
$file_old="sqldump_".$date_old.".sql";
unlink($file_old);
?>

Faut virer cette ligne:


$table = $donnees[0];

On obtient:


<?php
// création d'une fonction comportant les identifiants de connexion au FTP :


function mysql_structure() {
$host = '*****';
$user = '*****';
$pass = '*****';
$base = '*****';

// création d'un fichier affichant en boucle le contenu des tuples de la base :

mysql_connect($host, $user, $pass);
mysql_select_db($base);
$tables = array("dcculture_blog", "dccycloblog_media"); 
foreach ($tables as $table) { 
$res = mysql_query("SHOW CREATE TABLE $table");
if ($res)
{
$insertions = "";
$dumpsql[] = "DROP TABLE IF EXIST $table;"; 
$tableau = mysql_fetch_array($res);
$tableau[1] .= ";";
$dumpsql[] = str_replace("\n", "", $tableau[1]);
$req_table = mysql_query("SELECT * FROM $table");
$nbr_champs = mysql_num_fields($req_table);
while ($ligne = mysql_fetch_array($req_table))
{
$insertions .= "INSERT INTO $table VALUES(";
for ($i=0; $i<=$nbr_champs-1; $i++)
{
$insertions .= "'" . mysql_real_escape_string($ligne[$i]) . "', ";
}
$insertions = substr($insertions, 0, -2);
$insertions .= ");\n";
}
if ($insertions != "")
{
$dumpsql[] = $insertions;
}
}
}
return implode("\r", $dumpsql);
}


// creation d'une fonction file_put_content si le script est en PHP4 :

if(!function_exists('file_put_contents')) {
function file_put_contents($filename, $data, $file_append = false) {
$fp = fopen($filename, (!$file_append ? 'w+' : 'a+'));
if(!$fp) {
trigger_error('file_put_contents ne peut pas écrire dans le fichier.', E_USER_ERROR);
return;
}
fputs($fp, $data);
fclose($fp);
}
}


// création du fichier de dump sur le même niveau que ce fichier dump.php

file_put_contents("sqltables_".date("d-n-Y").".sql", mysql_structure());

// effacement du fichier precedant (créé 7 jours plus tot)
$time_old = getdate(mktime()-(7*24*3600));
$an = $time_old['year'];
$mois = $time_old['mon'];
$jour = $time_old['mday'];


// formatage des jours à 1 chiffre

for($k=1; $k<10; $k++)
{
if ($jour==$k)
{
$jour='0'.$jour;
}
}

$date_old=$jour.'-'.$mois.'-'.$an;
$file_old="sqldump_".$date_old.".sql";
unlink($file_old);
?>

Merci, je teste et je te tiens au courant !

Nickel, ça fonctionne. Merci beaucoup pour ton aide !

Quelqu’un pourrait m’aider à améliorer ce script afin qu’il supprime automatiquement les fichiers vieux de plus de 7 jours ?