Pb lors de la sauvegarde de ma base de données

Petit nouveau ! | 1 Messages

22 janv. 2010, 16:31

Bonjour

J'ai un petit script qui me permet de sauvegarder ma base de données. Il fonctionne bien, je retrouve bien toutes mes tables mais par contre dans chaque table il double mes enregistrements. Exemple dans ma table comptage toutes les colonnes apparaissent deux fois

CREATE TABLE `comptage` ( `id_compte` int(11) NOT NULL auto_increment, `id_membre` int(11) NOT NULL, `N_VAC` int(11) NOT NULL COMMENT 'id de la vac', `compte_V` int(11) NOT NULL, `compte_Vf` int(11) NOT NULL, `compte_Vtt` int(11) NOT NULL, `compte_A` int(11) NOT NULL, `compte_1ere` int(11) NOT NULL, `compte_2eme` int(11) NOT NULL, `compte_dodo` int(11) NOT NULL, `compte_repas` varchar(100) NOT NULL, `compte_courses` varchar(100) NOT NULL, `compte_jour` int(11) NOT NULL, `compte_mois` int(11) NOT NULL, `compte_annee` int(11) NOT NULL, `vacances_V` int(11) NOT NULL, `vacances_V1` int(11) NOT NULL, `vacances_Vtt` int(11) NOT NULL, `vacances_Vf` int(11) NOT NULL, `vacances_Vf1` int(11) NOT NULL, PRIMARY KEY (`id_compte`)) ENGINE=MyISAM AUTO_INCREMENT=640 DEFAULT CHARSET=latin1;

INSERT INTO comptage VALUES ('1', '1', '2', '2', '2', '2', '0', '0', '0', '0', '0', '0', '3', '3', '0', '0', '0', '0', '1', '1', 'colombon', 'colombon', '', '', '12', '12', '12', '12', '2008', '2008', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
INSERT INTO comptage VALUES ('2', '2', '3', '3', '2', '2', '0', '0', '0', '0', '3', '3', '0', '0', '0', '0', '0', '0', '0', '0', 'colombon', 'colombon', '', '', '12', '12', '12', '12', '2008', '2008', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');

Voici mon script si quelqu'un peux m'aider merci d'avance
function mysqlBackUp($folder){
  $host = "ServerName";
$user = "Utilisateur";
$pass = "MotDePasse";
$base = "BaseDeDonnees";

  
  mysql_connect($host, $user, $pass) or die ("Impossible d'établir la connexion au serveur de base de données !");
  mysql_select_db($base) or die ("Impossible de se connecter à la base de données !");
  $lesTables = mysql_list_tables($base);
  while($donnees = mysql_fetch_array($lesTables)){
    $uneTable = $donnees[0];//nom des tables
       $req = mysql_query("SHOW CREATE TABLE ".$uneTable);
    if($req){
      $res = mysql_fetch_array($req);
      $res[1] .= ";"; //descriptif de toutes les tables
     $SQL[] = str_replace("\n", "", $res[1]);
	
     $req = mysql_query("SELECT * FROM ".$uneTable);
	 echo '<br>';
      $INSERT = '';
      while($res = mysql_fetch_array($req)){
         $INSERT .= "INSERT INTO ".$uneTable." VALUES (";
		  
        foreach($res as $cle => $valeur){
          $INSERT .= "'".mysql_real_escape_string($valeur)."', ";
        }
        $INSERT = substr($INSERT, 0, -2);
        $INSERT .= ");\n";
      }
      if(isset($INSERT)){
        $SQL[] = $INSERT;
      }
    }
  }
  $SQL = implode("\r", $SQL);
  $file = "BACKUPSQL_".$base."[".date("Ymd-His")."].sql";
  file_put_contents($folder.$file, $SQL);
  return "BackUp ok - <a href='".$folder.$file."'>".$file."</a>";
}
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 janv. 2010, 12:27

C'est parce que tu utilises la fonction mysql_fetch_array().

Cette fonction combine les fonction mysql_fetch_row (qui te retourne un tableau indexé) et mysql_fetch_assoc (qui te retourne un tableau associatif). Du coup, chaque valeur est présente deux fois dans ton tableau $res (si tu fais un va_dump, tu devrais obtenir un truc du genre array (1 => valeur, clef => valeur)). Du coup ton foreach s'éxécute pour chacun et ajoute ta valeur deux fois :)

Utilises mysql_fetch_assoc() ou mysql_fetch_row() en fonction de ton besoin :)
(avec une préférence pour le premier qui ne dépend pas de l'ordre des champs, et qui est plus facile à maintenir : $row['id_enregistrement'] contiendra vraissemblablement l'id de l'enregistrement, tandis que $row[27] contiendra... ben le truc qui sera à la position 27 soit dans l'ordre des champs de la requête soit dans celui de la table :))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...