Oprava poškodeného vstupu z formulára v PHP: UTF-8 a mbstring


Dátum vydania:

Aktualizované:


Technické články > Oprava poškodeného vstupu z formulára v PHP: UTF-8 a mbstring

Stav 2026 a bezpečné používanie

Záver: Ponechajte jedno explicitné kódovanie – zvyčajne UTF-8 – vo formulári HTML, odpovedi HTTP, zdroji PHP, spracovaní reťazcov a pripojení k databáze. Pred zmenou globálnych nastavení zachyťte nespracovaný vstup a identifikujte hranicu, kde sa bajty dekódujú nesprávne.

Čo sa naučíte

  • Ako odlíšiť problém so zobrazením od chybnej konverzie vstupu alebo poškodenia údajov v databáze.
  • Ktoré hlavičky a nastavenia PHP sú relevantné pre moderné aplikácie UTF-8.
  • Prečo by sa historický postup s direktívami mbstring.internal_encoding a mbstring.http_input uvedený nižšie nemal skopírovať do aktuálneho nasadenia.

Pre koho je to určené: Správcovia PHP, ktorí riešia poškodený text po overení formulára, presmerovaní alebo zápise do databázy a spätnom načítaní.

Kontext v roku 2026: PHP označilo staré direktívy kódovania iconv/mbstring v PHP 5.6 za zastarané v prospech default_charset; moderná aplikácia má kódovanie určovať explicitne na každom rozhraní. Pôvodná konfigurácia zostáva iba ako vysvetlenie historického incidentu.

Bezpečnostná poznámka: Príkazy a príklady konfigurácie v pôvodnom článku neboli znovu spustené v aktuálnom produkčnom prostredí. Pred ich použitím overte podporované verzie, zálohy, prístupové oprávnenia a postup obnovy v oddelenom testovacom prostredí.

Hlavné oficiálne zdroje

Prehľad

V PHP aplikácii sa pri prechode zo vstupného formulára na stránku s potvrdením zobrazil poškodený text.

Znaky sa poškodili po odoslaní textu z formulára.

Rovnaký problém nastal aj pri návrate na formulár po chybe validácie vstupu.

Keďže išlo o novo nakonfigurovaný server, kontrola sa zamerala na nastavenie PHP. Nasledujúce odseky zachytávajú vtedajšiu diagnostiku.


Obsah

  1. Diagnostika
  2. Zhrnutie

1. Diagnostika

Pri hľadaní príčiny sa kontrolovali nasledujúce nastavenia.

1-1. Kontrola nastavení

Najprv sa skontrolovalo kódovanie v súbore php.ini.

php.ini


default_charset = "UTF-8"
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = On

Uvedené hodnoty vyzerali správne.

Ďalším podozrivým miestom bol preto zdrojový kód PHP.

Kontrola kódu však neodhalila pravdepodobnú príčinu.

Pri opätovnej kontrole php.ini sa našla ešte jedna relevantná direktíva.

php.ini


mbstring.http_input = auto

Hodnota "auto" neurčovala UTF-8 explicitne, preto sa v pôvodnom prostredí skúšobne zmenila takto:

php.ini


mbstring.http_input = UTF-8

Po tejto zmene sa poškodené znaky v danom prostredí prestali objavovať.

Direktíva patrila k modulu mbstring, ktorý spracúva viacbajtové reťazce, napríklad text v japončine.

Určovala kódovanie vstupu prijatého v požiadavke HTTP.

2. Zhrnutie

Pri poškodenom texte najprv zmapujte celý tok údajov: formulár, požiadavku HTTP, spracovanie v PHP, odpoveď a prípadne databázu.

V tomto historickom prípade problém súvisel s direktívou mbstring.http_input v súbore php.ini.

Direktívy z uvedeného starého prostredia však nekopírujte do modernej inštalácie. V aktuálnom PHP určte UTF-8 explicitne na každom rozhraní a používajte podporované nastavenia.

Pred globálnou zmenou konfigurácie vždy zachyťte pôvodné bajty a určte presné miesto nesprávneho dekódovania.