sauvegarde auto de basedo via robot

Répondre
nygma
le 20/11/2004 à 16:43
nygma
Salut !

j'ai un robot qui tourne le matin, sur mon site, et je voudrais bien sauver ma base tous les jours...
quelqu'un sait ce qu'il faut mettre comme script dans le batch ? du php ?

Nexen n'est pas très explicite sur la façon dont ça fonctionne...

Merci.
moogli
le 20/11/2004 à 17:25
moogli
SAlut,

tu peut utiliser mysqldump
our te faire un script :
il faut que tu utilise les fonctions show tables, et describe de mysql afin d'avoir le nom des tables et les champ (ainsi que les structure de table ...)

je suis sympa je t'en donne tout fait :
<?php
/***************************************/
/* Fait par moogli le 17/011/2004 */
/* e-mail : moogli_gl@yahoo.fr */
/* Utilitaire dump de bdd */
/***************************************/
$nom_base="";//tu a juste a rentrer ici le nom de la base a sauvegarder!
$table_sql="Tables_in_".$nom_base;
$base = mysql_connect('localhost','root','');
mysql_select_db($nom_base,$base);
//on essai d'avoir toute les tables
$sql = 'SHOW TABLES';
$req = mysql_query($sql) or die ('Erreur sql :'.mysql_error());
$nb_table = mysql_num_rows($req);
//$table=array(array());
//REcupe des noms des tables
while ($data = mysql_fetch_object($req))
{
$table[$data->$table_sql]='';
}
//On a le nom de toute les tables il faut maintenant créer un fichier avec les requetes qui vont avec
//print_r($table);
mysql_free_result($req);

foreach ($table as $nom_table => $champ)
{
//On parcour $table pour avoir la descriptoin de chaque table
$sql_des = 'DESCRIBE '.$nom_table;
$req_des = mysql_query($sql_des) or die ('Erreur sql lors de la description des table :'.mysql_error());
while ($data = mysql_fetch_object($req_des))
{
$table[$nom_table][$data->Field]['Type']=$data->Type;
$table[$nom_table][$data->Field]['Null']=$data->Null;
$table[$nom_table][$data->Field]['Key']=$data->Key;
$table[$nom_table][$data->Field]['Default']=$data->Default;
$table[$nom_table][$data->Field]['Extra']=$data->Extra;
}
mysql_free_result($req_des);

}
//On a la structure de toute les tables on va (pour l'instant) afficher la requete de création de la table avec commentaire avant pour dire le nom de la table :)
//On crée nom de fichier apartir du nom de la base et time stamp pour éviter de niquer u autre fichier
$nom_fichier = $nom_base.'_'.date("U").'.sql';
//Ouverture du fichier
$fp = fopen($nom_fichier,"wb");//création du fichier s'il n'existe pas
//Définition des entetes
$comment_head = '-------------------------------------------------
--
-- Utilitaire de dump de base MySQL (V 1.0)
-- par Moogli => moogli_gl@yahoo.fr
--
-- Base de donnée : '.$nom_base.'
-- Cette base contient '.$nb_table.' table(s).
-- Fichier crée le '.date("d/m/Y").' à '.date("H:i:s")."\n---------------------------------------------------\n\n";
//On met l'entete dans le fichier
fputs($fp,$comment_head);
//$comment_table = "--Struture de la table :";
$i=0;
foreach ($table as $nom_table => $champ)
{
//print_r($champ);
//pour chaque table nom de la table=> $nom_table, nom des champ $champ[]
$structure = 'CREATE TABLE `'.$nom_table.'` (
';
foreach ($champ as $nom_champ=> $value) {
// $clef contient type, null,key,default,extra
$structure.= '`'.$nom_champ.'` '.$champ[$nom_champ]['Type'];
if ($champ[$nom_champ]['Null'] == "") {
$structure .= ' NOT NULL ';
}
else {
$structure .= ' NULL ';
}
$structure .= ' default \''.$champ[$nom_champ]['Default'].'\'';
if ($champ[$nom_champ]['Extra'] != "") $structure .= ' '.$champ[$nom_champ]['Extra'];
$structure .= ',
';
if ($champ[$nom_champ]['Key']=='PRI') $prim_key = $nom_champ;
if ($champ[$nom_champ]['Key']=='KEY') $key .= $nom_champ.',';
$list_champ[$nom_table][]=$nom_champ;
}
//On a presque tout fait on verifie s'il y a ue clef primaire
if (isset($prim_key) && $prim_key!="")
{
$structure .= " PRIMARY KEY (`'.$prim_key.'`)\n";
}
else {
$tructure = substr($structure,0,strlen($struture)-1);//enlève la vigule dû au dernier champ
}
if (isset($key) && $key != '')
{
$tab = explode(',',$key);
foreach($tab as $clef)
{
if ($clef!="") {
$struture .= ",\nKEY (`$clef`)\n";
}
}
}
$structure .= ") TYPE=MyISAM;\n\n";
$structure_table[$nom_table]=$structure;
//recupe de infos a insérer de la table en cours

$sql_sel = 'SELECT * FROM '.$nom_table;
$req_sel = mysql_query($sql_sel) or die ('Erreur selection (pour insert) => '.mysql_error());
if (mysql_num_rows($req_sel)!= 0) {
//On a des données dans la table !
while ($data = mysql_fetch_object($req_sel))
{
$in = 'INSERT INTO '.$nom_table.' VALUES(';
$nb = count($list_champ[$nom_table]);
foreach ($list_champ[$nom_table] as $valeurduchamp)
{
--$nb;
if ($nb !=0){
$in .= '"' . $data->$valeurduchamp .'", ';
}
else {
$in .= '"' . $data->$valeurduchamp .'" ';
}
}
$in .= ");";
$insert[$nom_table][]=preg_replace("/(.)?\\n/","\\r\\n",$in);
//$insert[$nom_table][]=$in;
}
}
else {
//On a aucun tuple on insert dans la table un champ vide
$insert[$nom_table][] = '';
}
mysql_free_result($req_sel);
//Insertion dans le fichier de la structure de la tables ainsi que des données.
$pointille = "-------------------------------------------------";
$comment_table = "--\n--Struture de la table : $nom_table\n--\n\n";
//Insertion dans le fichier de la structure de la table et des info
//Nom de la table
fputs($fp,$comment_table);
//structure de la table
fputs($fp,$structure.'
');
//Contenu de la table
$contenu = "--\n--Contenu de la table :$nom_table\n--\n\n";
$contenu .= join("\n",$insert[$nom_table])."\n$pointille\n";

fputs($fp,$contenu); //addslashes() ?

}
fclose($fp);
mysql_close();
/*
//ne sert que pour les tests
//On met un lien vers le fichier
echo '<a href="./',$nom_fichier,'" target="_blank">Voir le fichier créé ?</a>';
*/
?>


Voila tu peut appeler sa avec une tache cron si ton hébergeur te le permet ou tu te fait truc qui au chargement vérifie s'il faut faire la sauvegarde de la base (pas core fait désolé ...). Il te fait juste un fichier dans lequelle tu met le timestamp (ou date c'est toi qui voit) de l adate ou tu doit faire le save, pis un p'tit if pour comprait le timestamp du fichier et celui actuel !

voila fait bien joujou avec, la suite la semaine prochaine .

je demande juste de laisser l'entête si tu file le script a quelqu'un (meme pour toi !) merci.

Si y a des souci (devrait pas y en avoir sa tourne chez moi) envoie moi un mail (pour éviter que j'oublie le post) avec les erreurs (message ligne ..). je réponderais avant vendredi prochain (du moins jespère :) )

smiley

[Message modifié le 20/11/2004 à 18:36 par LA GLOBULE]
Il en faut peu pour être heureux !!!!!
moogli
le 20/11/2004 à 17:26
moogli
re,

désolé j'ai oublie le / dans la dernière balise smiley

avis ou 1er modo / admin qui passe merci
smiley
Il en faut peu pour être heureux !!!!!
Yumi
le 20/11/2004 à 18:48
Yumi
Script très intéressant et très utile tu devrais le mettre dans tes coulers Glob !
smiley
Si vous savez pas quoi faire, visitez mon site :wink:
moogli
le 26/11/2004 à 02:44
moogli
salut,

dans les quoi ??? smiley

Merci bien :)

a l'utilisation j'ai remarqué un p'tit souci (po grand chose) mais les ' et " qui sont dans la base fon merder la requete si tu insère directement dans phpmyadmin (s'il sont échapper ( \") par exemple !
donc un p'tit preg_replace dans le dernier foreach juste avant $in .= ... (en remplacant la variable a la fin de la ligne indiqué);

Voila une V1.1 :) dans laquel j'ai inclus ce dont je parle. Cette version a une tite interface graphique qui te demande les host, log, mdp de connection et le nom de la base a sauvegarder ! ceci t'est sert inutile dans le cas ou tu veut automatiser la chose mais c'été pour me faire plaisir :)
(Le code posté par ce membre étant trop long, il a été automatiquement inséré dans le wall. Pour le voir, veuiller clicker sur [lien=http://www.lephpfacile.com/wall/lire_wall.php?wall=1859]ce lien[/lien])

smiley
Il en faut peu pour être heureux !!!!!
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours