Zde mícháte rozhraní API,
mysql_*
amysqli_*
nemíchá se. Měli byste se držetmysqli_
(jak se zdá, že jste), jakomysql_*
funkce jsou v PHP7 zastaralé a zcela odstraněny.
Váš skutečný problém je někde problém se znakovou sadou. Zde je několik tipů, které vám mohou pomoci získat správnou znakovou sadu pro vaši aplikaci. To pokrývá většinu z obecných problémů, se kterými se člověk může setkat při vývoji aplikace PHP/MySQL.
- VŠECHNY atributy v celé aplikaci musí být nastaveny na UTF-8
- Uložte dokument jako UTF-8 bez kusovníku (pokud používáte Notepad++, je to
Format
->Convert to UTF-8 w/o BOM
) -
Záhlaví v PHP i HTML by mělo být nastaveno na UTF-8
-
HTML (uvnitř
<head></head>
tagy):<meta charset="UTF-8">
-
PHP (v horní části vašeho souboru, před jakýmkoli výstupem):
header('Content-Type: text/html; charset=utf-8');
-
-
Po připojení k databázi nastavte znakovou sadu na UTF-8 pro váš objekt připojení, takto (přímo po připojení)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */
Toto je pro
mysqli_*
, existují podobné promysql_*
a PDO (viz spodní část této odpovědi). -
Také se ujistěte, že vaše databáze a tabulky jsou nastaveny na UTF-8, můžete to udělat takto:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
(Žádná již uložená data nebudou převedena na správnou znakovou sadu, takže to budete muset udělat s čistou databází, nebo poté data aktualizovat, pokud jsou v nich poškozené znaky).
- Pokud používáte
json_encode()
, možná budete muset použítJSON_UNESCAPED_UNICODE
příznak, jinak převede speciální znaky na jejich hexadecimální ekvivalent.
Pamatujte, že VŠE v celém kanálu kódu musí být nastaveno na UFT-8, jinak by se ve vaší aplikaci mohly objevit nefunkční znaky.
Kromě tohoto seznamu mohou existovat funkce, které mají specifický parametr pro specifikaci znakové sady. Návod vám o tom řekne (příkladem je htmlspecialchars()
).
Existují také speciální funkce pro vícebajtové znaky, příklad:strtolower()
nesníží vícebajtové znaky, k tomu budete muset použít mb_strtolower()
, podívejte se na tuto živou ukázku
.
Poznámka 1 :Všimněte si, že je někde označen jako
utf-8
(s pomlčkou) a někde jakoutf8
(bez toho). Je důležité, abyste věděli, kdy které použít, protože obvykle nejsou zaměnitelné. Například HTML a PHP chtějíutf-8
, ale MySQL ne.Poznámka 2 :V MySQL není „charset“ a „collation“ totéž, viz Rozdíl mezi kódováním a řazením? . Oba by však měly být nastaveny na utf-8; obecně by řazení mělo být buď
utf8_general_ci
neboutf8_unicode_ci
, viz UTF-8:Obecné? Zásobník? Unicode? .Poznámka 3 :Pokud používáte emotikony, MySQL musí být specifikováno pomocí
utf8mb4
znaková sada namísto standardníhoutf8
, a to jak v databázi, tak ve spojení. HTML a PHP budou mít pouzeUTF-8
.
Nastavení UTF-8 pomocí mysql_
a CHOPa
-
PDO:To se provádí v DSN vašeho objektu. Všimněte si
charset
atribut,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
-
mysql_
:Toto se provádí velmi podobně jakomysqli_*
, ale nebere objekt connection-object jako první argument.mysql_set_charset('utf8');