Avatar billede jaw Nybegynder
06. juli 2004 - 15:14 Der er 15 kommentarer og
1 løsning

Mysql dump af PHP

Hey !

Er det muligt at lave et dump af en tabel i sin database med PHP (må ikke være vha. PHPMyAdmin og lign.).

Har set lidt rundt omkring, men synes ikke noget af det jeg kan finde virke...

/Jaw
Avatar billede jaw Nybegynder
06. juli 2004 - 15:42 #1
Jeg laver selv en udfra dette: http://dk.php.net/manual/en/ref.mysql.php og håber det kan lade sig gøre :)
Avatar billede jaw Nybegynder
06. juli 2004 - 16:25 #2
Jeg vil lukke, og smide hvad jeg når frem til senere :) For det ser faktisk ud til ikke at blive så tosset...
Avatar billede jaw Nybegynder
06. juli 2004 - 18:33 #3
Som lovet! Her er hvad jeg er kommet frem til. Det er ikke 100% testet, og virker sikkert heller ikke 100% (bl.a. er der nok noget med keys!).

<?
include("connect.php");

$table = "table";

echo "DROP TABLE IF EXISTS `" . $table . "`;<br>";
echo "CREATE TABLE `" . $table . "` (<br>";
$query="DESC $table";
$results=mysql_query($query);

while ($row=mysql_fetch_array($results))
{
if($row[2] == "YES") {
    $null = "default NULL";
} else {
    $null = "NOT NULL default '" . $row[4] . "'";
}
if($row[3] == "PRI") {
    $key = $row[0];
}
echo "&nbsp; &nbsp;" . $row[0] . " " . $row[1] . " " . $null . " " . $row[5] . ",<br>";
}
echo"UNIQUE KEY `" . $key . "`<br>";
echo ") TYPE=MyISAM;";

echo"<br><br>";

$q = mysql_query("SELECT * FROM $table ORDER BY $key ASC");
$antal = mysql_num_fields($q);
$antal = $antal - 1;

while($row = mysql_fetch_array($q)) {
    echo "INSERT INTO `" . $table . "` VALUES (";
    for($i = 0; $i <= $antal; $i++) {
        if($i == $antal) {
            echo "'$row[$i]'";           
        } else {
            echo "'$row[$i]', ";
        }
    }
    echo ");<br>";
}


?>
Avatar billede martinbk Nybegynder
06. juli 2004 - 20:52 #4
selv om du har fundet en løsning vil jeg nu alligevel lige poste "my 10 cent" :)

<?
$dbhost = "localhost";
$dbuname = "root";
$dbpass = "";
$dbname = "";
#%% Backup function
  // det kan jo godt tage lidt tid på en større DB
  @set_time_limit(600);
  $strNoTablesFound = "Ingen databasetabeller fundet";
  $strHost = "Host";
  $crlf="\n";
  $strDatabase = "Database ";
  $strTableStructure = "Struktur for tabel";
  $strDumpingData = "Indhold af tabel";
  $strError = "Fejl";
  $strSQLQuery = "SQL-query";
  $strMySQLSaid = "MySQL: ";
  $strBack = "Tilbage";
  $strFileName = "Backup";
  $strName = "Backup af database";
  $strDone = "Downloadet d.";
  $strat = "kl.";
  $date_jour = date ("d-m-Y");

  header("Content-disposition: filename=$strFileName $dbname $date_jour.sql");
  header("Content-type: application/ms-download");
  header("Pragma: no-cache");
  header("Expires: 0");

  $client = getenv("HTTP_USER_AGENT");
  if(ereg('[^(]*\((.*)\)[^)]*',$client,$regs))
  {
    $os = $regs[1];
    if (eregi("Win",$os))
      $crlf="\r\n";
  }


  function my_handler($sql_insert)
  {
    global $crlf;
    echo "$sql_insert;$crlf";
  }

  function get_table_content($db, $table, $handler)
  {
    $result = mysql_db_query($db, "SELECT * FROM $table") or mysql_die();
    $i = 0;
    while($row = mysql_fetch_row($result))
    {
      $table_list = "(";

      for($j=0; $j<mysql_num_fields($result);$j++)
                    $table_list .= mysql_field_name($result,$j).", ";

      $table_list = substr($table_list,0,-2);
      $table_list .= ")";

      if(isset($GLOBALS["showcolumns"]))
        $schema_insert = "INSERT INTO $table $table_list VALUES (";
      else
        $schema_insert = "INSERT INTO $table VALUES (";

      for($j=0; $j<mysql_num_fields($result);$j++)
      {
        if(!isset($row[$j]))
          $schema_insert .= " NULL,";
        elseif($row[$j] != "")
          $schema_insert .= " '".addslashes($row[$j])."',";
        else
          $schema_insert .= " '',";
      }
      $schema_insert = ereg_replace(",$", "", $schema_insert);
      $schema_insert .= ")";
      $handler(trim($schema_insert));
      $i++;
    }
    return (true);
  }

  function get_table_def($db, $table, $crlf)
  {
    $schema_create = "";
    $schema_create .= "DROP TABLE IF EXISTS $table; CREATE TABLE $table ($crlf";

    $result = mysql_db_query($db, "SHOW FIELDS FROM $table") or mysql_die();
    while($row = mysql_fetch_array($result))
    {
      $schema_create .= "  $row[Field] $row[Type]";

      if(isset($row["Default"]) && (!empty($row["Default"]) || $row["Default"] == "0"))
        $schema_create .= " DEFAULT '$row[Default]'";
      if($row["Null"] != "YES")
        $schema_create .= " NOT NULL";
      if($row["Extra"] != "")
        $schema_create .= " $row[Extra]";
      $schema_create .= ",$crlf";
    }
    $schema_create = ereg_replace(",".$crlf."$", "", $schema_create);
    $result = mysql_db_query($db, "SHOW KEYS FROM $table") or mysql_die();
    while($row = mysql_fetch_array($result))
    {
      $kname=$row['Key_name'];
      if(($kname != "PRIMARY") && ($row['Non_unique'] == 0))
        $kname="UNIQUE|$kname";
      if(!isset($index[$kname]))
        $index[$kname] = array();
      $index[$kname][] = $row['Column_name'];
    }

    while(list($x, $columns) = @each($index))
    {
      $schema_create .= ",$crlf";
      if($x == "PRIMARY")
        $schema_create .= "  PRIMARY KEY (" . implode($columns, ", ") . ")";
      elseif (substr($x,0,6) == "UNIQUE")
        $schema_create .= "  UNIQUE ".substr($x,7)." (" . implode($columns, ", ") . ")";
      else
        $schema_create .= "  KEY $x (" . implode($columns, ", ") . ")";
    }

    $schema_create .= "$crlf)";
    return (stripslashes($schema_create));
  }

  function mysql_die($error = "")
  {
    echo "<b> $strError </b><p>";
    if(isset($sql_query) && !empty($sql_query))
    {
      echo "$strSQLQuery: <pre>$sql_query</pre><p>";
    }
    if(empty($error))
      echo $strMySQLSaid.mysql_error();
    else
      echo $strMySQLSaid.$error;
    echo "<br><a href=\"java script:history.go(-1)\">$strBack</a>";
    exit;
  }
      global $bruger, $dbhost, $dbuname, $dbpass, $dbname;
  mysql_connect($dbhost, $dbuname, $dbpass);
  @mysql_select_db("$dbname") or die ("Kunne ikke forbinde til databasen");

  $tables = mysql_list_tables($dbname);

  $num_tables = @mysql_numrows($tables);
  if($num_tables == 0)
  {
    echo $strNoTablesFound;
  }
  else
  {
    $i = 0;
    $heure_jour = date ("H:i");
    print "# ========================================================$crlf";
    print "#$crlf";
    print "# $strName : $dbname$crlf";
    print "# $strDone $date_jour $strat $heure_jour $crlf";
    print "#$crlf";
    print "# ========================================================$crlf";
    print "$crlf";

    while($i < $num_tables)
    {
      $table = mysql_tablename($tables, $i);

      print $crlf;
      print "# --------------------------------------------------------$crlf";
      print "#$crlf";
      print "# $strTableStructure '$table'$crlf";
      print "#$crlf";
      print $crlf;

      echo get_table_def($dbname, $table, $crlf).";$crlf$crlf";

      print "#$crlf";
      print "# $strDumpingData '$table'$crlf";
      print "#$crlf";
      print $crlf;

      get_table_content($dbname, $table, "my_handler");

      $i++;
    }
  }
?>
Avatar billede jaw Nybegynder
07. juli 2004 - 00:39 #5
Den er i hvert fald noget større end min :) Min er også "kun" udviklet til 2 specielle dumps, så det kommer ikke sååååå nøje med alle mulige andre former for unik, primary og hvad der ellers er. Og som princip synes jeg man bør poste hvad man har fundet ud af, derfor gjorde jeg det :)
Avatar billede martinbk Nybegynder
07. juli 2004 - 10:17 #6
well min model er en helt generel dump af en hvilken som helst tabel, genereret først med tabelstruktur og derefter med indhold, den er nu meget rar i mange situationer
Avatar billede learner Praktikant
31. marts 2005 - 20:03 #7
martinbk, Kan jeg trygt benytte det script du poster herover?

Learner
Avatar billede jaw Nybegynder
31. marts 2005 - 20:05 #8
Har du ikke phpMyAdmin på den server du bruger? Så kan du jo tage en manuel backup først og så afprøve scriptet...

:)
Avatar billede learner Praktikant
31. marts 2005 - 20:13 #9
Jo, det har du helt ret i :o)

Men hvordan skal man lige sammelnligne ?
Der er k´jo ret mange linier...

Hvordan bruger du scriptet mere præcist?
Manuelt eller sender du backup'en til din mail eller hvad?
Laver du en ugentlig backup eller hvad?
Avatar billede jaw Nybegynder
31. marts 2005 - 20:15 #10
Jeg bruger det egentlig ikke. Og den nemmeste sammenligning må vel være bare at finde et program der kan vise linie-numre, eller måske bare se om størrelsen af de 2 filer er identiske...
Avatar billede learner Praktikant
31. marts 2005 - 20:19 #11
Og......
er det eneste jeg skal ændre ik den her del :

$dbhost = "localhost";
$dbuname = "root";// Hvad er det????
$dbpass = "";
$dbname = "";
Avatar billede jaw Nybegynder
31. marts 2005 - 20:21 #12
Tjoh, er det sikkert nok. Prøv først og spørg hvis det ikke virker :)

Root er brugernavnet - og standardbrugernavnet i en database.
Avatar billede learner Praktikant
31. marts 2005 - 20:29 #13
Jeg har prøvet nu, og det virker jo rigtig fint umiddelbart.
Jeg kunne dog godt tænke mig at det kørte helt automatisk på en måde, men det er nok mere omfattende og er måske usikkert sikkerhedsmæssigt..

Jeg takker for scriptet :o)
Avatar billede jaw Nybegynder
31. marts 2005 - 20:35 #14
Kører det på din egen server? Hvis det gør, så kan du lave et cron-job der kører det automatisk. Det kan du også selvom det ikke er din egen server, men det er lidt mere trickset...
Avatar billede learner Praktikant
31. marts 2005 - 21:12 #15
Jeg har det ved en udbyder (B-one)

Kan man det??? Det lyder umiddelbart som om at det er mere egnet.
Ved du hvor jeg kan læse om hvordan jeg gør?
Avatar billede jaw Nybegynder
31. marts 2005 - 22:14 #16
Næh, egentlig ikke... Jeg har hos min udbyder et administrationssystem der hedder "Cpanel" der indeholder et Cron-modul. Dog er det ikke sådan lige til at få den til at eksekvere PHP-scripts.

Hvis du kan køre det på din lokale pc (installeret PHP og f.eks. Apache), så kan du i Windows køre en "planlagt opgave" og så køre det som C:\php\php.exe c:\mappe\script.php
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester