Adminer 6.0.0

Začnu prosbou. Adminer má na GitHubu už jen o 400 ⭐ míň než phpMyAdmin, kvůli jehož těžkopádnosti jsem začal na mrštné alternativně pracovat. Pokud vy nebo vaši známí Adminer používáte, dejte mu prosím hvězdičku.

Při vývoji Admineru jsem se dostal do totálního flow. Při řešení jedné věci mě napadly dvě další a todo list byl večer často dvakrát delší než ráno. Adminer 6.0.0 obsahuje více než 130 změn a nebudu je tady všechny vypisovat. Vyberu jen to nejzajímavější:

Bezpečnost

Adminer už od verze 4.6.3 zakazuje přihlášení bez hesla. Hlavně uživatelům SQLite to komplikuje život. Pro ně jsem vytvořil stránku, kde si můžou stáhnout Adminer pro SQLite chráněný heslem dle jejich výběru.

Nově jsem zakázal i přihlášení k serverům, které se spokojí s jakýmkoliv heslem. Plugin login-password-less na tyto změny reaguje a nově v něm lze použít stejné heslo pro SQLite jako máte třeba pro MySQL.

„Operátor“ SQL v Admineru používám třeba pro práci s JSON. Je ale samozřejmě nebezpečný, do SQL příkazu lze pomocí něj doplnit jakýkoliv kód. SameSite cookies používané Adminerem riziko snižují, ale doplnil jsem dvě další ochrany:

Vzhled

screenshot Chtěl jsem vypíchnout data v databázi a potlačit uživatelské rozhraní Admineru. Třeba skrytím opakujících se odkazů a jejich zobrazením až při najetí myši. Vzhled byl mnohem vzdušnější, ale zároveň vypadal děravý a na první pohled nebylo jasné, kde jakou funkci najdu. Částečná průhlednost rozhraní Admineru zase působila dojmem, že jsou odkazy disabled, tento experiment je k dispozici v pluginu menu-links (volba hover). Nakonec jsem jen checkboxy a odkazy zobrazované v řádcích tabulky vystrčil mimo tabulku, s čímž jsem spokojen. Původní chování lze vrátit pomocí vlastního vzhledu. Přemýšlel jsem, jak se zbavit opakujících se odkazů vypsat v menu. Některé vzhledy je skrývají, jiné je vymění za ikonu. Ale já zhruba stejně často používám vypsání a strukturu tabulky a jakékoliv skrytí mě zmate. U ikony musím vždycky přemýšlet, jestli znamená to nebo ono, navíc vůbec není jasné, že by měla dělat něco jiného než odkaz z názvu tabulky. U explicitního vypsat přemýšlet nikdy nemusím.

Počet ošetřovaných znaků v URL jsem snížil na minimum. Z dřívějších ošklivých URL where%5B0%5D%5Bcol%5D je pěkně čitelné where[0][col]. Týká se to i formulářů, které nepředávají nevyplněná políčka, takže jsou URL mnohem kratší. Z této pro běžného uživatele neviditelné změny mám velkou radost.

Editační funkce bez parametru (např. NOW()) nově skryjí vstupní políčko. Zvažoval jsem to udělat i při výběru hodnoty NULL, ale tam mi vyhovuje, že stačí do vstupního políčka začít psát a NULL samo zmizí.

Blbuvzdornost

Adminer měl řadu kontrol konfigurace PHP, např. proti překročení max_input_vars nebo upload_max_filesize. Ty se ale provedly, až když bylo pozdě – po odeslání formuláře. Nyní se provádí už při jeho vyplňování.

Nové verze Admineru se pomocí <noscript><iframe sandbox> nově kontrolují i s vypnutým JavaScriptem. Kontrolu verzí jsem doplnil také k pluginům, pluginům ovladačů a vzhledům, které by měly být vždy ve stejné verzi jako Adminer. Nebyly k tomu potřeba žádné nové requesty – Adminer si s sebou prostě nese verze pluginů a vzhledů, které k němu pasují. Pokud jste si nějaký plugin vědomě změnili a kontrola vás otravuje, stačí přejmenovat jeho soubor. U vzhledů pak změnit první řádek v adminer.css.

Import/export

Export obecného SQL příkazu byl v některých případech problém. Mohl obsahovat proměnné nebo stavové informace, které při exportu chyběly. Vyřešil jsem to tak, že pokud to jde, použijí se pro export přímo data z vypsané tabulky, což je i rychlejší.

Import a export si dřív každý ovladač dělal po svém a obzvlášť v pluginech ovladačů to nefungovalo moc dobře. Teď jsem to sjednotil a ovladače si jen registrují své odlišnosti – např. pokud podporují UPSERT.

V PostgreSQL jsem problém s cizími klíči vyřešil tak, že se všechny DROP TABLE a TRUNCATE provedou na začátku.

Pluginy

Interní změny

Z některých interních změn mám možná ještě větší radost než z toho, co je vidět navenek – hlavně z obsluhy JavaScriptových událostí.

Dávno<a onclick="return aClick(this, 1, event);">
Od 4.4.0<a><script nonce="OGY1MDBkYjNhNGRmYjAwNWU5OGJjNjMwM2Q1Nzg1MWQ=">qsl('a').onclick = partial(aClick, 1);</script>
Nově<a data-onclick='aClick(1)'>

Nový zápis je plně kompatibilní s CSP a neumožňuje přímé spuštění kódu. Je to jen přehledněji zapsané JSON pole. Zjednodušilo to i obsluhu událostí v HTML kódu poslaného přes AJAX, kterou druhý způsob přímo neumožňoval.

Pro závislosti Admineru používám Git submoduly, které jsou pro mě mnohem pohodlnější než Composer. Ale pro lidi, co instinktivně píšou git clone; composer i jsem doplnil i podporu pro composer i. Nově to nainstaluje i ESLint, který se při composer check nyní spouští spolu s PHP_CS a PHPStan.

graf Nechal jsem zjistit velikosti všech verzí Admineru. I přes velký nárůst funkčnosti nové verze se mi téměř podařilo zachovat velikost zkompilovaného souboru díky jednoduchému triku. Pro komprimaci překladů se používá komprimační tabulka angličtiny (funkce deflate_init).

Web

Vyměnil jsem tabulky v demu. Demo nově funguje i s PostgreSQL.

Závěr

Většina změn vznikla s asistencí Claude Opus 5. Někteří lidi se bojí, že AI asistence může kód zamořit technickým dluhem. To je jistě pravda, pokud vývojář všechny změny bezduše odbouchne Enterem. Ale pokud si pořádně projde plán, vyjedná v něm změny a pak totéž udělá i s vygenerovaným kódem, kvalita kódu stoupne a technický dluh naopak klesne. Je to jako párové programování s pozorným kolegou – něco napadne mě, něco jeho a společně vzniklý kód je lepší, než kdyby ho kdokoliv z nás psal samostatně. Sám dělám při asistovaném vývoji odhadem tak dvakrát víc důležitých rozhodnutí, než když jsem na to sám.

Jakub Vrána, Adminer, 7.8.2026

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2026 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.