Adminer 3.0.0

Školení, která pořádám

Největší novinkou třetí verze nástroje pro správu databáze Adminer jsou ovladače pro SQLite, PostgreSQL, MS SQL a Oracle. Stejné uživatelské rozhraní, na které jste zvyklí při správě MySQL, tedy můžete využívat i při správě jiných databázových systémů. Kromě toho přibylo i spousta dalších nových vlastností, které správu databáze zpříjemní.

Nové ovladače

Podpora pro nové ovladače ještě není zcela dokonalá, ale základní funkce jako výpis i úprava dat a struktury tabulek fungují. Kromě toho je k dispozici i podpora některých obratů, které v MySQL nejsou – především schémata, sekvence a uživatelské typy.

Podpora dalších ovladačů samozřejmě zvýšila celkovou velikost aplikace, nicméně jde stáhnout i verze pouze pro MySQL a sami si můžete zkompilovat verzi pro jakýkoliv jiný ovladač. Při kompilaci se odstraní funkce, které ovladač nepodporuje.

Při vývoji ostatních ovladačů jsem trochu spoléhal na práci komunity, to se ale bohužel příliš nesplnilo. S verzí pro MS SQL trochu pomohli na ČVUT, většinu kódu jsem ale stejně musel napsat nebo přepsat. Nicméně pokud se chcete na vývoji pro ostatní ovladače podílet, tak mě neváhejte kontaktovat – hlavní práce už je hotova, teď už to zbývá jen vymazlit.

Verze pro jiné databázové systémy si vyžádala i změnu ikony.

Vícenásobné přihlášení

Adminer umožňoval z jedné instance přihlášení na více různých serverů, na tuto funkčnost se nicméně nedalo doklikat. Nová verze umožňuje kromě toho také přihlášení pod více uživatelskými jmény na stejný server. Na přihlašovací formulář se navíc dá dostat z drobečkové navigace bez potřeby odhlášení. U přihlašovacího formuláře se nově zobrazuje seznam aktivních přihlášení.

Důsledkem této změny je, že se v URL přenáší i uživatelské jméno, pokud tedy máte třeba v záložkách uložené odkazy dovnitř Admineru, tak si je změňte.

Trvalé přihlášení

Možnost trvalého přihlášení už Adminer má od verze 2.3.0. Její funkčnost nicméně z důvodu bezpečnosti vyžadovala vytvoření jednoduchého rozšíření, takže tato funkčnost asi zůstala většině uživatelů skryta. Proto jsem tuto možnost doplnil i do základní verze. Klíč nutný pro zašifrování hesla ukládaného do cookie se nyní při žádosti o trvalé přihlášení zkouší vytvořit v adresáři upload_tmp_dir. Když se soubor nepodaří vytvořit nebo když ho později někdo smaže, tak se zapamatuje pouze přihlašovací jméno. Spolehlivější proto zůstává vytvoření vlastního rozšíření.

Příkladem pro toto chování mi byl Skype, který je podle mě úspěšný z ryze pragmatických důvodů – používá sice uzavřený protokol, ale je schopný se všude protunelovat.

Hromadná změna záznamů

změna záznamu přímo ve výpisu Adminer nabízí hromadnou změnu záznamů – několik se jich označí a vyplněním formuláře se všechny stejně změní (nicméně jde provádět i relativní operace jako třeba přičtení čísla k původní hodnotě). Tuto funkčnost často používám. Někdy je ale potřeba změnit najednou více záznamů a přitom každý jinak. Sám si k tomu obvykle otevřu více panelů prohlížeče a změny udělám v nich, to je ale přeci jen poněkud nepohodlné a pomalé.

Asi rok jsem přemýšlel nad implementací této funkce a nakonec jsem na to myslím kápnul. Nově lze tedy změnit hodnotu ve výpisu tak, že na ni dvojkliknete – tím se zobrazí vstupní políčko, které stačí vyplnit a potvrdit Enterem nebo spodním tlačítkem Uložit. Ve Firefoxu a Internet Exploreru dokonce kurzor skočí na místo, na které jste klikli. Funkce je tak návyková, že jsem přemýšlel o její implementaci i na ostatní místa aplikace (třeba do editace komentářů), to by ale asi bylo zbytečné.

Funkce je pro uživatele poměrně skrytá. Nicméně si říkám, že zvědavé hlavičky napadne kliknout na spodní tlačítko Uložit, což zobrazí patřičné pokyny.

Výkonnost

Zobrazení přehledu velkých tabulek je časově náročná operace. Proto se nyní nejprve přehled zobrazí pouze jednoduchý a podrobné informace se doplní až JavaScriptem, během čeho už lze se stránkou pracovat.

Stejný postup jsem využil i pro zobrazení počtu tabulek v jednotlivých databázích.

U velkých tabulek typu InnoDB trvá dlouho i zjištění celkového počtu záznamů. Proto se nyní ve stránkování výpisu dat zobrazuje pouze jejich přibližný počet s vytvořeným odkazem na poslední stránku (ten lze použít i u jiných tabulek – page=last).

K optimalizaci došlo i v externím zvýrazňovači syntaxe, který nyní pracuje po částech, takže dovoluje se stránkou pracovat i během zvýrazňování.

Použitelnost

Závěr

Beta verze byla vydaná asi před měsícem bez velkého halasu (článek o číslech verzí aplikací jsem vlastně psal jako úvod k informaci o vydání beta verze). Verze pro MySQL je stabilní a funkční a má tolik novinek, že se rychlý přechod na ni myslím vyplatí. Verze pro ostatní databázové systémy tak vyladěné ještě nejsou, nicméně i tak už jsou podle mě lepší než leckterá konkurence.

Zdrojové kódy se přesunuly z SVN na Git a Vlasta Neubauer vytvořil na GitHubu vlastní verzi, z které jsem převzal několik změn. Za to mu náleží velké uznání, děkuji.

Děkuji také všem překladatelům, kteří stihli aktualizovat své překlady.

Jakub Vrána, Adminer, 15.10.2010, diskuse: 57 (nové: 0)

Diskuse

Pari:

Zrovna včera jsem si na Adminer vzpomněl, když mi VPS hosting s defaultním phpmyadmin nechtěl importovat 10MB databázi. Adminer to zvládl v pohodě! Díky za skvělý nástroj.

ikona v6ak:

To vysvětlení zkratky u středníku ohledně exportu do CSV tam je jako provokace, že? Ono by se to pak mělo jmenovat spíše SSV (semicolon-separated values) ;-)

kesspess:

Přidávám se s velkým díky!

paranoiq:

ještě jednou dík Jakube. jen upozorním, že můj fork teď není aktuální. vzal jsem to za špatný konec a sypal jsem do master větve věci obecné i věci pro vlastní použití. teď když už vyšla 3, tak to aktualizuji. taky pošlu upravený styl

Mordae:

Diky Jakube, jsem u Admineru od zacatku phpyMinAdminu a neprestavam zasnout. Rychle, efektivni, ergonomicke, neni tomu co vytknout. Diky za Tvoji tvrdou praci!

Jiří Koutný:

Díky Jakube za Adminer! Už od bety se mi nedaří otevřít v Admineru SQLite soubor. Zvolím Systém: SQLite 3, Server: C:\db.sqlite, jméno a heslo nechám prázdné.

Po přihlášení nevidím ale v levém sloupci žádné tabulky. Dělám něco špatně? Přes SQLite Manager https://addons.mozilla.org/en-US/firefox/addon/5817/ vše funguje.

Díky

ikona Jakub Vrána OpenID:

Ono totiž SQLite žádný server nepoužívá, takže server, login ani heslo není potřeba vyplňovat. Název souboru s databází se píše do políčka pro výběr databáze v levé navigaci po přihlášení.

Máš nějaký nápad, jak to udělat intuitivnější?

Jiří Koutný:

Díky za radu, to by mě skutečně nenapadlo. Nejlepší by samozřejmě bylo udělat úvodní přihlašovací dialog na míru konkrétního DB systému. Pro SQLite bys zahodil nerelevatní pole "Server", "Uživatel" a "Heslo" a nechal uživatele rovnou zadat cestu k souboru s DB.

Implementačně jednodušší možností je přidání nějakého labelu nebo popisku k políčku pro vložení cesty k souboru s DB (např. "Cesta k SQLite souboru:" ?). Zdaleka to ale není ideální.

ikona Jakub Vrána OpenID:

Nakonec jsem to udělal tak, že při výběru SQLite zmizí pole pro výběr serveru, loginu a hesla. Databáze se vybírá na stejném místě jako u ostatních systémů.

3CK:

Také jsem u Admineru již od počátku phpMinAdminu a zcela se ztotožňuji s názorem uživatele Mordae.
Snažím se všude, kam to jde, nacpat Adminer a i přes počáteční odpor typu: "Ale vždyť je tu skvělý phpMyAdmin!" se prakticky vždy ujal s nadšením. Díky!

ikona v6ak:

Proč verze 3.0 nejde skrze aktualizace?

Jinak, ještě jsem se nedíval, jak jsou řešeny SQLite databáze, ale obávám se, že půjde takto editovat jakoukoli přístupnou databázi na serveru. Pokud by šlo databáze i vytvářet, bylo by to ještě horší, protože by asi celkem snadno šlo vytvořit DB foo.php (popř. foo.php.sqlite) a dát do ní vlastní kód.

Samozřejmě, nesprávné použití může být obecně rizikem. Pokud budu mít roota k dispozici z localhostu bez hesla a Adminera zpřístupním z jakékoli IP, je o zábavu postaráno. Ale problém se SQLite asi nemusí být na první pohled tak zřejmý.

ikona Jakub Vrána OpenID:

Automatické aktualizace nejsou příliš agresivní – je zbytečné, aby se třeba každý den zkoušelo, jestli náhodou není nová verze, když vychází tak jednou za měsíc nebo ještě mnohem později. Takže cookie s informací o aktuální verzi přežije týden a pak se teprve zkontroluje znovu.

Co se SQLite týče, tak jde skutečně editovat jakákoliv databáze dostupná na serveru. Není to nic, co bys nemohl udělat vlastním skriptem. Stejně tak jde databáze i vytvořit všude, kde ti to dovolí vyšší vrstva (open_basedir v PHP a práva souborového systému).

Pokud se to dá někam na server nezabezpečené, může to být samozřejmě problém. Máš nějaký konstruktivní návrh řešení? Podotýkám, že jde stáhnou verze jen pro MySQL.

Já obdobný problém řeším i s MySQL. Používám totiž mysql.default_user a spol., takže se o zabezpečení musím postarat rozšířením.

ikona v6ak:

Aha. Jednou za den by to asi taky moc nevadilo.

K zabezpečení: napadá mě jen pomocí rozšíření uvádět seznam a případně to chránit jménem a heslem. Způsobů definice lze určitě vymyslet mnoho. Třeba:
<?php
'foo/bar.sqlite'=>array(
  'user'=>'franta'
  'pwd_hash'=>1a3dd05931c1f7703c08f7ac95c09a813bcc0f22
 
'pwd_cakkback'=>'sha1'
)
?>

Mohlo by to být i uživatelsky přívětivější, protože by to nabídlo seznam DB.

Situace, kdy člověk nastaví default user apod. je něco jiného. To si člověk uvědomí mnohem spíše než toto. Pokud si představím, že mám web, který okrajově používá SQLite (třeba aplikace třetí strany) a nahraju k němu Adminera (pro jistotu s podporou všech DB), může to být průšvih.
Navíc nevím, jak se to bude chovat v případě souborů jiného formátu (poškození souboru?) nebo neexistujících souborů (vytvoření nové DB s možností PHP/HTML?).

Mimochodem, šel by Adminer povolit jen ze stejného počítače?

ikona Jakub Vrána OpenID:

Pomocí rozšíření by to šlo samozřejmě vyřešit mnoha různými způsoby, nejjednodušší je přepsat metodu login().

Otevřít jde jakákoliv SQLite databáze, ke které má uživatel přístup. Formát souboru se kontroluje už na úrovni PHP.

Do Gitu jsem přidal kontrolu koncovky vytvářených SQLite databází. Povoleny jsou pouze .db, .sdb a .sqlite. Když chce člověk jinou, tak si ji musí vytvořit s touto koncovkou a přejmenovat ručně.

Kontrola stejné adresy je jednoduchá, stačí do metody login() přidat:

<?php
if ($_SERVER["REMOTE_ADDR"] != $_SERVER["SERVER_ADDR"]) {
    return false;
}
?>

ikona v6ak:

Jasně, ale chce to adminer umístit mimo document root nebo jej přejmenovat nebo jinak zakázat jeho samostatné vykonání, což už pak ztrácí kouzlo. Co kdyby hledal soubor adminer.cfg.php, ve kterém by hledal defaultní nastavení?

U SQLite by mi přišlo lepší, kdyby to uživatel musel explicitně povolit a případně i zabezpečit heslem. Ale i toto by mohlo být použitelné.

ikona Jakub Vrána OpenID:

Žádnou konfiguraci dělat nechci.

ikona v6ak:

Pokud by byla nepovinná?

ikona Jakub Vrána OpenID:

Ani tak. Já prostě konfiguraci nemám rád.

bene:

Parádní nástroj.

Jen mi při výpisu struktury tabulky chybí defaultní hodnoty. Když to potřebuji musím jít do změny tabulky a navíc ještě na konci zaškrtnout, že je chci zobrazit (to by mohlo být zapnuté pořád, nebo si to zapamatovat do cookie). Je to docela otravné.

Taky mi od Verze 3.0 dělá problém na výpisu tabulek, když mám v komentáři tabulky zpětné lomítko. Nezobrazí se nebo se zobrazí nějaký špatný znak.

Dík

ikona Jakub Vrána OpenID:

S výchozími hodnotami to promyslím. Já je skoro nepoužívám, takže mi všude spíš překáží.

Výpis komentářů tabulek jsem opravil v Gitu, díky za report.

ikona David Grudl:

Super! Obrovský skok kupředu, především v těch nenápadných drobnostech.

cvičební úbor:

Zdravím, Jakube, a děkuji za novou verzi.
Pár poznámek ke změnám záznamů přes dvojí kliknutí:
1 Komplikace s hodnotou NULL (u typů, u kterých je NULL definováno):
1.1 u textových typů: když odešlu prázdný řetězec, uloží se prázdný řetězec => OK, chová se to, jak je očekáváno, přestože takto nelze přímo uložit hodnotu NULL (to lze uložit přes odkaz ''Upravit'', takže je vše v pořádku)
1.2 u typu enum: když odešlu prázdný řetězec nebo hodnotu, která není mezi vyjmenovanými možnostmi, uloží se speciální hodnota ''prázdné'' => podobně jako u textových typů (nelze takto vložit NULL (ale moc to nevadí, protože to není časté ani obvyklé)). Není to prioritní, aby se to muselo hned řešit, nicméně trošku zamrzí, že není žádná nápověda, které hodnoty je vůbec možné zadat - pokud si to uživatel hned nezkontroluje, jeho zadaná hodnota se může změnit na ''prázdné'', zatímco on bude v domnění, že hodnotu změnil (CHYBA). Vychytávkou by tedy bylo nabídnout v případě enum přímo <select>.
1.3 u typu set:
1.3.1 - zadání prázdného řetězce nastaví hodnotu ''prázdné'' - NULL zadat přímo nejde, ale dejme tomu.
1.3.2 - pokus o zadání více hodnot - v uvozovkách a oddělených čárkou - skončí nastavením hodnoty "(prázdné)"
1.3.3 - (pokus o) zadání více hodnot - oddělených čárkou - nastaví pouze první z nich (zajímavé chování, nicméně opět něco jiného, než by uživatel očekával.)
Zadání více hodnot typu set v této verzi pravděpodobně nejde (resp. jsem na něj nepřišel).
1.4 u číselných typů: když odešlu prázdný řetězec, uloží se 0 - CHYBA, podle mého názoru by se mělo uložit NULL.
2 Asi by nebylo na škodu (a zřejmě by to nebylo ani moc práce) přidat možnost zrušit zadávání klávesou Escape. Při odentrování -jak jsem rychle zjistil- se ukládají VŠECHNY rozkliknuté hodnoty a u některých z nich si to uživatel třeba mohl rozmyslet (ale už hodnotu přepsal), takže si myslím, že ta možnost zpět by tam měla být.
3 Hlášky:
3.1 Kladně kvituji, že:
3.1.1 se pamatuje na typ (medium/small/tiny)text a místo <input type="text"> se zobrazí <textarea>. Možná by ale mohla mít nastavenu nějakou minimální šířku/výšku.
3.1.2 pro bloby se zobrazí hláška, že jejich hodnotu takto nelze měnit
3.2 Naopak, hláška "Ke změně této hodnoty zvyšte délku textů" (u dlouhých textů) mi trochu trvala, než jsem pochopil, co se tím myslí. Možná by to chtělo nějak přeformulovat. ("Délka textů" je imho příliš obecné, aby každý hned pochopil, že je tím myšleno ono políčko v záhlaví výpisu.)
3.3 Ještě, když jde o ty hlášky - máš jejich texty opakovaně a implicitně specifikované v každé buňce. Co třeba definovat je jednou ve funkci a pak v onbldclick="" volat už jen ji? Pokud vím, v minulých releasech jsi psal, že ti mj. záleží i na délce výsledného HTML kódu, takže toto je konkrétní nápad, jak ji snížit.

cvičební úbor:

Pár doplnění
* Bod 3.1.1 s hláškami samozřejmě nesouvisí, to pardon.
* Největší úskalí změny záznamů přímo z tabulky vidím u textů přesahujících maximální délku pro výpis. Přemýšlel jsi o tom, že by jejich obsah mohl načítat AJAX? Pokud by selhal, mohl bys teprve hodit hlášku, že to u nich nejde.

ikona Jakub Vrána OpenID:

Taky jsem o AJAXu přemýšlel. Ale když uživatel dvojklikne, tak očekává, že se mu editační políčko hned zobrazí a ne že na něj teprve začne čekat. Dospěl jsem k tomu, že i pro uživatele bude nejlepší, když si Délku textů nejprve zvýší nebo zvedne a pak už edituje bez čekání.

ikona David Grudl:

Přiznám se, že co se myslí tou Délkou textů, začínám chápat teprve z této diskuse a stejně mi to připadá divné. Proč zvedat nějaký konfigurační parametr, když bůh stvořil AJAX?

ikona Jakub Vrána OpenID:

Jak jsem psal – když dvojkliknu, tak očekávám okamžité zobrazení editačního políčka. Ale zkusím to změnit v AJAXové větvi.

cvičební úbor:

To se nedá úplně tímto argumentem odbýt.
* částečně ne - odpověď nemusí být a často není okamžitá (právě proto, že je to AJAX, který "putuje" na server a zpět).
* částečně ano - uživateli by se (právě z těchto důvodů) mělo dát nějak najevo, že byl zaznamenán jeho požadavek, že se vyhodnocuje a že to chviličku potrvá

* Adminer je sám o sobě specifický tím, že s ním pracují většinou programátoři a databázisti, kteří nejsou úplně BFU
* Navíc uznej, že spoustu jiných věcí takto intuitivních a vysvětlených v admineru není - třeba právě to, že by šlo na buňky vypisované tabulky klikat.
* V této verzi mi neschopnost editovat texty delší než X znaků přijde jako dost zbytečné omezení a vidím to jako velkou škodu.
* Když si objektivně srovnáš výhody a nevýhody, tak přece musíš dojít k závěru, že to vychází jednoznačně pro AJAX.

Napadá mě... co třeba změnit to políčko na <input type=text disabled value="načítám...">? Nebylo by toto řešení?

ikona Jakub Vrána OpenID:

Před sepsáním příspěvku ses mohl podívat do Gitu, kde už je to ode dneška implementované :-).

http://adminer.git.sourceforge.net/git/gitweb.…=390e38b8f5137518be1738ea96c50f65ea2ef306

ikona Jakub Vrána OpenID:

Díky za všechny postřehy.
1.3.3 Mě zadání více hodnot oddělených čárkou (bez mezery) normálně funguje. Pošli prosím dump tabulky, kde to nefunguje.
1.4 To je asi rozumné a takhle to mimochodem funguje v Adminer Editoru. Doplnil jsem to.
2 Čekal jsem, kdo to bude chtít první… Já jsem to zatím nepotřeboval a do implementace se mi tedy moc nechce.
3.1.1 Minimální šířku jsem nastavil na 20px.
3.2 Změnil jsem to na „zvyšte Délku textů“ (velké D). Případně navrhni lepší hlášku.
3.3 No tak zrovna tahle hláška je jen u těch nejdelších textů, takže procentuální úspora by nebyla moc velká.

jG:

napada ma:
3.2 zvyste hodnotu konfigurace 'Delka textu' ?

ikona Jakub Vrána OpenID:

To by člověk chtěl jít do konfigurace a začít hledat nějakou takovou volbu.

cvičební úbor:

1.3.3 aha, bez mezery mi to funguje, kromě alternativ, které samy o sobě obsahují čárku (což je další problém). možná by to chtělo i nějakou nápovědu, alespoň v titulku
3.2 Nevím - myslel jsem do té hlášky dostat i to PROČ to nejde.
3.3 Záleží na tom, jak je ta maximální délka nastavená a jak dlouhé ty texty v té tabulce jsou. Může to taky velmi snadno vyjít tak, že to bude na každém řádku.

Kočičác Bonifák:

Čus. Proč se vlastně nezobrazují odkazy "Vypsat data, Zobrazit strukturu, Pozměnit tabulku, Nová položka" při změně struktury tabulky a vkládání nové položky?

Kočičác Bonifák:

Aha. Tak koukám, že už jsi na to odpovídal tady: http://forum.zdrojak.root.cz/index.php?topic=185.msg638#msg638
Jestli na to mohu reagovat:
ad přehlednost) mně nějak nepřijde, že by bez těch odkazů byla stránka méně přehledná.
ad málo využívané) Ono je otázkou, o kolik jsou ty odkazy více využívané než třeba z výpisu tabulky. Nicméně, pár příkladů by se našlo.

Naproti tomu, pokud ty odkazy budou i u změny struktury a vložení do tabulky, bude to mít konzistencí - uživatel si rychle přivykne, že tady na tomto místě bude vždy mít odkazy pro základní úkony s vybranou tabulkou. (Pokud ve dvou případech zmizí, pak se podvědomě nebo v duchu ptá, proč to tak je, zda-li to má nějaký význam a zda-li neudělal on něco špatně a to je podle mě na škodu intuitivnímu ovládání, které je velkou devizou Adminera.)

ikona Jakub Vrána OpenID:

Na stránkách pro změnu tabulky a práce se záznamem uživatel vyplňuje formulář a mohl by omylem kliknout na jeden z těchto odkazů, což by formulář samozřejmě neuložilo. Takže by to možná chtělo ještě detekci změny formuláře a potvrzení, pokud se změnil.

No, moc se mi to dělat nechce.

Tomáš Tatarko:

Potreboval by som poradiť. Chcem Adminer poskytnúť užívateľom redakčného systému (http://opiner-cms.net/) a to takou formou, že v administrácií to bude "vkladané" ako iframe. Ale chcel by som to vyriešiť nejakým spôsobom, aby užívateľ nemusel zadávať prihlasovacie údaje (nakoľko systém ich vie ponúknuť), ale bol už priamo prihlásený a mohol spravovať databázu. Pokiaľ by si mi poskytol nejaký zápis kódu pre uloženie týchto údajov do session (alebo čo je tam používané), bol by som ti vďačný.

ikona Jakub Vrána OpenID:

Doporučoval bych udělat to čistě, tedy pomocí rozšíření. Vnější stránka vloží <iframe src="adminer/?username=">, kde adminer/index.php bude obsahovat:

<?php
session_start
();

function
adminer_object() {
    class AdminerExtension extends Adminer {

        function login($login, $password) {
            return isset($_SESSION["logged"]);
        }

    }

    return new AdminerExtension;
}

include
"./adminer.php";
?>

$_SESSION["logged"] je tvá proměnná vystihující, jestli je uživatel přihlášen. Kromě toho bude potřeba z adminer.php smazat příkaz header("X-Frame-Options: deny"), to jde zatím udělat jen ručně. Pak ještě nejspíš budeš muset nadefinovat metodu credentials(), pokud nepoužíváš výchozí přihlašovací údaje.

http://www.adminer.org/cs/extension/

ikona Jakub Vrána OpenID:

Do Gitu jsem doplnil možnost vypnout poslání hlavičky zabraňující vložení do rámu pomocí rozšíření.

ikona v6ak:

A co na to clickjacking?

ikona Jakub Vrána OpenID:

Hodí se to samozřejmě jen pro specifické použití – já jsem to třeba použil pro demo vložené do prezentace (při jejímž prohlížení jsem nechodil na jiné stránky). Nebo to je v pohodě, pokud session identifikátor posíláš v URL a nepoužíváš trvalé přihlášení. Nebo místo toho můžeš poslat X-Frame-Options: SameOrigin.

waclaw:

prosím o radu - jak zobrazovat v editoru pouze některé tabulky? jde mi o to nezobrazovat tabulku s přihlašovacími údaji… díky!

cucací potřeby:

Zdravím, Jakube.
Mám problémy u tabulek s typem set, jehož počet položek se blíží číslu 32.
Příklad: Spusť si...

-- Adminer 3.0.0 MySQL dump
SET NAMES utf8;
SET foreign_key_checks = 0;
SET time_zone = 'SYSTEM';
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

DROP TABLE IF EXISTS `food_additives`;
CREATE TABLE `food_additives` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `code` varchar(255) NOT NULL,
  `prefix` varchar(10) NOT NULL,
  `number` smallint(6) NOT NULL,
  `postfix` varchar(10) NOT NULL,
  `name_cs` varchar(255) NOT NULL,
  `name_en` varchar(255) NOT NULL,
  `note_en` tinytext NOT NULL,
  `type` set('acidity regulator','alcohol','anti-caking agent','antifoaming agent','antioxidant','artificial sweetener','bleaching agent','colour','colour fixative','emulsifier','firming agent','flavour enhancer','floor treatment agent','food acid','gelling agent','humectant','improving agent','mineral salt','preservative','propellant','regulator','stabiliser','seasoning','sequestrant','stabilizer','sweetener','thickener','vegetable gum') NOT NULL,
  `attributes` set('alergetic','animal origin','approved (AUS & NZ)','approved (EU)','fat soluble','GMO','water soluble') DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `code` (`code`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='pridatne latky (additiva, emulgatory, ...)';

INSERT INTO `food_additives` (`id`, `code`, `prefix`, `number`, `postfix`, `name_cs`, `name_en`, `note_en`, `type`, `attributes`) VALUES
(1,    'E 100',    'E',    100,    '',    'kurkumin',    'turmeric, curcumin',    'colour (yellow and orange)',    '',    ''),
(2,    'E 101',    'E',    101,    '',    'riboflavin, riboflavin-5\'-fosforečnan',    'riboflavin (vitamin B2)',    'colour (yellow and orange)',    '',    '');

Sloupec `type` má 28 alternativ. Když si tabulku otevřu pro úpravy, tak mi server (localhost) při uložení zahlásí "Spojení přerušeno". Verze MySQL: 5.1.37-community-log přes PHP (5.2.10) extenzi MySQLi. Mám pocit, že toto se dělo i v předchozích verzích.

ikona Jakub Vrána OpenID:

V první řadě se zeptám, proč je to vůbec set? Datové typy enum a set se hodí na pevné výčty, jejichž změna znamená i změnu kódu aplikace. Tohle mi připadá jako jasný adept na tabulku M:N.

Chyba byla způsobena PCRE backtrack limitem. Doufám, že jsem to vyřešil použitím possessive kvantifikátoru.

cucací potřeby:

Díky, že jsi tomu věnoval čas - snad se to vyplatilo.
Na první část tvé odpovědi bych jen dodal, že já osobně to (set vs. M:N) vidím tak, že pokud pracuju s případem, u kterého vím, že se alternativy už nebudou měnit, můžu zvolit typ set.

ikona Jakub Vrána OpenID:

To mi právě zrovna tenhle případ nepřijde.

ikona Jakub Vrána OpenID:

Preventivně upozorním na to, že Adminer na 32 bitových systémech nebude ve všech případech správně pracovat s víc než 31-položkovými sety. Opravovat se mi to nechce, bylo by potřeba si vytvořit bitový posun velkých čísel nebo zakázat sety obsahující čárku nebo apostrof nebo více stejných hodnot.

cucací potřeby:

A chtěl bych reportovat ještě jednu chybu.
Postup, jak ji emulovat:
* zakládám novou nebo edituju existující tabulku
* zvolím u sloupečku typ enum nebo set
* do alternativ napíšu první hodnotu
* přepnu se do jiné aplikace a vrátím se zpět
* pokusím se uložit
* skončím s chybou "Syntax error near ') COLLATE 'utf8_general_ci' NOT NULL AFTER `název_tabulky`, COMMENT='' REMOVE PARTITION' at line 2"

Další informace:
* Zdá se, že se chyba stává právě tím přepnutím mezi okny, když je napsaná jenom jedna alternativa enum/set (vím, že to není moc pravděpodobné, aby někdo právě v tomhle okamžiku přepínal okna, ale může se to stát - třeba když ty alternativy opisuje odněkud jinud).
* Když si rozkliknu příkaz, ve kterém došlo k chybě, vidím tam, že ta první alternativa se nezaznamenala - je tam "název_sloupce enum()" resp. "název_sloupce set()", což je příčinou té chyby. (V jiném případě - ale u nějž už nevím, jak ho naemulovat - se mi místo enum() objevilo enum(NULL).)
* Vypadá to, jako by se seznam alternativ u enum/set, pokud je jenom tvořen jenom jednou položkou, nedal do apostrofů.

ikona Jakub Vrána OpenID:

To je feature, nikoliv bug. Jde o to, že Adminer umožňuje vložit i běžný čárkami oddělený seznam hodnot uzavřených do apostrofů. To se může hodit kvůli copy-paste.

Navíc mě nenapadá smysluplný scénář, kdy by enum obsahoval jen jednu hodnotu.

cucací potřeby:

Někdo skutečně může mít v enum jednu hodnotu a tu kombinovat s NULL nebo hodnotou "" (prázdný řetězec), která je k dispozici vždy (takže vlastně to nikdy není jen jedna hodnota).

Pokud to tak má zůstat - tak budiž, ale pak by to chtělo dát najevo, že se toto políčko chová tak a tak. Aspoň do titulku dát něco jako "Položky seznamu zadejte buď každou na novém řádku nebo jako čárkami oddělený seznam hodnot uzavřených do apostrofů."

ikona Jakub Vrána OpenID:

Když se za položkou udělá Enter, tak se apostrofy doplní, takže lze snadno zadat i jedna položka.

Těch tipů by bylo víc...

cucací potřeby:

Napadlo mě, že by Adminer mohl mít na každém typu stránky někde v pravém rohu malý odkaz na on-line nápovědu, která by se načítala z adminer.org a zobrazovala by se v novém okně.

V nápovědě by byl jen základní popis, co jak funguje + specifické věci. Šlo by jen o to vložit tam odkaz s id stránky (číselně nebo textově) a popřípadě s jazykem. S obsahem by ti pomohla komunita.

Napiš, prosím, co si o tom myslíš.

ikona Jakub Vrána OpenID:

Uživatelské prostředí by mělo být tak intuitivní, aby žádná nápověda neměla být potřeba.

cucací potřeby:

To je sice pěkné, ale toto pravidlo Adminer, bohužel, nesplňuje.

ikona v6ak:

Pak bychom se měli bavit spíše o tom, co vylepšit.

Jinak já mám zkušenost s různými nápovědami takovou, že se v nich většinou dočtu spíše to, co je jasné, a to, co hledám, tam nenajdu.

kozotoč:

Zkusil jsem Adminer poprvé v IE a zdá se, že v něm dvojkliknutí na výpis tabulky způsobí chybu.
Podrobnosti:
Unspecified error
Code: 0
řádek 19, sloupec 67 v ?file=functions.js&version=3.1.0
IE 8.0.6001 (Win32)

daný řádek v functions.js:
if(document.selection){var range=document.selection.createRange();range.moveToPoint(event.x,event.y);var range2=range.duplicate();range2.moveToElementText(td);range2.setEndPoint('EndToEnd',range);pos=range2.text.length;}

Co je opravdu špatná zpráva, je, že to někdy funguje a někdy ne. Trochu jsem si s tím hrál, a zdá se, že chybovost závisí na natolik bizardních okolnostech jako je např. posunutý vertikální scroller... :-O

ikona Jakub Vrána OpenID:

Chyba mi je trochu povědomá. Můžeš ji prosím zkusit reprodukovat v aktuální verzi z Gitu?

ikona Jakub Vrána OpenID:

Díky za upozornění, opravil jsem to v Gitu.

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