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


Dátum vydania:

Aktualizované:


Technické články > Oprava poškodeného zadávania 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 rozlíšiť problém so zobrazením od konverzie vstupu alebo poškodenia databázy.
  • Ktoré hlavičky a nastavenia PHP sú relevantné pre moderné aplikácie UTF-8.
  • Prečo by sa starý recept 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 pri riešení problémov s mojibake po overení formulárov, presmerovaniach alebo spiatočných výletoch do databázy.

Pozícia z roku 2026: PHP zastaralo staré direktívy kódovania iconv/mbstring v PHP 5.6 v prospech default_charset; moderný kód by mal robiť kódovanie explicitné na každej hranici. Pôvodná konfigurácia je zachovaná len na 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, riadenie prístupu a kroky vrátenia v samostatnom testovacom prostredí.

Hlavné oficiálne zdroje

Prehľad.

Pri prechode zo vstupnej obrazovky na potvrdzovaciu obrazovku v jazyku PHP sa objavil skreslený text.

Pri zadávaní textu do formulára a prechode na potvrdzovaciu obrazovku je text skreslený.

Ku skreslenému textu dochádza aj pri prechode na vlastnú obrazovku v dôsledku chýb kontroly vstupu.

Keďže server bol práve postavený, mal som pocit, že v konfigurácii PHP niečo chýba, preto opíšem, čo som vtedy zistil.


Obsah

  1. vyšetrovanie (na zistenie príčiny niečoho)
  2. zhrnutie

1. vyšetrovanie (na zistenie príčiny niečoho)

Na zistenie príčiny problému boli preskúmané tieto informácie.

1-1. prieskum

Najprv skontrolujte nastavenia PHP (php.ini).

php.ini


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

Je to tak, ako je popísané vyššie, a zdá sa, že je v poriadku.

Potom sa zdá, že problém je spôsobený zdrojom PHP.

Zdroj PHP však neidentifikoval pravdepodobný problém.

Opäť som skontroloval php.ini na podozrivé nastavenia a našiel som jedno podozrivé nastavenie.

php.ini


mbstring.http_input = auto

Nebolo jasné, či je kódovaný v UTF-8, pretože bol nastavený na automatický, takže bol zmenený takto, aby sa to vyskúšalo.

php.ini


mbstring.http_input = UTF-8

Úspešne vyriešený skreslený text.

Toto nastavenie je potrebné pre modul mbstring pri používaní viacbajtových reťazcov, ako je napríklad japončina v PHP.

Konfigurácia kódovania prijatých požiadaviek http.

2. zhrnutie

Ak sa vyskytne skreslený text, pokúste sa najprv zorganizovať tok spracovania.

Ak sa pri prechode zo vstupnej obrazovky na potvrdzovaciu obrazovku alebo pri iných prechodoch na obrazovku vyskytnú skreslené znaky, podozrievajte nasledujúce nastavenia v súbore php.ini.

Predvolené nastavenie je 'auto', preto ho skontrolujte, keď používate mbstring na spracovanie viacbajtových reťazcov.

Ďakujeme vám za sledovanie až do konca.