Databázový Adminer – neplatný UTF-8 znak v minifikovaném souboru Adminer Editoru
- m.brecher
- Generous Backer | 871
Ahoj,
pro management databází menších projektů používám roky skvělý Adminer + Adminer Editor Jakuba Vrány. Vývojový server mám na Windows a ve verzi PHP 8.1 a 8.2 pro Windows je drobná chybička – SELECT přes PDO vrací jiné hodnoty než má, verze pro Linux funguje správně. Konkrétně na Linuxu vrací všechny hodnoty jako php string proměnné, sloupec id typu int vrátí ‚1‘, totéž sloupec typu enum. Na Windows to vrací php int/float proměnné jako třeba 1 (sloupec int), nebo 1.0 (sloupec enum).
Adminer je roky distribuován v startovacím skeletonu Nette blog projektu pro začátečníky a tak toto téma s Nette souvisí.
Důsledkem je, že v Adminer Editoru nefunguje vybrání defaultní hodnoty prvků select (cizí klíč do jiné tabulky) nebo radio (enum). Opravit to jde snadno – vhodný přetypováním (string) na dvou místech v kódu Adminer Editoru.
Je zde ale další problém a sice ten, že když opravu provedu v minifikovaném souboru Adminer Editoru, tak se poškodí kódování vestavěných stylů a javscriptu a v důsledku přestane fungovat řada důležitých funkcí – např databáze se smaže bez varování, což je hodně nepříjemné.
Poškozené kódování bude pravděpodobně souviset s tím, že v minifikovaném souboru bude neplatný UTF-8 znak a po editaci kódu IDE soubor poškodí, protože to neuloží správně. PHPStorm mě po otevření souboru hlásil, že soubor je v jiném kódování než UTF-8. Zkoušel jsem minifikovaný soubor opravit ve třech různých editorech, ale vždy to dopadlo poškozením souboru.
Napadlo mě, že by se soubor mohl nejprve opravit a UTF-8 neplatné znaky odstranit a až potom editovat. Potom by editace mohla dopadnout bez poškození souboru.
Dík předem za jakékoliv nápady a zkušenosti.
Jakmile by se mě podařilo Editor opravit, dal bych ho k dispozici pro vložení do skeletonu Nette blog startovacího projektu.
Editoval m.brecher (9. 3. 2023 13:49)
- Pepino
- Člen | 257
Proč to dáváš sem? Přímo na stránkách admineru je odkaz pro reportování chyb.. https://sourceforge.net/…nd-features/
- m.brecher
- Generous Backer | 871
@Pepino
Proč to dáváš sem? Přímo na stránkách admineru je odkaz pro reportování
V září 2022 jsem chybu reportoval zde https://sourceforge.net/…eatures/847/, později jsem napsal přímo Jakubovi Vránovi a ten mě odpověděl, že už Adminer moc nedělá. Na Githubu Admineru nejde zakládat issue.
Tak jsem se snažil to opravit sám a skončilo jsem na tom neplatném znaku UTF-8. Dal jsem to sem proto, aby se mohl dát opravený Adminer Editor k dispozici nováčkům v Nette do toho startovacího skeletonu.
- m.brecher
- Generous Backer | 871
@Pepino
@mbrecher A proč ty úpravy děláš v tom minifikovaném souboru? Jen zlehka jsem kouknul na GIT a je tam celý zdroják i s kompilačním scriptem.
Nejprve jsem opravil zdroják z githubu, ten funguje, ale pro distribuci je to trochu nepohodlné a tak jsem zkusil to minifikovat přiloženým skriptem, ale nezdařilo se.
A jak odstranit neplatné UTF-8 znaky ze souboru nevíš? Tím by se to mohlo vyřešit.
Editoval m.brecher (9. 3. 2023 14:31)
- m.brecher
- Generous Backer | 871
Testoval jsem použité kódování pomocí funkce PHP mb_detect_encoding() s tímto výsledkem:
$code = file_get_contents('editor.php'); // Adminer Editor
echo (mb_detect_encoding($code) // 'UTF-8'
Z hlediska PHP je kódování souboru v pořádku, stránky Adminer Editor-u jsou kódovány UTF-8 a vše se zobrazuje správně. Že by chyba v IDE? Zkoušel jsem 3 různé se stejným výsledkem.
Editoval m.brecher (9. 3. 2023 19:05)
- m.brecher
- Generous Backer | 871
Problém vyřešen,
provedl jsem editaci minifikovaného souboru Adminer Editor pro MySQL a česky pomocí PHP:
function replace_string($code, $string, $replacment)
{
$pos = mb_strpos($code, $string, 0, 'UTF-8');
$firstCodePart = mb_substr($code, 0, $pos);
$secondCodePart = mb_substr($code, $pos + mb_strlen($string));
return $firstCodePart.$replacment.$secondCodePart;
}
$code = file_get_contents($rootDir.'/test/editor.php');
$stringSelect = '(($df||is_string($x)?(string)$x:$W)===$Wd?';
$replacementSelect = '(($df||is_string($x)?(string)$x:$W)===(string)$Wd?';
$stringEnum = 'enum_input($Pe,$c,$l,$X,$xb=null){global$b;';
$replacementEnum = 'enum_input($Pe,$c,$l,$X,$xb=null){global$b;$X=(int)$X;';
$repaired = replace_string($code, $stringEnum, $replacementEnum);
$repaired = replace_string($repaired, $stringSelect, $replacementSelect);
file_put_contents($rootDir.'/test/editorRepaired.php', $repaired);
Pro PHP na Windows 8.1 a 8.2 je tedy k dispozici funkční pohodlný nástroj pro začátečníky v Nette Frameworku.