Adminer Editor

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

Do druhé verze svého nástroje pro správu MySQL databáze Adminer připravuji samostatnou aplikaci Adminer Editor, která slouží pouze pro zobrazení a editaci dat. Hlavní smysl aplikace je ten, že ji můžete svěřit do rukou i běžným uživatelům bez obavy, že by vám poškodili strukturu databáze.

Od Admineru se Editor liší v několika důležitých bodech:

Cílem aplikace je zpřístupnit většinu funkčnosti, která je k dispozici v aplikaci Adminer Pro, která administrační rozhraní generuje do PHP skriptů.

Zpočátku jsem také přemýšlel o tom, že bych Editor integroval do Admineru, ale nakonec jsem zvolil dvě oddělené aplikace. Obě jsou totiž určené pro jinou cílovou skupinu a i když správce databáze také občas potřebuje pracovat s daty, tak to obvykle zvládne i v nízkoúrovňovém rozhraní. Naopak zadavatel dat nesmí mít ke struktuře databáze přístup. Výhodné to je také kvůli velikosti souborů s aplikacemi.

Přemýšlím také, co odstranit z výpisu a editace dat, aby se Editor dále zjednodušil:

Některé věci určené pro Editor jsem zatím přidal i do Admineru a přemýšlím, jestli je tam nechám:

Možnost hromadného odeslání e-mailové zprávy na vybrané adresy
Při výpisu tabulky dochází ke kontrole, zda některý sloupec obsahuje e-mailovou adresu. Pokud je detekce úspěšná, tak se zobrazí formulář pro odeslání e-mailu.
Zobrazení odkazů na související záznamy
Například u alba se zobrazuje odkaz na písničky, které na tomto albu jsou.

Závěr

Pro Editor je zatím k dispozici jen demo a zdrojové kódy v SVN, ale už teď mě zajímá, co byste v takovém nástroji chtěli nebo naopak nechtěli. Cílem je vytvořit aplikaci, díky které by nebylo potřebovat ručně vytvářet běžné administrační rozhraní. Nutnou podmínkou pro tento cíl je dobrá rozšiřitelnost nástroje, o které ještě napíšu.

Jakub Vrána, Adminer, 17.7.2009, diskuse: 51 (nové: 0)

Diskuse

Bednee:

Vidím zádrhel při zadávání hodnot, které jsou IDčka z jiné tabulky (foreign key), v demu Album - Interpret. BFU toto nebude schopný pochopit. V tomhle místě by byl asi nejlepší dropdown pro výběr hodnoty.

ikona Jakub Vrána OpenID:

To se samozřejmě ještě změní, jde o velmi ranou verzi. Měl by to být jeden ze zásadních rozdílů. Pro jistotu uvádím interní TODO:

Popisné sloupce
Skryté sloupce
Formát data
Validace dat
Vazební tabulky
Pořadí tabulek v navigaci
Odhlášení

Konkrétně tohle spadá pod Popisné sloupce. Spíš než dropdown tam ale bude nejspíš našeptávač, protože odkazované tabulky mohou být velké.

crempa:

a nebo popup (ajax popup) s tabulkou pro vyber zaznamu ciziho klice, u naseptavace muze byt problem jak se rozhodnout podle ktereho sloupce se bude naseptavat...

ikona Jakub Vrána OpenID:

Ano, já i tomuhle říkám našeptávač. Varianta s tabulkou bude nejspíš v Admineru, v Editoru půjde označit Popisný sloupec (nebo se automaticky vybere) a bude se hledat jen v něm.

mandark:

Pro normální uživatele by se určitě hodilo undo...

ikona Jakub Vrána OpenID:

To je dobrý nápad, dokonce by ani nebylo zvlášť těžké to udělat. Stačilo by si před změnou a smazáním zapamatovat původní hodnotu a po uložení tu novou.

Jenom kam to dát do uživatelského rozhraní? Provedení unda by asi mělo být potvrzené a pak by mělo být i redo. A stačil by jeden krok nebo více?

ZtF:

Napada me to resit pomoci nejakeho stacku vektoru zmen (kde by byly implementovany patricne metody undo a redo). Ceho se ale desim v tomto pripade je synchronizace pristupu (a pochybuju, ze by se chtelo implementovat zamky/semafory/transakce).

ikona Jakub Vrána OpenID:

Ptal jsem se na uživatelské rozhraní - jak funkci zpřístupnit lidem.

ikona v6ak:

ACL?

ikona Jakub Vrána OpenID:

Dobrý nápad. Rozhodně chci mít tabulku s uživatelskými právy a dva základní režimy přístupu - buď práce se vším nebo jen s vlastními objekty. Ale podrobnější určení práv se bude také hodit.

ikona Jakub Vrána OpenID:

Autorizaci nechám zcela na uživatelském rozšíření. Adminer a Editor prostě zavolají metodu login() a podle toho, co vrátí, tak zobrazí buď stránku nebo chybovou hlášku.

Petr:

Mozna by se hodilo filtrovani dat (bezne lide chteji od-do)

ikona Jakub Vrána OpenID:

V Admineru si člověk může nastavit libovolnou AND podmínku, do Editoru bych to chtěl zjednodušit. Přemýšlel jsem o textovém vyhledávání bez omezení sloupce (to umí i Adminer). U dat a čísel je rozsah dobrý nápad.

TouSt:

Takze vicemene takovej lepsi vlastni Scaffolding s ACLkem?

ikona Jakub Vrána OpenID:

Nechápu souvislost se Scaffoldingem.

Kajman:

Možná by stálo za zvážení, zda by se u tabulek se sloupcem, kde je nějaké pořadí, dalo nadefinovat, že uživatel může jednoduchým klikáním posouvat řádky nahoru a dolu.

ikona Jakub Vrána OpenID:

To by bylo užitečné. Otázka je, jaké pro to udělat uživatelské rozhraní, protože přesouvat to po jednom šipkami z konce na začátek by byla pěkná otrava. Adminer Pro to řeší prostě tak, že dovolí zadat nové pořadí a ostatní prvky přesune tak, aby vznikla souvislá řada.

Adminer Pro taky podporuje traverzování kolem stromu - u toho se pořadí určí tak, že se vybere, za jakým prvkem se má ten editovaný zobrazit.

Kajman:

Takhle by to asi stačilo. Ale možná by se mohly zkombinovat obě varianty.

Marek Hrabě:

Možná by bylo zajímavé udělat nějaký online generátor, kde si každý vybere, co bude chtít v jeho Editoru. Myslím tím rozdělit aplikaci na jakési moduly, které se do aplikace integrují před stažením dle volby...

U "propojených tabulek" jsem také pro nějaký druh našeptávače - určitě bude užitečný...

ikona Jakub Vrána OpenID:

Co by to mělo být za moduly? Editor chci výhradně pro práci s daty, to znamená výpis, přidání, editace, mazání. Rozdělovat tohle na moduly mi nedává smysl a doplňovat nic dalšího tam nechci.

Šimoník:

Proč se mi v adineru zobrazuje text :
Podzimní turistika v Roháèích, tak to už je u nás tradice. Letos tomu není jinak..

má tam být v Roháčích.

Já když ze své databáze vypisuji, tak je to OK. Zkoušel jsem i v prohlížeči měnit kodové stránky ale nepomohlo to.
Díky

ikona Jakub Vrána OpenID:

Pokud jde o MySQL >= 4.1, tak je problém s kódováním. Přečti si http://php.vrana.cz/mysql-4-1-kodovani.php

Šimoník:

Databáze je
Verze MySQL: 5.0.32-Debian_7etch10-log přes PHP extenzi MySQLi.
Článek jsem četl. Jak ale zjistím, co za kodování je ve skutečnosti v databázi?
Databáze je utf8, stránky s odesílacím formulářem pro databázi pak windows1250. Bohužel jsem při tvorbě skriptu nic ohledně kodování nenastavil a teď nevím, jak jsou vlastně data v databázi uložena.
Lze tedy nějak i dodatečně zjistit skutečné kodování a následně správného zobrazování v Admineru?

ikona Jakub Vrána OpenID:

Ano, v editaci databáze i struktury tabulky se použité kódování zobrazuje a je možno ho změnit.

Šimoník:

Jako myslíte změnit na cp1250? To jako bez nějakých konverzí atd? Nedojde k nějakému zmatku a poškození textu?Pak by se to mělo v admineru zobrazova už správně?

ikona Jakub Vrána OpenID:

Viz http://php.vrana.cz/prevod-kodovani-mysql.php

Šimoník:

Díky. Bylo to trochu složitější. Jak již bylo tady uvedeno, když někdo, třeba jako já ,dlabe na nastavení databáze, pak se dočká toho, že posílá data win1250, mysql si myslí, že jsou latin1 a uloží je jako uft8 pak je převod do normálu trochu komplikovanější :-)
Takto jsou totiž default nastaveny servery hostingu C4.

Použil jsem návod z builderu :
1) Vytvořit dočasnou tabulku se stejnou strukturou

DROP TABLE IF EXISTS pokus;
CREATE TABLE pokus LIKE tabulka;

2) Změnit character set na ten, který dává použitelné výsledky (v mém případě latin1) Prostě ten, který získáte z výpisu serveru character_set_connection

ALTER TABLE pokus MODIFY username varchar(200) CHARACTER SET latin1;

3) Nakopírovat do nové tabulky data z té původní

INSERT INTO pokus SELECT * FROM tabulka;

4) Změnit definici sloupečků na správný charset beze změny dat jako takových:

ALTER TABLE pokus MODIFY username BINARY(200);
ALTER TABLE pokus MODIFY username VARCHAR(200) CHARACTER SET cp1250 /* pripadne NOT NULL DEFAULT '...' AUTO_INCREMENT */;
Pozn. pro text pak blob
5) Propsat opravená data do původní tabulky

DELETE FROM tabulka;
INSERT INTO tabulka SELECT * FROM pokus;

6) Smazat dočasnou tabulku

DROP TABLE pokus;

Uff. Už mi adminer funguje. Je perfektní.

Šimoník:

Lze nějak v Admineru vytvořit ze stávající tabulky příkaz sql pro tvorbu dané tabulky?

ikona Jakub Vrána OpenID:

Pomocí exportu.

Šimoník:

Ale to se exportuje včetně dat. Já jsem myslel pouze strukturu.

Jan "Panda" Smitka:

U exportu si můžeš dole v tabulce zatrhat, jaké tabulky chceš exportovat a jestli chceš exportovat i jejich data. Pak se samozřejmě exportuje jen struktura.

ikona Jakub Vrána OpenID:

Přesně tak. Případně i nahoře se dá vybrat, jakým způsobem se bude exportovat struktura a jakým data. Jeden ze způsobů je i nijak.

Šimoník:

Ach jo,kdybych nebyl slepý. Já jsem viděl export pořád jen pod tabulkou a ne vedle SQL.

Šimoník:

Tak jsem se radoval předčasně. Adminer mi krásně zobrazuje češtinu, na stránkách je taky v pořádku. Ale když dám vyhledat tak je problém, data se nenajdou. Místo rovnosti musím dát LIKE a za hodnotu ještě %.
Tak teď už opravdu nevím, jak mám data v databázi uložena.
Existuje nějaká způsob, jak to dát dopořádku?
Díky

MaT:

No jak, asi s mezerami, nebo nějakými jinými whitespace znaky na konci...

Šimoník:

Proč, prosím mi v admineru nefunguje vyhledávání podle češtiny, když se v admineru čeština zobrazuje správně.

Jan "Panda" Smitka:

Vyhledávání není moc záležitostí Admineru, spíš databáze a správně položeného dotazu. Jaké máš teď nastavení charsetů v tabulce (popř. u sloupců) a jaký dotaz pokládáš?

Šimoník:

Z admineru jsem vyexportoval dotaz :

SET NAMES utf8;
SET foreign_key_checks = 0;
SET time_zone = 'SYSTEM';

DROP TABLE IF EXISTS `komentare`;
CREATE TABLE `komentare` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `rodic` int(10) unsigned NOT NULL,
  `autor` varchar(45) collate cp1250_czech_cs NOT NULL default '',
  `datum` varchar(50) collate cp1250_czech_cs NOT NULL default '',
  `obsah` text collate cp1250_czech_cs NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=38 DEFAULT CHARSET=cp1250 COLLATE=cp1250_czech_cs;

INSERT INTO `komentare` (`id`, `rodic`, `autor`, `datum`, `obsah`) VALUES
('1', '163', 'ČPBBT', '09-04-2009 20:31:25', 'Jsem nemocný, nejedu. Ach, jak já trpím :-)');

trochu mě překvapuje, že tam je utf8. Když to změním na
cp1250 tak vznikne paskvil. Čeština je OK ale dotaz ba ČPBBT nefgunguje.

Nastavení databáze je :
character_set_client utf8
character_set_connection latin1
character_set_database latin1

I když to zkusím v PHP kde dám MYSQL_QUERY(" SET NAMES 'cp1250'");

a pomocí insert dám data do databáze, tak stejně nejde vyhledávat podle češtiny.
Tady je kousek php kodu :
<?php include "fce.php";  ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
  <body>
<?php
spojeni
();
$prikaz="INSERT INTO komentare (rodic,autor,datum,obsah)  VALUES ('163','ČPBBT','09-04-2009 20:31:25','Jsem nemocný, nejedu. Ach, jak já trpím :-)')";
@
$set = MySQL_Query($prikaz);
if (!
$set):
        echo mysql_error();
    echo "Chyba při ukládání dat do databáze. Kontaktujte prosím webmastera ";
        break;
endif;
?>

Jsem z toho už úplně paf.

Šimoník:

Teda, může mi někdo vysvětlit, proč pro následující nastavení :
character_set_client utf8
character_set_connection latin1
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
collation_connection latin1_swedish_ci
collation_database latin1_swedish_ci
collation_server latin1_swedish_ci

zabralo až nastavení v php scriptu :

MYSQL_QUERY("SET NAMES 'cp1250'");

Data jsou cp1250

a tabulky musí být nastaveny na utf8 !!!!
Jestliže jsou na cp1250 tak nefunguje vyhledávání podle češtiny i když ta se zobrazue správně.

ikona Jakub Vrána OpenID:

Pozor na to, že pro cp1250 se používá porovnávání cp1250_czech_cs, které rozlišuje velikost písmen.

ikona Jakub Vrána OpenID:

SET NAMES utf8 tam je proto, že Adminer data exportuje v UTF-8.

Marek Turnovec:

Nějak jsem stále nepřišel na to, jak se do toho Adminer Editoru přihlásit. Asi jsem úplně blbej... Má to někde nějakou dokumentaci? Tady se píše, že místo autentizace z MySQL se uživatel přihlásí "vlastním kombinací jména a hesla". To je co? Kde je mám vzít?

ikona Jakub Vrána OpenID:

Pokud používáš Editor bez jakéhokoliv rozšíření, tak se jméno a heslo nekontroluje. Přihlašovací údaje k databázi se vezmou z konfigurace (např. mysql.default_*).

Editor je nicméně určen hlavně k rozšířování. Jednoduchý příklad a kompletní dokumentace je na http://www.adminer.org/cs/extension/. Zajímat tě budou hlavně metody credentials(), login() a možná ještě database() – pokud máš k dispozici více databází.

honza:

nejde mi se prihlasit, nikde zadna dokumentace ==> mažu (může to být šikovné jak chce, bez absolutně žádné nápovědy to odradí...)

ikona Jakub Vrána OpenID:

Dokumentace je na http://www.adminer.org/cs/extension/.

Miloš Brecher:

Skvělá dvojice - Adminer + Editor

Lukáš:

Ahoj, dotaz. Je nějaká možnost úpravy editoru, tak že při vkládání nebo editaci záznamů se budou procházet cizí klíče aby se zobrazil select?
Teď to udělá jeden průchod do druhé tabulky, ale když v druhé tabulce je další cizí klíč, tak už nevidím select na třetí tabulku, ale input pro ID.

Možná na to už je nějaké rozšířeni, ale úplně do těch střev nevidím.

ikona Jakub Vrána OpenID:

Moc tomu nerozumím, můžeš sem dát schéma těch tří tabulek? Žádný plugin na to podle mě není. Editor ale pokud vím podporuje vazby M:N, pokud má spojovací tabulka primární klíč z těch dvou sloupců.

Lukáš:

Hm, možná mám ty tabulky jen špatně vytvořené.

mám tabulku country_text, která má klíč do country a ta má klíč co country_list... ale v country_text, nevidím názvy z country_list

Schéma zde:

CREATE TABLE `country_list` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Země',
  `iso` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'ISO země',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `country_points` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `country` int(11) unsigned NOT NULL COMMENT 'Země',
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Jméno',
  `title` text COLLATE utf8_unicode_ci NOT NULL COMMENT 'Popisek',
  PRIMARY KEY (`id`),
  KEY `country` (`country`),
  CONSTRAINT `country_points_ibfk_2` FOREIGN KEY (`country`) REFERENCES `country` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Navštívené země - body';

CREATE TABLE `country_text` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `country` int(11) unsigned NOT NULL COMMENT 'Navštívená země',
  `language` int(11) unsigned NOT NULL COMMENT 'Jazyk',
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Jméno země',
  PRIMARY KEY (`id`),
  KEY `country` (`country`),
  KEY `language` (`language`),
  CONSTRAINT `country_text_ibfk_3` FOREIGN KEY (`country`) REFERENCES `country` (`id`) ON UPDATE CASCADE,
  CONSTRAINT `country_text_ibfk_4` FOREIGN KEY (`language`) REFERENCES `language` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Navštívené země - překlady';

Lukáš:

oprava schematu:

CREATE TABLE `country` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `country_list` int(11) unsigned NOT NULL COMMENT 'Země',
  PRIMARY KEY (`id`),
  KEY `country_list` (`country_list`),
  KEY `flag` (`flag`),
  CONSTRAINT `country_ibfk_1` FOREIGN KEY (`country_list`) REFERENCES `country_list` (`id`),
  CONSTRAINT `country_ibfk_2` FOREIGN KEY (`flag`) REFERENCES `flag` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Navštívené země';

ikona Jakub Vrána OpenID:

Jo takhle. Asi by pomohlo z metody rowDescription() vrátit poddotaz (něco jako „(SELECT name FROM country_list WHERE id = country.contry_list)“), ale nejsem si jist, že to bude fungovat.

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.