Egoblog.cz - Petr Kobelka

Nette a mé trápení s BITy na MySQL

Pro jednu aplikaci jsem chtěl implementovat část informací v bitovém režimu, protože proastě na stavy 0/1 opravdu nepotřebuji jednobajtové pole (tinyint).


PHP | Komentáře (0) | Shlédnuto 837 × | Vloženo: 26. října 2014

Výchozí stav

Aplikace je psána na Nette 2.1.4 a používám Nette Context pro práci s databází.

V jedné čísti aplikace dynamicky generuji tabulku s tím, že si uživatelé mohou nastavovat, které sloupce v tabulce chtěji zobrazit. V budoucnu se můžou sloupce přidávat a tak jsem zvolil řešení, že informaci, které sloupce budou zobrazeny budu mít v BITové hodnotě.

Celkem to je jednoduché

Sloupec 1 má hodnotu 1
Sloupec 2 má hodnotu 2
Sloupec 3 má hodnotu 4
Sloupec 4 má hodnotu 8 atd.

Princip je vám asi hned jasný. Jednoduchým binárním operátorem zjistím, jestli je sloupec aktivní, nebo není.

Např. mám uloženo v DB hodnotu 101 (v decimálním zápisu 5)

Když se zeptám

HODNOTA & 1

pak mi to vráti buď 1 - ano, je to v pořádku, nebo 0 - ne není to v pořádku.
Ano - sloupec uživatel chce,  0 - ne uživatel sloupec nechce.

Jak to s Nette a BITy pokračovalo

Vše jsem si odladil na lokálním vývojovém serveru a vše běželo v pořádku.
(PHP 5.4.25, MySQl 5.1.53, Apache 2.2.17).

Když jsem se pak přes \Nette\Database\Context přímo dotázal na sloupec, vrátilo mi to informaci již v decimálním tvaru Tedy místo 101 mi to vrátilo 5.

Ok, s tím se dá pracovat. Doplnil, otestoval a implementoval jsem potřebné kroky u sebe. Pak jsem provedl deployment na produkční server a chtěl vyzkoušet.

Super, vrátilo to chybu 500 - ERROR velký jak mrakodrap. Kde by asi mohla být chyba??

Musel jsem krokovat od začátku do konce až jsem zjistil, že produkční server mi vrací úplně jiné informace, než co mi vracel lokální vývoj.

Konkrétně takto:

Vývoj vrátil 5
Produkční server vrátil \x1\x0\x1 (zhruba, nevím už přesně ten zápis)

Prostě a jednoduše mí vrátil UTF8 encoded řetězec. proč ale? Připojení k databázi je utf-8, databáze i collations jsou utf-8, tak co mu sakra vadí?

Když jsem pak zkusil ručně v dotazu konvertovat z binární sadu na decimální použitím MySQL funkce CONV, tak to začalo zlobit na lokálním vývoji.

Řešení problému ?

btw. CONV(number, from, to) - funkce CONV bere tři argumeny. Prvním je vstupní číslo, druhým je výchozí číselná soustava, třetím argumentem je cílová číselná.

Odhaduji, že problém bude někde v PDO, které \Nette\Database\Context používá. Bohužel jsem neměl dost času se tím problémem zabývat, tak jsem sloupce přetipoval na celočíselné i když s nimi pracuji jako s binarními.

Podobné články jako "Nette a mé trápení s BITy na MySQL"

Petr Kobelka | Egoblog.cz | Tvorba www stránek - www.petrkobelka.cz

Petr Kobelka
Autor je zkušeným web developerem a programátorem s více než 10 letými zkušenostmi. Pracuje jako programátor pro známou Olomouckou společnost zabývající se tvorbou internetových a intranetových řešení. Spolu se zaměstnáním pracuje na volné noze a zabývá se tvorbou internetových stránek. Ve volném čase rád fotí, jezdí na kole, plave a cestuje.

Komentáře

E-mail je potřeba pouze pro vygenerování Gravataru!

Oups, žádné komentáře? Buďtě první !!!

Blog píše Petr Kobelka

Petr Kobelka - egoblog.cz

Žádám všechny, kteří mají zájem vkládat komentáře, aby se řídili pravidly NETikety. Komentáře, porušující tato pravidla můžou být bez varování smazány.