IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Sauvegarde MySQL et envoi par e-mail


Sujet :

EDI, CMS, Outils, Scripts et API PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Sauvegarde MySQL et envoi par e-mail
    Bonjour à tous,
    Je suis chez Online et je viens enfin de trouver un script qui à l'air de marcher chez eux, voici le code;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
     
    <?php
    //////////////////////////////////////////////////
    //////////////////////////////////////////////////
    //				  K20save v1.0					//
    // Auteur : K20		Email : kev.in@wanadoo.fr	//
    //         * Fichier de sauvegarde *			//
    //												//
    // Vous pouvez utilisez, modifiez, distribuer	//
    // 	 ce script à votre guise dans un but non	//
    //   commercial. Veuillez laisser cet en-tête	//
    //////////////////////////////////////////////////
    //////////////////////////////////////////////////
     
    // Include du fichier de configuration et du fichier de langue choisis //
    include ('config.php');
    include ('lang/'.$langue.'.php');
     
    // Départ chrono
    $temps_depart = getMicroTime();
     
    // Base de donnée informations
    $info_bdd = "--\n-- ".$lang['db']." : `$bdd`\n--\n\n";
    	if ($create_bdd == true)
    {
    $save = "--\n-- ".$lang['create_db']."\n--\nCREATE DATABASE `$bdd`;\n\n".$info_bdd;
    }
    	else
    {
    $save = $info_bdd;
    }
     
    // Connexion à la base de donnée et sélection de la base de donnée
    $connexion = mysql_connect($serveur,$login,$mdp) or die($lang['error_connexion']."<br />".mysql_error());
     
    // Sélection de la bdd
    mysql_select_db($bdd, $connexion) or die($lang['error_select']."<br />".mysql_error());
     
    // Selection de TOUTES les tables //
    $alltable = mysql_list_tables($bdd,$connexion);
     
    /////////////////////////////////////////////////////////////////
    // On effectue l'opération de sauvegarde sur toutes les tables //
    ////////////////////////////////////////////////////////////////
    $num = mysql_num_rows($alltable);
     
    	if (empty($num)) // Vérification  la présence d'au moins 1 table !
    {
    echo $lang['any_table'];
    exit(); // On arrête le script
    }
     
    for ($i = 0; $i < $num; $i++) 
    {
    $table = mysql_tablename($alltable, $i);
     
    // Supprimer la table si existante
    $qry_drop = 'DROP TABLE IF EXISTS `'.$table.'`;';
    // Importation de la structure de la table
    $qry_import_structure = 'SHOW CREATE TABLE `'.$table.'`';
    $result = mysql_query($qry_import_structure,$connexion) or die (mysql_error($connexion));
    $qry_create = mysql_fetch_row($result);
     
    // Importation des lignes de la table et construction de l'INSERT
    $qry_import_lignes = 'SELECT * FROM `'.$table.'`';
    $lignes = mysql_query($qry_import_lignes, $connexion) or die (mysql_error($connexion));
     
    // Nombres de champs
    $nbchamps = mysql_num_fields($lignes);
     
    // Ecriture de la table
    $save .= "\n--\n-- ".$lang['structure']." `$table`\n--\n\n";
    $save .= $qry_drop."\n";
    $save .= $qry_create[1].";\n\n";
    $save .= "--\n-- ".$lang['contents']." `$table`\n--\n\n";
     
    // Vérification de la présence d'au moins 1 enregistrement dans la table ! //
    $nb_save = mysql_num_rows($lignes);
    if (!empty($nb_save))
    	{
    	$save .= "INSERT INTO `$table`";
    	// Inscription des champs
    	$save .= ' (';
    	for($j = 0; $j < $nbchamps; $j++)
    			{
    			$save .= '`'.mysql_field_name($lignes, $j).'`';
    			// Continue ou termine la chaîne
    			if($j == ($nbchamps - 1))	$save .= ') ';
    			else			$save .= ', ';
    			}
    	// Génération des enregistrements
    	$save .= 'VALUES ';
    	while ($row = mysql_fetch_row($lignes))
            {
            if(isset($boucle_start)) { $save .= ",\n"; } else { $boucle_start = ''; }
            $values = '(\''.implode("','", array_map('mysql_real_escape_string', $row)).'\')';
            $save .= $values;
            $nb++;
            }
    $save .= ";\n";
    unset($boucle_start);
    	}
     
    // Si 0 enregistrement on l'affiche !	
    else {
    	 echo  $lang['any_data']." $table ...<br />"; // On l'affiche ...
    	 $save .= "--\n-- ".$lang['any_data']." `$table`\n--\n"; // On l'écrit dans le fichier
    	 }
    }
     
    // On ferme la connexion
    mysql_close($connexion);
     
    ////////////////////////////////////////////////////////////
    // Fin de l'opération de sauvegarde sur toutes les tables //
    ///////////////////////////////////////////////////////////
    // Date actuelle et temps
    $date = date("d-m-Y",time());
    $temps = round(getMicroTime() - $temps_depart,4);
     
    // Nom du fichier généré dynamiquement en fonction de la date
    $fichier = 'sauvegarde-'.$bdd.'-'.$date.'.sql';
     
    // Informations finales
    $save .= "\n--\n-- ".$lang['info']." \"$fichier\", $num table(s), $nb ".$lang['info2']." $temps s, date : $date\n--";
     
    /////////////////////////////////////////////////////////////////
    // Enregistrement de la base de donnée dans un fichier texte ! //
    /////////////////////////////////////////////////////////////////
     
    	// Création du fichier
        if (!$file = fopen("sauvegardes/".$fichier, 'w+')) 
    	{
        echo $lang['open_no'].$fichier;
        exit;
        }
     
        // Ecriture dans le fichier
        if (fwrite($file, $save) === FALSE) 
    	{
        echo $lang['write_no'].$fichier;
        exit;
        }
     
        echo $lang['write_success'];
     
    	// On ferme le fichier
    	fclose($file);              
     
    // Envoie d'un mail avec le fichier si demandé
    if ($send_mail == true)
    {
    // Construction de l'attachement
    $header .= "Content-Type: text/sql; name=\"$fichier\"\n";
    $header .= "Content-Transfer-Encoding: charset=iso-8859-1\n";
    $header .= "Content-Disposition: attachment; filename=\"$fichier\"\n\n"; 
    // Ouverture et lecture du fichier à attacher
    $file = fopen("sauvegardes/".$fichier, "r" );
    $contenu = fread( $file, filesize("sauvegardes/".$fichier));
    fclose($file); // Fermeture du fichier
    $header .= $contenu; // Introduction du fichier dans le mail
     
    mail($email,"Votre fichier de sauvegarde MySQL du $date","Votre fichier de sauvegarde !",$header); // Envoie du mail
    echo $lang['email']; // Message de succès
    }
     
    // On efface le fichier si demandé
    if ($del_sql == true and $send_email == true)
    {
    	if (unlink("sauvegardes/".$fichier) === FALSE)
    	{
    	echo $lang['no_del'].$fichier;
    	}
    	else
    	{
    	echo $lang['del'];
    	}
    }
    ?>
    Mon problème est que j'utilise le script mystats (génial) mais sa base de donnée est énorme (26Mo) et du coup j'ai une erreure:
    Warning: mail() [function.mail]: 552 5.3.4 Error: message file too big in k20save.php on line 162
    Ma question; est-il possible de lui demander de ne pas sauvegarder la table 'mystats'? ou peut-on lui demander de découper le fichier de sauvegarde avant envoie?
    Qu'en pensez-vous?

  2. #2
    Membre émérite
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 811
    Par défaut
    Bonjour,
    Essayes de t'orienter sur une autre méthode qui permettrait non pas d'envoyer le fichier par mail mais de le "compresser" sur le serveur et tu le récupères avec ton client FTP ou alors tu modifies le script que tu as posté de telle sorte qu'il se contente juste de sauvegarder mais pas d'envoyer par mail et n'oublies pas de supprimer les lignes qui suppriment le fichier à la fin.
    Tout de même, je reste sceptique quant au temps d'exécution de ce script avec une grande base de donnée. D'autre part, la méthode d'envoi par mail n'est pas très appropriée je pense.
    Le script est "fonctionnel" mais un petit conseil. Je ne connais pas l'hébergeur mais si tu as un cpanel, tu dois avoir une option qui te permet de récupérer la sauvegarde de ta base de données.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour kabkab et merci pour ton aide,
    Malheureusement je ne suis pas assez callé pour rentrer dans le code php...
    Cette méthode par mail me convient mieux et est je pense pour moi plus facilement utilisable (méthode cron)..
    Visiblement sur la page admin de mon compte online, ils ne proposent pas de solution toute faite pour des backup mysql..
    Sinon j'avais trouvé ça sur oscommerce:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <?
    //Informations : ce fichier contient les fonctions utilisées par le script autosauve
    //Pour toute information, éditer le fichier index.php contenu dans le même répertoire que ce fichier
     
    //fonction mail
    function mail_attach($to , $sujet , $message , $fichier , $typemime , $nom , $reply , $from)
      {
      $limite = "_parties_".md5(uniqid (rand()));
      $mail_mime = "Date: ".date("l j F Y, G:i")."\n";
      $mail_mime .= "MIME-Version: 1.0\n";
      $mail_mime .= "Content-Type: multipart/mixed;\n";
      $mail_mime .= " boundary=\"----=$limite\"\n\n";
     
      //Le message en texte simple pour les navigateurs qui n'acceptent pas le HTML
      $texte = "This is a multi-part message in MIME format.\n";
      $texte .= "Ceci est un message est au format MIME.\n";
      $texte .= "------=$limite\n";
      $texte .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
      $texte .= "Content-Transfer-Encoding: 32bit\n\n";
      $texte .= $message;
      $texte .= "\n\n";
     
      //le fichier
      $attachement = "------=$limite\n";
      $attachement .= "Content-Type: $typemime; name=\"$nom\"\n";
      $attachement .= "Content-Transfer-Encoding: base64\n";
      $attachement .= "Content-Disposition: attachment; filename=\"$nom\"\n\n";
      //$fd = fopen( $fichier, "r" );
      //$contenu = fread( $fd, filesize( $fichier ) );
      $fp = fopen($fichier, "rb");
      $buff = fread($fp, filesize($fichier));
      fclose($fp);
      $attachement .= chunk_split(base64_encode($buff));
     
      $attachement .= "\n\n\n------=$limite\n";
      return mail($to, $sujet, $texte.$attachement, "Reply-to:$reply\nFrom:$from\n".$mail_mime);
      }
     
     
     function backupDatabase($link , $db_name , $structure , $donnees , $format , $insertComplet="", $filename){
     /* Parametres :
      * $link : lien vers la base de donnees
      * $db_name : nom de la base de donnees
      * $structure : true => sauvegarde de la structure des tables
      * $donnees : true => sauvegarde des donnes des tables
      * $format : format des donnees ('INSERT' => des clauses SQL INSERT,
      * 'CSV' => donnees separees par des
    virgules)
      * $insertComplet (optionnel) : true => clause INSERT avec nom des
    champs
      */
     
      if (!is_resource($link))
      return false;
      mysql_select_db($db_name);
     
      $format = strtoupper($format);
     
      //$filename = "backup_".$db_name."_".date("Y_m_d").".sql";
      $fp = fopen($filename, "w");
      if (!is_resource($fp))
      return false;
     
      // liste des tables
      $res = mysql_list_tables($db_name, $link);
      $num_rows = mysql_num_rows($res);
      $i = 0;
      while ($i < $num_rows)
      {
      $tablename = mysql_tablename($res, $i);
      if ($structure === true)
      {
      fwrite($fp, "DROP TABLE IF EXISTS `$tablename`;\n");
      // requete de creation de la table
      $query = "SHOW CREATE TABLE $tablename";
      $resCreate = mysql_query($query);
      $row = mysql_fetch_array($resCreate);
      $schema = $row[1].";";
      fwrite($fp, "$schema\n\n");
      }
      if ($donnees === true)
      {
      // les données de la table
      $query = "SELECT * FROM $tablename";
      $resData = mysql_query($query);
      if (mysql_num_rows($resData) > 0)
      {
      $sFieldnames = "";
      if ($insertComplet === true)
      {
      $num_fields = mysql_num_fields($resData);
      for($j=0; $j < $num_fields; $j++)
      {
      $sFieldnames .= "`".mysql_field_name($resData, $j)."`, ";
      }
      $sFieldnames = "(".substr($sFieldnames, 0, -1).")";
      }
      $sInsert = "INSERT INTO `$tablename` $sFieldnames values ";
     
      while($rowdata = mysql_fetch_assoc($resData))
      {
      $lesDonnees = "<guillemet>".implode("<guillemet>,
    <guillemet>", $rowdata)."<guillemet>";
      $lesDonnees = str_replace("<guillemet>", "'",
    addslashes($lesDonnees));
     
      if ($format == "INSERT")
      {
      $lesDonnees = "$sInsert($lesDonnees);";
      }
      fwrite($fp, "$lesDonnees\n");
      }
      }
      }
      $i++;
      }
      fclose($fp);
    }
    ?>
    mais Online n'accepte pas la fonction 'mail_attach'...

Discussions similaires

  1. Réponses: 18
    Dernier message: 24/05/2013, 08h58
  2. Formulaire avec envoi par e-mail
    Par riboul dans le forum Langage
    Réponses: 1
    Dernier message: 14/06/2010, 16h13
  3. Réponses: 2
    Dernier message: 14/06/2010, 09h18
  4. [MySQL] Sauvegarde de base de données et envoi par e-mail
    Par lemirandais dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 11/01/2009, 21h27
  5. Envoi d'une base de données MySQL par e-mail
    Par Paulinho dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 27/12/2005, 00h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo