Adminer 2.2.0
Školení, která pořádám
Nová verze nástroje pro správu MySQL databáze Adminer přináší dvě hlavní novinky:
- Na stránce s informacemi o serveru se zobrazuje i přehled dostupných databází spolu se způsobem porovnávání a počtem tabulek. Na této stránce lze databáze také hromadně smazat (což občas potřebuji).
- Ve změně tabulky bylo málo místa na vyplnění hodnot typů
enum
a set
. Nechtělo se mi jen kvůli těmto dvěma typům políčko zvětšovat, proto se zvětší až když získá focus.
Vedle toho došlo k několika drobným změnám z oblasti použitelnosti:
- Odkazy pro práci s tabulkou se ve výpisu i v zobrazení struktury tabulky zobrazují hned pod nadpisem. Odkaz na sebe sama ve výpisu dovoluje rychle zrušit nastavené filtry.
- V potvrzovacích dialozích např. při mazání se nově zobrazuje počet ovlivněných záznamů. Narážel jsem na to především u odesílání e-mailů (součást Editoru), kde jsem napsal zprávu a po jejím odeslání jsem se dozvěděl, že byla odeslána na 0 vybraných adres.
- Při výpisu dat v tabulce se nyní z URL adres automaticky vytváří odkazy. Z bezpečnostních důvodů ale nevedou přímo na cílovou stránku, ale na mezistránku, která na ně provede přesměrování. Důvodem je to, že prohlížeče na cílovou stránku v hlavičce
Referer
posílají adresu stránky s odkazem. A ta může jednak obsahovat session identifikátor (pokud má uživatel nebo PHP vypnuté cookies) a jednak může být sama o sobě citlivá (aby třeba někoho nenapadlo na stránku přijít a zkoušet různé kombinace loginu a hesla). Proto přesměrování neprobíhá přímo přes aplikaci, ale přes veřejně přístupný skript. Přesměrovává se hlavičkou Refresh
, která Referer
nepředává.
- V textech se nyní kromě konců řádek zobrazují i opakované mezery a tabulátory. Opakované mezery by se daly samozřejmě vyřešit převodem všech mezer na nezlomitelnou mezeru, to by ale zbytečně prodloužilo výstup, proto jsem použil funkci
preg_replace('~(^| ) ~m', '\\1 ', $string)
. Podpora tabulátorů je nedokonalá, jednoduše se zaměňují za 4 mezery. Místo dosazování pevných mezer jsem nakonec použil styl white-space: pre
.
Opravil jsem také několik chyb:
- Úprava tabulky nedokázala detekovat odstranění výchozí hodnoty.
- Donedávna se nedalo spolehlivě bránit proti útoku ClickJacking. Moderní prohlížeče ale podporují hlavičku
X-Frame-Options: deny
, kterou Adminer nově posílá.
V Editoru bylo změn více:
- K e-mailům lze přikládat přílohy.
- Při zadávání data lze vynechat rok.
- Do vyhledávání jsem přidal alespoň dva základní operátory.
- Čísla se při výpisu zarovnávají doprava. V Admineru jsem to zatím neudělal, protože zarovnávání prodlužuje výstup (Firefox totiž nepodporuje značku
<colgroup>
, takže je každý řádek nutné zarovnávat zvlášť).
Dvě změny jsem také provedl v přizpůsobení:
- Značku
<h1>
jsem přesunul do metody $adminer->navigation
, protože ji např. WordPress plugin potřebuje změnit.
- Funkci s ošklivým názvem
get_dbh
jsem přejmenoval na connection
.
Udělal jsem také několik interních změn, které by se navenek pokud možno neměly nijak projevit:
- SQL příkaz se pokusí nastavit množství potřebné paměti. Doufám, že to bude opravdu vždy stačit a pro uživatele to nebude matoucí (pokud je v konfiguraci vyšší hodnota a Adminer přesto skončí chybou nedostatku paměti).
- Pro výpis checkboxů a HTML selectů jsem vytvořil jednoduché funkce, které vedly ke zmenšení výsledné velikosti aplikace.
Diskuse
Jakub Vrána :
Pravděpodobně se stránka načetla z keše, zkus refresh.
PeTaX:
Udělal jako první. DTTO.
Patrick:
Chtěl bych se zeptat, pokud v editoru upravuju jeden záznam, po uložení se výpis vždy vrátí na první stránku. Je možné nějak nastavit, aby se vrátil na tu stránku, na které jsem byl před editací? Prošel jsem dokumentaci i zdrojáky... ale stejně jsem na to nepřišel....
Jakub Vrána :
On je problém v tom, že když je zapnutý nějaký filtr a záznam změním tak, že do tohoto filtru nespadne, tak by se mohla zobrazit stránka bez jakýchkoliv záznamů. Proto to nechám tak, jak to je.
Sám pro to používám trik – záznam označím a upravím ho pomocí tlačítka pod tabulkou. U toho v URL zůstanou všechny parametry, takže se pak vrátí na stejnou stránku.
David Grudl:
Není nejjednodušší pevné mezery zapisovat přímo znakem? Je to o 50% úspornější než entita (chápu že je to OT kvůli white-space: pre).
Jakub Vrána :
Byl bych pro, ale z nějakých důvodů udržuji zdrojový kód kompatibilní s jednobajtovými kódováními (kromě překladů). Ty důvody už jsem nicméně zapomněl :-).
David Grudl:
A co "\xc2\xa0" - ejhle, ono je to o 66% menší :)
papundeklová paní:
ryze teoreticky, toto je zase závislé na normě Unicode, ne?
těžkotonážní pusa:
"Firefox totiž nepodporuje značku <colgroup>, …"
Byla bych pro to optimalizovat podle normy, ne podle prohlížeče ;-)
(on ho stejně za nějaký čas FF podporovat začne)
Jakub Vrána :
Já optimalizuji především podle sebe. A vzhledem k tomu, že používám Firefox, tak to nebudu řešit značkou <colgroup>, kterou nepodporuje.
A s tou podporou bych to tak slavně neviděl. Jde o bug #915 (teď jsme pro představu za půl milionem) z roku 1998: https://bugzilla.mozilla.org/show_bug.cgi?id=915.
v6ak:
Uf, když jsem viděl to číslo bugu, udělalo se mi nevolno.
jája:
> "Já optimalizuji především podle sebe..."
ajajaj. špatně. velmi špatně.. :-(
Jakub Vrána :
Právě naopak. Udělat něco pro sebe je v open-source ta nejlepší motivace. Jinak to většinou není dotažené a od toho to je open-source, aby si každý mohl udělat to, co potřebuje.
jája:
Nádhérná ukázka toho, jak si protiřečíš ;-)
cvičební úbor:
Tentokrát něco méně důležitého - dotaz na nastajlování pomocí CSS. Prosím, prosím, nešlo by v několika málo případech, jako je:
* řádek s odkazy pro manipulaci s tabulkou
* řádek s příkazovými tlačítky
* řádek s vlevo nahoře ("SQL příkaz | Export | Odhlásit")
* řádek se stránkováním výpisu tabulky
přidat do <p> nějakou třídu, aby se to v CSS dalo "odchytit"?
Vím, že už jsi předtím na něco podobného odpovídal a tvůj argument byl ten, že by se tím znatelně zvýšila velikost výsledného HTML kódu. To však není tento případ. Jde jen o to na pár místech připsat: ‘ class="něco" ’.
Jakub Vrána :
A nedaly by se na to napsat malinko složitější selektory? Když se podívám na současné vzhledy, tak ty si s tím zdá se poradily.
cvičební úbor:
Zkusme to úplně konkrétně:
(nejsem specialista na CSS; jako referenční prohlížeč používám Firefox)
* řádek s odkazy pro manipulaci s tabulkou)
#content p:fist-child a{margin:auto 0.5ex;}
nefunguje :-(
#content p a{margin:auto 1em;} /* zvětšíme mezery mezi odkazy */
#content p a:first-child{margin-left:0;} /* u prvního odkazu zrušíme mezeru nalevo */
#content p code a{margin:auto;} /* zrušíme mezery u jush odkazů v použitém SQL kódu */
toto postihne stránkování a případné další odkazy v divu obsahu
v dalším příkladu se pokouším pomocí CSS nahradit odkazy "vypsat" v levém sloupci obrázkem (ohledně tohoto jsi taktéž někomu odpovídal a říkal jsi, že pro větší použitelnost (net usability) by tam měl zůstat odkaz slovně - toto respektuji, ale já si chci udělat CSS buď jen pro mě nebo pro ty, kteří chtějí ušetřit místo, jsou zvyklí na phpMyAdmina a je jim jasné, že ta první ikonka bude znamenat vypsání tabulky)
Výpis odkazů pro přehled tabulek a jejich vypsání je v současné době v jednom odstavci, ve kterém je za každým 2. odkazem "<br />". Není mi znám způsob, jak odchytnout každý druhý odkaz a přiřadit mu jiné CSS vlastnosti. Zkoušel jsem to např. přes odlišnost v cílové adrese (odkaz "vypsat" obsahuje parametr "select"):
#tables a[href~=select]{
background:no-repeat left top url(data:image/gif;base64,R0lGODlhDwAKALMAAAQCBJSOj9HP0Zzu/FlbWcPAwezs8fv9+2yazDRqhB8hJ3x6fGSarHR6pNze5KSmpCH5BAEAAAcALAAAAAAPAAoAAwQ+8MhJqzQHP1GClYFCAIACEFVAiElQNspCPYRwDIWSGMbpWIhEAvFzFSwGBgMjKTB5mYPAVrB9qoEFj/npSiIAOw==);
font-size:0.0001pt;
display:inline-block;
width:16px;
}
ale bohužel ani toto nefunguje (zjistil jsem, že by v href muselo být pouze ono "select", což je na nic :-( )
Jestli někdo zdatnější v CSS na něco přijdete, určitě to sem napište, ale já si stejně myslím, že není nic proti ničemu na pár místech prostě dopsat ‘ class="název_třídy" ’.
cvičební úbor:
zapomněl jsem napsat:
* jak je naznačeno u mého prvního příkladu, tak přístup z hlediska CSS je (konkrétně u těch mezer) ovlivnit všechny odkazy a následně vyjmenovávat všechny případy, kdy to platit nemá, a u nich to zase dávat do pořádku nastavováním oné mezery na nějakou pevnou hodnotu. Velmi neelegantní ;-) Na druhé straně, CSS třídu nebo identitu by šlo jednoduše "chytnout" a upravit ji, aniž by se rozhodily ostatní prvky.
kozotoč:
cvičební úbore, podívej se na stránky adminu, je tam jedna šablona od jakéhosi Martina Hořínka, která si s tím poradila. Při pohledu přímo do ní zjistíš, že je to docela masakr (a nota bene jen pro ty "lepší" prohlížeče), ale jde to ;-)
Jakube, ale když už na to „cvičební úbor” narazil, tak např. u tabulky s výpisem jejích polí byl mohl každému lichému řádku přidat třídu "odd" (stejně jako to děláš u výpisu). To bys teda udělat mohl B-)
kozotoč:
5 sekund poté zjišťuju, že sudé řádky jde taky podchytit a to přes jakousi CSS třídu nth-child:
tr:nth-child(2n){background-color:#abc;}
ale ta platí to (resp. bude to fungovat) jen u prohlížečů s podporou CSS v. 3+, tak nevim, asi by class="odd" za to přecijen stála
Jakub Vrána :
Přidal jsem třídy .tabs, .logout a .pages. Jestli jsou potřeba ještě nějaké další, tak je prosím přesněji popiš.
A doufám, že ten styl pak dáš k dispozici a že bude stát za to :-).
cvičební úbor:
Jestli bude stát za to nevím - to musejí posoudit ostatní.
Každopádně tady je link:
http://leteckaposta.cz/264469395Pozn.: prej platí jen 25 dní, takže doufám, že to během té doby stáhneš a -pokud nebude problém- přidáš na adminer.org
v6ak:
Tak jsem taky aktualizoval a všiml jsem si jedné nepříjemné věci: Nahoře mám: Struktura tabulky | Pozměnit tabulku
Kdykoli chci vidět strukturu, klikám na Struktura tabulky. Řešení tu může být více:
* zvýrazňovat aktuální (v případě, že nejsem na struktuře, to nepomůže)
* Struktura tabulky -> Zobrazit strukturu
Je to spíš drobnost, ale otravuje to.
Jakub Vrána :
Nerozumím větě „Kdykoli chci vidět strukturu, klikám na Struktura tabulky.“ To je snad v pořádku, ne?
v6ak:
Spletl jsem se. Chtěl jsem napsat, že kdykoli chci _upravit_ strukturu, klikám na Struktura tabulky. A to, jak jistě uznáš, ač zní logicky, nevede ke správnému výsledku. Proto jsem navrhl ty úpravy.
Šimoník:
Nejde mi upravovat tabulka, kde jsou dlouhé texty.
Píše to :
Request-URI Too Large
The requested URL's length exceeds the capacity limit for this server.
Jde s tím něco udělat?
Díky
Jakub Vrána :
Nejlepší je do tabulky přidat nějaký unikátní klíč, pomocí kterého se na jednotlivé záznamy bude dát odkazovat.
Jinak lze použít tlačítko Upravit pod tabulkou se záznamy (po zaškrtnutí políčka u editovaného řádku). To přenáší data POSTem.
Šimoník:
Zkoušel jsem importovat sql soubor 17MB (vznik z předchozího exportu z jiné databáze) a píše to "Soubor nelze nahrát". Nebylo by lepší při exportu vytvořit PHP soubor s příkazy pro create a insert do databáze?
Jakub Vrána :
Lepší by to nebylo, protože by se tím zhoršila možnost použít export jinde. Doporučuji export nahrát na server pomocí FTP jako adminer.sql a spustit ho k tomu určeným příkazem.
Šimoník:
Tak teď nevím, jak to myslíš. Já to nahraji pomocí FTP a pak v admineru dám SQl, nahrání souboru a to právě vyhodí tu hlášku Soubor nelze nahrát". Jak jde jinak spustit ta záloha? Díky
Jakub Vrána :
Nahrání souboru nahraje soubor z lokálního disku. Pod tím je ještě:
Soubor adminer.sql[.gz|.bz2] na webovém serveru - Spustit soubor
To spustí soubor z disku webového serveru.
Šimoník:
No on adminer 2.0.0. odmítá provést jakýkoliv sql příkaz.
Šimoník:
Ještě upřesňuji - adminer 2.1.0 stejné příkazy vykoná bez problémů.
Diskuse je zrušena z důvodu spamu.