Uživatelské MIME transformace dávají všem příznivcům programu phpMyAdmin do rukou nástroj, jakým se těžko může pochlubit jiný databázový správce. Umožňují totiž nadefinovat prakticky libovolné akce, které lze s daty na přání uživatele provést. A tyto „akce“ se neomezují jen na databázi samotnou, mohou zasahovat i do vnějšího prostředí, ve kterém aplikace pracuje.

Podmínkou pro využívání MIME transformací je správná instalace aplikace phpMyAdmin minimálně ve verzi 2.5.0, včetně vytvoření všech podpůrných (PMA) tabulek. Pokud si nejste jisti, jak takovou instalaci provést, doporučuji vám článek Instalace phpMyAdmin, v němž je třináctý bod věnován tabulce „pma_column_info“, bez níž je MIME transformace nemyslitelná. V dalším textu budu používat phpMyAdmin 2.5.6 v české jazykové mutaci.

Správně vytvořená tabulka "pma_column_info"
Správně vytvořená tabulka „pma_column_info“

Definice uživatelského MIME typu

Definici uživatelského MIME typu vyřešili autoři phpMyAdmin velmi šalamounsky. Když se podíváte do adresáře, do nějž jste si phpMyAdmin nainstalovali, najdete v něm podadresář „libraries“ a v něm podadresář „transformations“. Podíváte-li se pozorně na jména souborů v tomto podadresáři, rychle zjistíte, že se shodují s vestavěnými MIME typy a transformacemi. Dokonce je zde soubor TEMPLATE_MIMETYPE!

K vytvoření nového MIME typu bez přidružené transformace stačí okopírovat vzorový soubor, přejmenovat ho tak, aby se jeho jméno shodovalo s názvem MIME typu a přidat mu koncovku „.inc.php“. Pokud určujeme i subtyp, lomítko v názvu nahradíme jedním podtržítkem. Chceme-li například do phpMyAdmin uvést MIME typ „image/gif“, vytvoříme soubor s názvem image_gif.inc.php.

Definice uživatelské transformace

Definice uživatelské transformace začíná stejně, jako definice vlastního MIME typu. Ve výše zmíněném adresáři najdeme soubor TEMPLATE a přejmenujeme ho dle výše zmíněného postupu pro definici nového MIME typu. Potom přidáme před koncovku dvě podtržítka a název transformace. Chceme-li například do phpMyAdmin uvést MIME typ „image/gif“ s přidruženou transformací pro náhled s odkazem „image/gif: inline“, vytvoříme soubor s názvem image_gif__inline.inc.php. (Pokud bychom chtěli vytvořit takzvanou globální transformaci, bez přidružení k MIME typu, nazvali bychom soubor global__inline.inc.php.)

Tímto jsme phpMyAdmin „informovali“ o existenci uživatelské transformace, takže ta se dostane do příslušné nabídky. Nyní musíme zařídit, aby tato transformace také způsobila požadovaný efekt, v našem případě aby se objevil náhled obrázku ve formátu GIF. To zařídíme editací souboru, který jsme vytvořili v předešlém kroku. Pokud jej totiž otevřete, zjistíte, že se vlastně nejedná o nic jiného, než PHP skript.

function PMA_transformation_image_gif__inline($buffer, $options = array(), $meta = “) {
    require_once(‚./libraries/transformations/global.inc.php‘);
    if (PMA_IS_GD2) {
        $transform_options = array (‚string‘ => ‚<a href=“transformation_wrapper.php‘ . $options[‚wrapper_link‘] . ‚“ target=“_blank“><img src=“transformation_wrapper.php‘ . $options[‚wrapper_link‘] . ‚&resize=gif&newWidth=‘ . (isset($options[0]) ? $options[0] : ‚100‘) . ‚&newHeight=‘ . (isset($options[1]) ? $options[1] : 100) . ‚“ alt=“[__BUFFER__]“ border=“0″></a>‘);
    } else {
        $transform_options = array (‚string‘ => ‚<img src=“transformation_wrapper.php‘ . $options[‚wrapper_link‘] . ‚“ alt=“[__BUFFER__]“ width=“320″ height=“240″>‘);
    }
    $buffer = PMA_transformation_global_html_replace($buffer, $transform_options);
    return $buffer;
}

Název transformační funkce se utváří z povinné předpony PMA_transformation_ a názvu souboru s příslušnou transformací (samozřejmě bez koncovky „.inc.php“).Hned v úvodu skriptu se načítá soubor global.inc.php. V této knihovně se nachází několik základních funkcí pro různé transformace, které můžete používat ve vlastních skriptech. Soubor transformation_wrapper.php se stará o získávání vstupních dat (obsahu polí, řídících parametrů, proměnných prostředí) a o jejich správný výstup (doplňování hlaviček a podobně), přičemž využívá většinu dalších knihoven programu. Objekt $meta obsahuje informace o transformované „buňce“ (získaný pomocí funkce mysql_fetch_field()), pole $options obsahuje parametry transformace zadávané uživatelem a v proměnné $buffer je uložen obsah „buňky“, nad níž se provádí transformace.

Kontextová uživatelská transformace

Zamyslíte-li se nad principem uživatelských transformací, snadno dospějete ke zjištění, že lze vytvořit takovou uživatelskou transformaci, která by načetla obsah „buňky“ databáze a tento pak provedla. To by skutečně nebyl problém, pokud by obsahem „buňky“ byl spustitelný PHP kód. Stačilo by vytvořit soubor application_php__execute.inc.php a do něj vložit tuto funkci:

function PMA_transformation_application_php__execute($buffer, $options = array(), $meta = “) {
    return eval($buffer);
}

Mohu-li vám poradit, nedělejte to. MIME transformace jsou velice mocný nástroj a podobnou transformací byste vystavili svůj systém naprosto nekontrolovatelnému nebezpečí zneužití. Tady už v podstatě nejde ani o bezpečnostní díru, ale o dokonalou ztrátu veškerého zabezpečení.

Praktické využití uživatelských transformací

V článku o vestavěných transformacích jsem uvedl několik příkladů jejich použití, umožňujících uživateli snazší přístup k datům. Tyto transformace jsou ale velmi primitivní a poskytují jen omezený užitek. Ne tak uživatelsky definované transformace. V jejich případě jde vlastně o libovolný skript v PHP, jehož schopnosti práce s daty jsou omezeny pouze nápaditostí autora. Tomu přitom stačí zaměřit se na vlastní transformaci a veškeré podružnosti vyřídí phpMyAdmin, který tak poslouží jako univerzální aplikační framework.

Uvedu jeden příklad za všechny. Představte si, že programujete malý e-shop. To kromě jiné práce znamená také vytvoření dvojího uživatelského rozhraní – pro zákazníky a pro správce. Pokud použijete uživatelsky definované transformace, můžete využít pro správu e-shopu přímo phpMyAdmin, ve kterém stejně spravujete svou databázi. Stačí vytvořit uživatele s omezenými právy (třeba „ucetni“) a povolit mu přístup jen k některým tabulkám. Do těchto tabulek pak lze začlenit různé skripty – například pro potvrzování objednávek, generování a automatické odesílání faktur, aktualizaci cen zboží a podobně.

Uživatelsky definované transformace naprogramujete rychleji než nezávislé skripty, uděláte v nich pravděpodobně méně zásadních chyb, snáze pomocí nich udržíte integritu dat a ke správě aplikace jejich prostřednictvím můžete vycvičit i příslovečnou opici.

Žádný příspěvek v diskuzi

Odpovědět