Oldal hozzáadása a kedvencekhez... Facebook profilom RSS Csatorna Ugrás a VírusEllen oldalra... Ugrás a vtsoftware.hu-ra...

PHP & MySQL ékezetek... megint

2013. június 28. 22:52 - Megtekintve: 0x
Ismételten játszanom kellett a PHP és MySQL párossal, most viszont UTF-8-ban.
JSON barátom megtréfált egy kissé...
Ismételten egy probléma amiben valószínűleg nem én futok bele először.
Van fórum a neten evvel kapcsolatban, én egy kissé máshogy álltam a dologhoz :)

Kutakodtam utána rendesen, de végülis az ihletet hozta csak meg a túrkálás nem a megoldást.

A feladat a következő volt.
Adott egy PHP tömb:
$tomb=array('dolog'=>array('dolog1.1'=>'első', 'dolog1.2'=>'második', 'dolog1.3'=>'harmadik'));

Ezt a következő képpen kellene elmentenie az adatbázisba:
{"dolog":{"dolog1.1":"első", "dolog1.2":"második", "dolog1.3":"harmadik"}}

Ehelyett mit tárol el?
{"dolog":{"dolog1.1":null, "dolog1.2":null, "dolog1.3":"harmadik"}}

Azaz az ékezetet tartalmazó szavak elvesznek.
Törtem a fejem vajon miért...
Aztán a neten fellelt fórumból eszembe jutott.

A JSON függvény kódoláskor először az ékezeteket és az unicode karaktereket azok kódjára cseréli.
Dekódoláskor pedig ezeket vissza. De.
Ha nem normál UTF-8 karaktereket kap, akkor hibát ad vissza.
De nem is ez volt a baj, a régebbiekből tanulva utánanéztem, mindenütt jó volt a karakterkódolás.
Akkor mi a fene lehet?
Aztán rájöttem erre is. :D
Az ékezetes betűket a JSON a következő formába kódolja:
"\u00ef" például...
Itt volt a gond, a visszaper-jel. (\)
A MySQL ezeket a tárolás előtt kitöröli így a JSON kódolt tömbből ennyi maradt.
{"dolog":{"dolog1.1":"elsu00ab", "dolog1.2":"melsu00cdsodik", "dolog1.3":"harmadik"}}

Ezt pedig visszaolvasáskor nem tudja visszakódolni így hibát ad, a következő mentéskor pedig a hibásat kapja újra mentésre és kódolásra.
De akkor az ékezetek már rég elvesztek.

A lényeg a lényeg, hogy a mysql_real_escape függvényt lefuttatva a json_encode után helyrejött a probléma.

Hozzászólások:

Új hozzászólás...

Neved:
e-Mail címed:
Hozzászólásod:
pocketsize
pocketsize
pocketsize
pocketsize