Kod, który tu przedstawiam powinien skopiować zawartość podanej bazy danych i zapisać ją w pliku test.sql.
<?php
$link = mysql_connect('127.0.0.1', 'root', 'haslo') or die('Connection error : ' . mysql_error());
mysql_select_db('nazwa bazy') or die('Could not select database');
$sql = '';
$crlf = "\r\n";
$time = date('Y m d, H:i', time());
$sql .= '#' . $crlf;
$sql .= '# Zrzut bazy danych ' . $crlf;
$sql .= '# Wygenerowano: ' . $time . $crlf;
$sql .= '#' . $crlf . $crlf;
$res = mysql_list_tables('nazwa bazy');
while($row = mysql_fetch_array($res))
{
$table_name = $row[0];
$table_fields = array();
$sql .= '#' . $crlf;
$sql .= '# Struktura tabeli ' . $table_name . $crlf;
$sql .= '#' . $crlf;
$sql .= 'DROP TABLE IF EXISTS ' . $table_name . ';' . $crlf;
$sql .= 'CREATE TABLE ' . $table_name . ' ( ' . $crlf;
/* Generujemy strukture tabeli. Najpierw wyciagamy pola */
$res2 = mysql_query('SHOW FIELDS FROM ' . $table_name);
while($fields = mysql_fetch_array($res2))
{
$sql .= ' ';
$sql .= $fields['Field'] . ' ' . $fields['Type'];
if (!empty($fields['Default']))
{
$sql .= 'DEFAULT \'' . $fields['Default'] . '\'';
}
if ($fields['Null'] != 'Yes')
{
$sql .= ' NOT NULL';
}
if (!empty($fields['Extra']))
{
$sql .= ' ' . $fields['Extra'];
}
$sql .= ',' . $crlf;
$table_fields[] = $fields['Field'];
}
$index = '';
/* Teraz wyciagamy pola typu KEY */
$res2 = mysql_query('SHOW KEYS FROM ' . $table_name);
while ($keys = mysql_fetch_assoc($res2))
{
$kname = $keys['Key_name'];
if(($kname != 'PRIMARY') && ($keys['Non_unique'] == 0))
{
$kname = 'UNIQUE|' . $kname;
}
$index[$kname] = array();
$index[$kname][] = $keys['Column_name'];
}
while(list($n, $columns) = @each($index))
{
if ($n == 'PRIMARY')
{
$sql .= ' PRIMARY KEY (' . implode($columns, ', ') . ')';
}
elseif (substr($n, 0, 6) == 'UNIQUE')
{
$sql .= ' UNIQUE ' . substr($n, 7) . ' (' . implode($columns, ', ') . ')';
}
else
{
$sql .= ' KEY ' . $n . ' (' . implode($columns, ', ') . ')';
}
$sql .= $crlf;
}
$sql .= ');' . $crlf;
$sql .= $crlf . $crlf;
$sql .= '#' . $crlf;
$sql .= '# Dane z tabeli ' . $table_name . $crlf;
$sql .= '#' . $crlf;
/* Mamy juz strukture, wiec teraz czas
wyciagnac dane z tabeli */
$d_res = mysql_query('SELECT * FROM ' . $table_name);
while ($data = mysql_fetch_array($d_res))
{
$sql .= 'INSERT INTO ' . $table_name . ' (' . implode(', ', $table_fields) . ') VALUES(';
$field_count = count($table_fields);
$f_data = array();
for ($i = 0; $i < $field_count; $i++)
{
$f_data[] .= '\'' . $data[$i] . '\'';
}
$sql .= implode(', ', $f_data);
$sql .= ');' . $crlf;
}
$sql .= $crlf . $crlf;
}
$file = fopen('test.sql', 'w');
fwrite($file, $sql);
fclose($file);
?>
Wersja dla klasy PDO
<?php
/***************************************************************************
**************** XVweb Project *************************
**************** Name : SQL Dump/Export *************************
**************** License : GNU *************************
**************** Authors : Krzysztof Bednrczyk *************************
*************************XVweb Team*****************************************
***************************************************************************/
DEFINE('BdServer', 'LOCALHOST', true); // MySQL server / Serwer MySQL
DEFINE('BdServer_User', 'USER', true); // MySQL user / Użytkownik MySQL
DEFINE('BdServer_Password', 'PASSWORD', true); // MySQL Password / Hasło MySQL
DEFINE('BdServer_Base', 'DATABASE', true); // MySQL DataBase / Baza danych
DEFINE('Dump_File', 'dump.sql', true); // Name generated file / Nazwa wygenerowanego pliku
$SQLDump = '/*'.chr(13); // Header for file / Nagłówek dla pliku
$SQLDump .= '# SQL DUMP: '.(BdServer_Base).chr(13); // Name database / Nazwa bazy danych
$SQLDump .= '# GENERATED: '.date("d.m.Y H:i:s").chr(13); //Date generated / Data wygenerowania
$SQLDump .= '*/'.chr(13); // END Header
try { //Try / próbój
$dbh = new PDO('mysql:host='.BdServer.';dbname='.BdServer_Base, BdServer_User, BdServer_Password); // Connecting with database /Łączenie się z bazą danych
foreach ($dbh->query('SHOW TABLES;') as $Table) { // Get tables / Pobieranie tabel
$TableStructure = $dbh->query('SHOW CREATE TABLE `'.$Table[0].'`')->fetch(); // Get table structure / Pobieranie struktury tabeli
$SQLDump .= '/*TABLE STRUCTURE FOR `'.$Table[0].' */ '.chr(13).chr(13); //Header for table structure / Nagłówek dla struktury tabeli
$SQLDump .= $TableStructure[1].chr(13); //Adding table structure to variable / Dodawanie struktury tabeli do zmiennej
$SQLDump .= chr(13).'/*SQL TABLE RECORDS FOR `'.$Table[0].' */ '.chr(13).chr(13); // Header for table records / Nagłówek dla rekordów tabeli
foreach($dbh->query('SELECT * FROM `'.$Table[0].'`;')->fetchAll(PDO::FETCH_ASSOC) as $SelectRow) // Foreach loop with records / Pętla z reordami tabeli
$SQLDump .= sprintf('INSERT INTO `'.$Table[0].'` (%s) VALUES (%s);', implode(', ', array_map(function($n){ return '`'.$n.'`';} ,array_keys($SelectRow))), implode(', ',array_map(array($dbh, 'quote'), $SelectRow))).chr(13); //Generate sql query with records / Generowanie zapytań SQL z rekordami
$SQLDump .= chr(13).chr(13); //Two empty lines for aesthetics / Dwie puste linie dla estetyki
}
} catch (PDOException $e) { //Catching errors / Łapanie błędów
exit(sprintf("SQL error: %s", ($e->getMessage()))); // If error, then print message and quit / Jeśli błąd, wyświetl komunikat i zakończ pracę
}
file_put_contents(Dump_File, $SQLDump); //Save to file / Zapisz do pliku
echo "Done!"; //Done / Zakończenie
?>
Przydaloby sie wiecej komentarzy dotyczacych kodu.
Poza tym majac dostep do serwera MySQL, najlepiej zrobic to przy pomocy mysqldump.
Jest tylko mały problem gdy tabela nie ma klucze np.:
CREATE TABLE archiwum_komunikatow (
kom_ID int(11) NOT NULL,
temat text NOT NULL,
tresc text NOT NULL,
data_nad datetimeDEFAULT '0000-00-00 00:00:00' NOT NULL,
);
i jak widać w ostatniej linii dodało znak: ' , '(przecinek), przez co w czasie wykonywania pliku baza zwraca błąd
Nie prościej SHOW CREATE TABLE test?
wiekszos serwisow udostepnia phpmyadmina a nawet bez shela odpalic dumpa
<?php
shell_exec('mysqldump dbName -uDBuser -pDBpass | gzip >
date +%Y%m%d%H%M%S
_fileName.gz');?>
Zrobiłem błąd. Zamiencie
na