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 :) )
[Message modifié le 20/11/2004 à 18:36 par LA GLOBULE]