Zálohování MySQL dat přes PHP – update
UPDATE: Ve skriptu bylo opraveno escapování vkládaných dat podle Davida Grundla.
Pokud má člověk napsaný velký systém a klient z něj chce pravidelně zálohovat data, nezbude nic jiného než napsat zálohovací skript. Zde se nám ale nabízí různá řešení (např. exec, vypisovat jednu tabulku po druhé ručně), dnes si popíšeme jedno pomocí MySQL dotazů.
Protože tabulek máme v databázi opravdu požehnaně a ke každé psát dotaz by byla sebevražda, napíšeme si jednoduché funkce, které nám vrátí všechna data ze všech tabulek. A to pěkně v MySQL insertech.
Základem jsou dotazy
Vše je jen a jen o dotazech. Stačí chvíli hledat v MySQL nápovědě či umět anglicky a ovládat logické myšlení.
SHOW TABLES
SHOW COLUMNS FROM table
První z těchto dotazů nám vrátí seznam všech tabulek v aktuálně používané databázi, ten druhý vrací informace o sloupcích určité tabulky aktuálně používané databáze.
Zdrojový kód
<?php
/*
* @author: Jakub Brabec, http://www.jakubbrabec.cz
*/
function zalohujDatabazi($database)
{
$query = mysql_query("SHOW TABLES");
while($v = mysql_fetch_assoc($query))
{
$text .= "--------------------\nData tabulky ".$v['Tables_in_'.$database]."\n--------------------\n";
$text .= tabulkaDatabaze($v['Tables_in_'.$database]);
$text .= "--------------------\n\n\n";
}
return $text;
}
function tabulkaDatabaze($table)
{
$i = 0;
$query = mysql_query("SHOW COLUMNS FROM ".$table);
while($v = mysql_fetch_assoc($query))
{
$sloupce[$i] = $v['Field'];
if(strpos($v['Type'], "int") === false AND strpos($v['Type'], "decimal") === false)
$cislo[$i] = false;
else
$cislo[$i] = true;
$i++;
}
$query = mysql_query("SELECT * FROM ".$table);
while($v = mysql_fetch_assoc($query))
{
$text .= "INSERT INTO ".$table." VALUES(";
for($i = 0; $i < count($sloupce); $i++)
{
if($cislo[$i] == true)
$text .= $v[$sloupce[$i]];
else
$text .= "'".mysql_escape_string($v[$sloupce[$i]])."'";
if($i < count($sloupce) - 1)
$text .= ", ";
}
$text .= ");\n";
}
return $text;
}
?>
Jak vidíte, máme 2 funkce. První s názvem zalohujDatabazi nám projede všechny tabulky v aktivní databázi a vrací výsledek v textové formě. Druhá si nejprve přečte strukturu tabulky, tím zjistí názvy sloupců a jejich datové typy, a následně vytvoří samotný dotaz, který vypadá následovně.
INSERT INTO vyplaty VALUES(8, '2008-11-03');
Popis funkčnosti
Předat funkci zalohujDatabazi název databáze do proměnné $database je nutné, protože dotaz SHOW TABLES vrací data v proměnné Tables_in_nazevdatabaze. Průběh skriptu při MySQL dotazu doufám popisovat nemusím
Funkci tabulkaDatabaze se předá název aktuální tabulky, ze které si pomocí dotazu SHOW COLUMNS FROM tabulka vytáhneme sloupce s jejich typy a následně určíme zda-li se jedná o číslo nebo ne – pomocí funkce strpos. V uvedeném příkladu máme 2 číselné typy – int (zároveň i tinyint) a decimal. Ke každému sloupci tabulky si tak určíme její typ a využijeme ho později při tvorbě insert dotazu. Pokračujeme výběrem všech dat z tabulky, zde se již uplatňuje typ sloupce. Pokud nejde o číslo, uloží se data do jednoduchých uvozovek a tím zajistíme správné vložení do tabulek.
Celá procedura se tedy logicky volá
$zaloha = zalohujDatabazi("blog");
Doufám že vám funkce přijde užitečná a popis dostatečně srozumitelný.
Jak vidíte na obrázku vlevo, text načtených procent je tak nějak divně deformovaný. Je to způsobeno tím, že samotný swf soubor neobsahuje onen určitý font (v tomto případe Myriad Pro). Co tedy udělat pro to aby fungoval jak má? Jednoduše, přiložit ho.



Narodil se a již tenkrát mu byla prorokována skvělá budoucnost. Jeho osobnost je dostatečně silná na absolutní destrukci všech nástrah.
