• Home
  • střešní nosiče
  • slevy
Blue Orange Green Pink Purple

Zálohování MySQL dat přes PHP – update

Posted in webdesign. on Pondělí, Leden 12th, 2009 by Jakub Brabec
Led 12

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ý.

4 Comments

  1. David Grudl on Leden 12th, 2009

    Hezké. Jen místo v místě „‘“.$v[$sloupce[$i]].“‘“ je nutné použít escapovací funkci, např. mysql_escape_string

  2. Jakub Brabec on Leden 12th, 2009

    Ahoj Davide, jsem rád že jsi sem ke mně zavítal, moc si toho vážím. Funkce byla přidána, nedošel mi případný scénář. Díky

  3. Martin Hujer on Leden 21st, 2009

    V místě vkládání hodnot mi to občas nevložilo nic, a tím pádem bylo SQL nevalidní.

    Úprava:
    if($cislo[$i] == true) {
    $bar = $v[$sloupce[$i]];
    if (strlen($bar) === 0) {
    $text .= ‘NULL’;
    } else {
    $text .= $bar;
    }

  4. Linbor on Srpen 14th, 2009

    Není to sice k věci ale skvělé! Zajímavé počtení, dobře
    to tu vypadá, a světe div se – ani na malém displejíčku (v mobilu) se tahle stránka nezhrotila.



Leave a Reply

Brabčákův blog

  • Jakub Brabec

    Follow @JakubBrabec 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.

    Rád žere párky, pizzu, rád řídí, rád myslí, rád píše, rád spí a nerad pracuje. A taky rád řídí auto.

    Největší úspěch měl v první třídě (to víš, matika), pak ale dostal první počítač a už to s ním šlo z kopce. Vyhrával jednu matematickou soutěž za druhou, na těláku mu daly na prdel ženský a ve fyzice byl lepší snad i křeček.

    Dnes, v jeho 22 letech, je již beznadějně ztracen v online bludišti a už není cesty zpět. Proto má jakousi zvrhlou povinnost vylejvat své poznámky do tohohle online bloku. Poznámkáče.

  • Rubriky
    • Finance (2)
    • Flash a Actionscript (2)
    • Internet (10)
    • Moje projekty (8)
    • Sakumprdum (9)
    • Sociální pokusy (2)
    • Vztahy, volný čas (17)
    • webdesign (2)
  • Twitter
  • Exterňáky
    • Slevy česky
  • Koho rád čtu
    • Slevy česky
  • Mé projekty
    • EGO
    • Thule
    • Webdresink studio
  • Archives
    • Červen 2011
    • Červenec 2010
    • Červen 2010
    • Červen 2009
    • Leden 2009
    • Prosinec 2008
    • Listopad 2008
    • Září 2008
    • Srpen 2008
    • Červenec 2008
    • Červen 2008
  • Search






  • Home

© Copyright Brabčákův blog. All rights reserved.
Designed by FTL WordPress Themes brought to you by DT Web Template

Back to Top