Sauvegarde d'une base mySql sur un ftp distant

Eléphant du PHP | 383 Messages

05 déc. 2005, 01:45

sans doute pas nouveau, mais bon... ce script permet de recuperer une base de donnee mySql ( ie : la structure des tables et les donnees ) et de les sauvegarder dans un format compressé sur un serveur ftp ( par exemple sur un compte free, maintenant qu'il y a moyen d'avoir de la place chez eux, ca fait un endroit reve pour des sauvegardes ). il y a beaucoup d'affichage inutile, ca permet de savoir ce qui se passe si le temps de traitement est long, mais rine d'indispensable.
<?php
/* paramètres de connexion à MySQL */
$host = 'localhost';
$user = '?';
$pass = '?';
$base = '?';
/* Paramètres de connexion au serveur FTP */
$serveur_ftp = "ftp.serveur.com";
$usager_ftp  = "?";
$mdp_ftp     = "?";
$repertoire  = "?";

mysql_connect($host, $user, $pass);

/* recuperation de la liste des tables */
$liste = mysql_list_tables($base);
$resultat1 = "#dump de la base ". $base ." généré le ".date("l j F Y ")." à ". date("H:i") ."\r\n#creation des tables\r\n";
$resultat2 = "#insertion des donnees\r\n";

while($table = mysql_fetch_array($liste)) //pour chaque table
{
    $table = $table[0];
    echo "<br>traitement de la table : $table<br>";
    echo "structure<br>";
    $resultat1.="#structure de la table '". $table ."'\r\n";
    $struct = mysql_db_query($base, "show create table ". $table ."");//schema de creation de la table
    $tab = mysql_fetch_array($struct);
    $resultat1 .= $tab[1].";\r\n";
    $donnee = mysql_db_query($base, "select * from ". $table ."");//donnee dans la table
    $n = mysql_num_fields($donnee);
    echo "insertion<br>";
    $resultat2.="#insertion dans la table ". $table ."\r\n";
    while($r=mysql_fetch_array($donnee))
    {
        $insert="insert into ". $table ." values (";
        for ($i = 0; $i < $n; $i++)
        {
            $insert .= "'". mysql_real_escape_string($r[$i]) ."', ";
        }
        $insert = substr($insert, 0, -2) .");\n"; // suppression du dernier " ," superflu
        $resultat2 .= $insert;
    }
    $resultat2 .= "\r\n";
}
// echo str_replace("\n","<br>",$resultat1.$resultat2);//debug : affichage du resultat
echo "<br>création du fichier compressé<br>";
/* nom du fichier + date et heure */
$filename = "BDD_". date("dmY-Hi") .".gz";
/* création du fichier compressé en précisant un degré de compression */
$g = gzopen($filename, "wb9");
if(false == $g)
{
    echo "erreur de creation de l'archive";
}
else
{
    gzwrite($g, $resultat1 . $resultat2);
    gzclose($g);
    echo "connection au serveur ftp<br>";
    /* Connexion au serveur ftp */
    $f = ftp_connect($serveur_ftp);
    /* Identification auprès du serveur ftp */
    ftp_login($f, $usager_ftp, $mdp_ftp);
    /* On se place dans le bon répertoire */
    ftp_chdir($f, $repertoire);
    echo "envoi de l'archive<br>";
    /* On copie l'archive */
    ftp_put($f, $filename, $filename, FTP_BINARY);
    /* Fermeture de la connexion */
    ftp_close($f);
    /* Suppression du fichier original */
    unlink($filename);
    echo "terminé";
}
?>
Modifié en dernier par jobherzt le 07 déc. 2005, 12:17, modifié 3 fois.

Mammouth du PHP | 19672 Messages

05 déc. 2005, 08:31

Intéressant : toutefois, je m'interroge sur la dernière ligne: Est-ce que
$echo "terminé";
Ne devrais pas être :
echo "terminé";
:?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 383 Messages

05 déc. 2005, 09:30

oooooops....:o :o :o :o

va savoir pourquoi, c'est une erreur d'etourderie que je fais souvent, et uniquement avec echo.. je ne sais pas d'ou ca me vient... probablement a force de commencer la moitie de mes lignes par $, et vu qu'echo est une fonction que je tape machinalement, contrairement aux autres ou je suis plus attentifs aux parametres.

je corrige .... :oops:

Eléphant du PHP | 299 Messages

17 déc. 2005, 17:11

Trop bien ce script :) Merci beaucoup :)

Eléphant du PHP | 383 Messages

17 déc. 2005, 18:02

dans la mesure ou ce post ne demarrait pas sur un probleme, je trouve que la balise [resolu] fait un peu tache... :D je me permet de l'enlever..

@pirquessa : c'est un plaisir !

Eléphant du PHP | 299 Messages

17 déc. 2005, 18:45

Je viens de l'adapter pour pouvoir faire la sauvegarde des bases de données de mes deux sites, vraiment, ca marche bien. Du bon boulot :)

Eléphant du PHP | 383 Messages

17 déc. 2005, 18:49

:oops: n'en jetez plus ...

content que ca serve ! :)

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

17 déc. 2005, 19:08

Pour ceux qui ont un serveur dédié par contre, une tache planifiée (cron) avec un petit script de ce type sera plus avantageux. Encore faut-il avoir un serveur dédié...

Mammouth du PHP | 1311 Messages

17 déc. 2005, 19:12

salut
voici une classe qui pourrai de donner des idées jobherzt si tu veut continuer a developper ton code
http://www.developpez.net/forums/viewto ... &start=105
http://www.iopla.com/files/mysqlHelper.zip