PHP triky

Weblog o elegantním programování v PHP pro mírně pokročilé

Adminer 6.1.1 – zvýrazňování výsledků hledání

Adminer 6.1.1 přináší skoro 50 změn, nejvýraznější je zvýrazňování nalezeného textu. Nechtěl jsem, aby při hledání group = 6 byla šestka vysvícená ve všech řádcích, proto se zvýrazňuje jen při hledání podřetězce nebo ve všech sloupcích.

screenshot

Další zajímavé změny:

  1. Při editaci JSON se zaokrouhlovala velká čísla. Funkce json_decode má sice volbu JSON_BIGINT_AS_STRING, ta je ale zase převede na řetězce. Při řešení jsem se dozvěděl o (*SKIP) a (*FAIL) v regulárech: preg_replace('~"(?:[^"\\\\]|\\\\.)*+"(*SKIP)(*FAIL)|-?\d[-+.\deE]*+~', '"\\\\u0001$0"', $json) při značkování čísel přeskočí řetězce a je to rychlejší než preg_replace_callback.
  2. Při scrollování široké tabulky zůstane vlevo viset její editační odkaz. Obdobně název tabulky v přehledu databáze.
  3. Odkazy do dokumentace byly rozeseté na náhodných místech v podobě otazníků, které se ale používají třeba i pro chybějící data. Změnil jsem je na ikonu 📖, kterou jsem přesunul do hlavičky.
  4. V seznamu databází a schémat strašila systémová schémata. Přesunul jsem je do samostatné skupiny.

Ovladače

  • Triggery v PostgreSQL můžou jen volat funkci. Přidal jsem odkaz pro její editaci.
  • SQLite pomocí ATTACH umožňuje vytvářet soubory. Zakázal jsem to metodou SQLite3::setAuthorizer.
  • MS SQL jsem rozchodil s extenzí Dblib a opravil v ní několik chyb.
  • ClickHouse jsem vyzkoušel na jejich pískovišti a opravil několik chyb.

Pluginy

  • Editor odjakživa zobrazuje hodnotu cizího klíče jako první řetězcový sloupec odkazované tabulky. Plugin select-foreign to umožňuje i v Admineru.
  • Přidal jsem metodu namePattern(), kterou se dá ovlivnit výchozí způsob pojmenování vytvářených objektů. Plugin name-patterns to dovoluje změnit. Výchozí pojmenování triggerů je nově podle všech událostí (např. iu pro INSERT OR UPDATE).
Jakub Vrána, Adminer, 25.9.2026, diskuse: 0

Adminer 6.1.0 – webová aplikace

Adminer webapp Adminer 6.1.0 lze nainstalovat jako webovou aplikaci. Název aplikace obsahuje doménu webového serveru, takže jde rozlišit vývoj a produkci.

Další změny

  • Power feature Admineru je Ctrl+click pro přímou editaci hodnot v tabulce. Teď jsem to přidal i do SQL příkazu, kde je to mnohem složitější – může být spojeno víc tabulek, tabulky a sloupce můžou mít aliasy, hodnoty se můžou opakovat na více řádcích, … Funguje to jen s extenzí MySQLi, která jako jediná dodává všechny potřebné informace.
  • Při ukládání AJAXem nemusela být vidět hláška o výsledku, ta proto teď zůstane chvíli viset na obrazovce.
  • Neexistující objekty (např. cizí klíče nebo schémata) teď vrací 404 a chybovou hlášku.
  • Přepracoval jsem práci s transakcemi, takže ty teď fungují v Oracle, MS SQL i SQL příkazu.
  • Překladatele jsem požádal o kontrolu AI překladů a udělal jim žebříček.
  • Výpis dat dovoluje používat SQL funkce, s čímž pak Adminer dále pracuje. Jenže sloupec pojmenovaný doslova třeba CHAR_LENGTH(name) to rozbil. To sice není úplně reálné, ale stejně mě to štvalo, tak jsem to opravil.
  • V exportu přibyla možnost exportovat schéma (MS SQL) a tím i vybrat, jestli jím budou objekty plně kvalifikované (PostgreSQL).
  • Pluginy můžou použít metodu explain(), což dovolí integraci nástrojů jako PEV2.
  • Vytvořil jsem plugin login-cross-origin, který dovolí přihlášení bez kontroly CSRF, zakázané od 6.0.1.

Ovladače

Ovladač pro Oracle se po 16 letech vývoje (ehm) osvobodil od přívlastku beta. Vyřešil jsem všechny otevřené chyby, vyrobil sadu testů, zrychlil dotazy a pro „databázi“ jsem použil schémata místo dřívějších tablespaces. Neobešlo se to bez změny samotné PHP extenze, protože její pouhé nahrání mi shazovalo PHP.

  • MySQL zobrazuje jako přihlášeného uživatele CURRENT_USER() místo USER().
  • PostgreSQL dostalo přehled o nainstalovaných extenzích a podporuje geometrii PostGIS.
  • MS SQL se dočkalo podpory uložených procedur, varchar(max) a Unicode ve všech řetězcích.
  • CockroachDB odkazuje do vlastní dokumentace.

A ještě nějaké drobnější změny.

Jakub Vrána, Adminer, 14.9.2026, diskuse: 0

Čtyřka – mariáš pro čtyři hráče

Jako bakalářský projekt jsem v minulém století napsal karetní hru Čtyřka – mariáš pro čtyři hráče. Ta se pak i celkem úspěšně prodávala. Teď jsem se k tomu vrátil a přepsal jsem ji pro prohlížeč.

screenshot

Po letech jsem byl opravdu rád, jak jsem to už tehdy napsal dobře. Zaprvé je herní algoritmus zcela oddělen od zbytku programu (je to samostatné DLL) a dostává jen ty informace, které daný hráč může mít. Nemůže tedy podvádět – koukat se hráči do karet ani spolupracovat s ostatními algoritmy. Zadruhé to není žádné obyčejné procházení stromem, ale hraje to podle asi 80 heuristik, které jsem zadal podle toho, jak jsem tehdy sám hrál. Hraje to tedy spíš jako člověk než jako počítač. Třeba když jsem hrával šachy, tak mě to proti lidem bavilo, ale proti počítači ne. Tady je to do značné míry potlačeno a docela mě překvapilo, jak mě po letech můj starý algoritmus drtí – inu, moc jsem za ta léta netrénoval.

Ve starém programu jde zapnout logování veškerých událostí a pouhým držením Enteru se dá rychle odehrát desítky her. Claude se z toho úplně tetelil blahem – můj algoritmus označil za korunní klenot programu, nechal mě „odehrát“ 400 her, celkem snadno reimplementoval algoritmus do TypeScriptu a pak si pomocí logu porovnal, jestli tam nejsou nějaké nesrovnalosti. Dokonce dokázal nový algoritmus pustit proti starému DLL a porovnal, jestli náhodou jedna verze nevydělává podezřele hodně peněz. Pak jsme teprve starý algoritmus začali vylepšovat.

Nechal jsem napsat i nový algoritmus pomocí procházení stromem, ale můj starý algoritmus nepřekonal – počítal s tím, že všichni budou hrát dokonale, což jde s neúplnou informací dost těžko.

Nová hra

screenshot

Uživatelské rozhraní bylo hotové celkem rychle a snadno. Překvapilo mě ale, že samotná hra byla zhruba jen třetina práce.

Další třetinu spolkla monetizace – hra se dá podobně jako původní Čtyřka zdarma vyzkoušet, pak si ji můžete koupit. Takže zřízení účtu u Fio, generování platebního QR kódu, samostatný EUR účet, párování plateb. Hra s platbou nijak zvlášť neotravuje – jen každé rozdání zobrazí platební informace o desetinu sekundy déle. Po sto hrách už čekání většinu hráčů přestane bavit.

A poslední velká část byla kampaň původním zákazníkům – na některé mám e-mail, na jiné telefon a na některé jen poštovní adresu. Takže to obnášelo všechno od zpracování nedoručitelných e-mailů, posílání SMS z Androidu, generování čitelných slevových kódů až po účet na Dopis Online.

Celé jsem to navibekódoval, většinu kódu jsem ani nečetl. Ale samozřejmě to nebylo jen „naprogramuj mariáš a obešli původní zákazníky“. Obnášelo to řadu vymýšlení a rozhodnutí, která výslednou podobu zásadně ovlivnila.

Možná hra nebude tak úspěšná jako její původní verze – přece jen už tehdy hráli mariáš z velké části důchodci. Ale i tak jsem rád, že jsem se k tomu vrátil – fakt mě to bavilo a dost jsem se toho naučil.

Zkuste si novou hru Čtyřka – křížový mariáš pro čtyři hráče zahrát. Součástí je i tutoriál, který základní pravidla vysvětluje.

Jakub Vrána, Osobní, 9.9.2026, diskuse: 3

Adminer 6.0.2 – service worker

Zkompilovaný Adminer načítá statické soubory (CSS, JS, logo) pomocí ?file=default.css s hlavičkami Expires a Cache-Control: immutable. Některé hostingy ale všem PHP skriptům dávají své vlastní hlavičky, které kešování naopak natvrdo vypnou. Skript s tím bez změny konfigurace serveru nemůže nic udělat a Adminer je pak pomalý. Uchýlil jsem se proto k tomuto řešení: Adminer si registruje service worker, který statické soubory nakešuje a při dalším požadavku je servíruje on. Metodou serviceWorker() se to dá vypnout.

Všechny změny, zde jen ty zajímavé:

  1. Pro databáze bez podpory DDL transakcí Adminer dělá změny tímto postupem: vytvoř zkušební, smaž zkušební, smaž původní, vytvoř nový. Tím se sníží šance, že by se smazal starý objekt a pak se nepodařilo vytvořit nový. Nová verze to dělá i u kontrol CHECK.
  2. U víceřádkových zkrácených textů je … místo celého posledního řádku.
  3. Čísla se formátují podle jazykových zvyklostí, např. v češtině se jako oddělovač tisíců používá narrow non-breaking space, v bengálštině má neposlední skupina jen dvě číslice.
  4. Uložené procedury a funkce při změně dovolují editovat všechny volby, např. DETERMINISTIC.
  5. Odkaz Načíst další data zůstane viditelný i po odscrollování doprava.
  6. Zjednodušil jsem RTL rozložení pomocí CSS vlastností margin-inline-start a spol.
  7. MySQL: Pokud je s tabulkou nějaký problém (např. chybějící datový soubor), tak to MySQL reportuje v komentáři tabulky. Přepíše tím ale původní komentář. Adminer proto nově získá komentář z jiného zdroje a chybu zobrazí jako chybu.
  8. PostgreSQL: V PDO jsem opravil export boolean sloupců.
  9. SQLite: Přidal jsem podporu fulltextového vyhledávání a ostatních virtuálních tabulek.
  10. MS SQL: Podporované typy se nyní načítají přímo z databáze.
  11. Pluginy ovladačů se od předchozí verze kompilují podobně jako Adminer, takže jsem jim mohl přidat typové anotace.
  12. Přidal jsem vzhled cPanel, který se mi líbí i sám o sobě.
Jakub Vrána, Adminer, 7.9.2026, diskuse: 7

Adminer 6.0.1

Všech změn je opět velké množství, popíšu jen ty nejzajímavější.

Adminer začínal s premisou „nahraj ho vedle dat a spusť“. Postupně se od ní ale začal vzdalovat. Verze 4.6.3 zakázala přihlášení bez hesla, verze 6.0.0 pak i případ, kdy ho uživatel zadá, ale server ho nevyžaduje. Řešení vždycky existovalo – nahrát plugin do adresáře a nakonfigurovat ho. Ale to je nad síly skupiny uživatelů, o které nechci přijít. Nová verze to proto zjednodušuje. Plugin pro přihlášení bez hesla je nově přímo součástí instalace jako Adminer\Password a pokus o přihlášení bez hesla vypíše kód pro jeho konfiguraci.

Utratil jsem tokeny v hodnotě $700 na bezpečnostní scan (naštěstí v rámci předplatného). Přinesl výsledky – našel menší bezpečnostní nedostatky v pluginech a chyby, které vyžadují značnou míru social engineeringu. Říkám jim self-XSS – např. jste si nejprve museli vytvořit typ se speciálními znaky a při zobrazení jeho nápovědy došlo k chybě. Problém reálný, ale těžko zneužitelný.

Adminer šel odjakživa spustit ze zdrojových kódů. Vyžadoval ale pevnou strukturu podadresářů, takže nemohl běžet třeba na http://localhost, vždycky to muselo být aspoň http://localhost/adminer/. Teď jsem kód přeskupil tak, že stačí soubory v adresáři adminer/ a adresář může být pojmenovaný libovolně.

Vylepšil jsem podle mě málo používanou stránku Schéma databáze, která nově tabulky vykreslí do více sloupců podle jejich vazeb. Šipky můžou nově vést i zprava.

Vyhledávání dat ve všech tabulkách jsem vyřešil snad už pro všechny typy. Tady se nesmírně hodil robot – prostě si udělal matici TYP × OPERÁTOR × HODNOTA pro všechny ovladače a jel, dokud mu to celé neprošlo.

Na stránce editace jsem nechal vypsat dotaz, kterým se záznam získal. Obdobný je už léta na výpisu dat.

Do importu jsem přidal ukazatel průběhu uploadu. Vypadalo to jednoduše, ale zkomplikovalo se to kvůli tomu, že Adminer používá vlastní session_name(), aby nekolidoval s ostatními stránkami.

Ovladač pro Elasticsearch nyní funguje i s OpenSearch.

Pluginy

Zvýrazňovače syntaxe pro pluginy ovladačů byly dřív přímo současí Admineru. Ale pak jsem přidal 5 kB klíčových slov pro Redis a přestalo se mi to líbit. Pluginy ovladačů si proto zvýrazňování syntaxe nově nesou v sobě.

Vytvořil jsem plugin jménem plugins, který v UI informuje o pluginech, které jdou na daném místě použít. Jako okrajová záležitost je ale jen na Gistu.

Interní změny

  • Kód nechávám kontrolovat i některými pravidly PHPStan strict a Slevomat Coding Standard.
  • Adminer má slušné pokrytí E2E testy. Přidal jsem 5 dalších testů pro všechny ovladače, které pokrytí ještě zvýšily.
  • Testy jsem přidal i pro některé pluginy.

Adminer jsem zpřístupnil také jako plugin pro cPanel.

Jakub Vrána, Adminer, 14.8.2026, diskuse: 3

Starší články naleznete v archivu.

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.