Page 1 sur 1

Dump SQL

Posté : 01 juil. 2008, 11:08
par CyberTaf
Bonjour.

J'ai trouvé sur le web un script PHP qui permets de faire un dump d'une base de données.
<?php

$db_base = "_nomdelabase";

header("Pragma: no-cache");
header("Content-Type: application/x-gzip; name=\"$db_base.sql.gz\"");
header("Content-Disposition: attachment;filename=\"$db_base.sql.gz\"");
header("Content-Transfer-Encoding: binary");

echo gzencode("--\n");
echo gzencode("-- Dump de la base $db_base\n");
echo gzencode("--\n");

$sql_tables = "SHOW TABLES";
$req_tables = mysql_query($sql_tables);
while (list($table) = mysql_fetch_row($req_tables)) {
   echo gzencode("\n--\n-- Table $table\n\n");
   echo gzencode("DROP TABLE IF EXISTS $table;\n");
   $sql_create_table = "SHOW CREATE TABLE $table";
   $req_create_table = mysql_query($sql_create_table);
   $create_table = mysql_fetch_array($req_create_table);
   echo gzencode($create_table[1].";\n");
   echo gzencode("\n--\n-- Remplissage de $table\n\n");
   $sql_fill_table = "SELECT * FROM $table";
   $req_fill_table = mysql_query($sql_fill_table);
   while ($row = mysql_fetch_assoc($req_fill_table)) {
      $line_insert = "INSERT INTO $table (";
      $l_value = ") VALUES (";
      foreach ($row as $field => $value) {
         $line_insert .= "`$field`, ";
         $l_value .= "'".mysql_real_escape_string($value)."', ";
      }
      $line_insert = substr($line_insert, 0, -2);
      $l_value = substr($l_value, 0, -2);
      echo gzencode($line_insert.$l_value.");\n");
   }
}

mysql_close();

?>
Ce script est très pratique, mais il génère un fichier .SQL assez lourd car il fait des insertions complètes du style
INSERT INTO `table` (blablabla) VALUES(blablabla);
INSERT INTO `table` (blablabla) VALUES(blablabla);
INSERT INTO `table` (blablabla) VALUES(blablabla);
...
Je souhaiterai qu'il fasse des insertions étendues du style
INSERT INTO `table` VALUES
(blablabla),
(blablabla),
(blablabla),
...
J'ai essayé de modifier le script en question, mais je crois que ça dépasse un peu mes compétences :(
Donc si quelqu'un peut m'aider ou connait le script que je recherche, ce serait sympa.
D'avance merci :wink:

Posté : 01 juil. 2008, 12:37
par Calimero
Hello,

Tu as l'outil en ligne de commande mysqldump (fourni avec mysql) qui, avec quelques paramètres, fera exactement ce que tu veux. Pourquoi ne pas l'utiliser ?

Tu peux utiliser la fonction php passthru() pour l'éxécuter et en afficher directement le résultat.

Posté : 01 juil. 2008, 12:44
par Hywan
Hey :),

Au plus directement avec la commande mysql :

Code : Tout sélectionner

mysql -h … -u … --password=… > dump.sql
Si mes souvenirs sont bons, ça devrait marcher ;-).

Sinon, voici la documentation pour mysqldump.

Et pour modifier ton script, ce n'est pas si difficile. Le code concerné est :
  while ($row = mysql_fetch_assoc($req_fill_table)) { 
      $line_insert = "INSERT INTO $table ("; 
      $l_value = ") VALUES ("; 
      foreach ($row as $field => $value) { 
         $line_insert .= "`$field`, "; 
         $l_value .= "'".mysql_real_escape_string($value)."', "; 
      } 
      $line_insert = substr($line_insert, 0, -2); 
      $l_value = substr($l_value, 0, -2); 
      echo gzencode($line_insert.$l_value.");\n"); 
   }
Amuse à regarder le contenu de chaque variable via var_dump(). Tu devrais vite comprendre comment ça marche.

Posté : 01 juil. 2008, 13:09
par CyberTaf
Merci pour vos réponses.
J'avais déjà tenté mysqldump mais la fontion system() est désactivée chez mon hébergeur.
Et pour modifier ton script, ce n'est pas si difficile. Le code concerné est :
Oui, jusque-là c'est bon...
Mais je ne suis pas arrivé à modifier le script en conséquence.
Je vais regarder var_dump() comme tu le dis pour voir si ça m'éclaire un peu.

EDIT (Piaf):

Bon, j'y suis finalement arrivé !
Suffisait juste que je me creuse un peu la tête:
<?php

// Connexion à MySql

$db_base = "nomdelabase";

header("Pragma: no-cache");
header("Content-Type: application/x-gzip; name="$db_base.sql.gz"");
header("Content-Disposition: attachment;filename="$db_base.sql.gz"");
header("Content-Transfer-Encoding: binary");

echo gzencode("--\n");
echo gzencode("-- Dump de la base $db_base\n");
echo gzencode("--\n");

$sql_tables = "SHOW TABLES";
$req_tables = mysql_query($sql_tables);
while (list($table) = mysql_fetch_row($req_tables)) {
   echo gzencode("\n--\n-- Table $table\n\n");
   echo gzencode("DROP TABLE IF EXISTS $table;\n");
   $sql_create_table = "SHOW CREATE TABLE $table";
   $req_create_table = mysql_query($sql_create_table);
   $create_table = mysql_fetch_array($req_create_table);
   echo gzencode($create_table[1].";\n");
   echo gzencode("\n--\n-- Remplissage de $table\n\n");
   $sql_fill_table = "SELECT * FROM $table";
   $req_fill_table = mysql_query($sql_fill_table);

$req_fin = mysql_query ( " SELECT COUNT(*) FROM $table " );
$fin = mysql_fetch_row($req_fin);

if ( $fin['0'] != 0 ) {
  $test = 1;
  echo gzencode("INSERT INTO $table VALUES\n");

   while ($row = mysql_fetch_assoc($req_fill_table)) {
      $l_value = "(";
      foreach ($row as $field => $value) {
         $line_insert = "`$field`, ";
         $l_value .= "'".mysql_real_escape_string($value)."', ";
      }
      $l_value = substr($l_value, 0, -2);

      echo gzencode($l_value.")");
      
      if ( $test == $fin['0'] ) {
        echo gzencode(";\n"); }
        else {
        echo gzencode(",\n");
        $test++; }
   }
  }
}
mysql_close();

?>
Merci pour vos réponses.