Stai mescolando le API qui, mysql_*
e mysqli_*
non si mescola. Dovresti restare con mysqli_
(come sembra che tu sia comunque), come mysql_*
le funzioni sono deprecate e rimosse completamente in PHP7.
Il tuo vero problema è un problema di set di caratteri da qualche parte. Ecco alcuni suggerimenti che possono aiutarti a ottenere il set di caratteri giusto per la tua applicazione. Questo copre la maggior parte dei problemi generali che si possono incontrare quando si sviluppa un'applicazione PHP/MySQL.
- TUTTI gli attributi in tutta l'applicazione devono essere impostati su UTF-8
- Salva il documento come UTF-8 senza BOM (se stai usando Notepad++, è
Format
->Convert to UTF-8 w/o BOM
) -
L'intestazione sia in PHP che in HTML dovrebbe essere impostata su UTF-8
-
HTML (all'interno di
<head></head>
tag):<meta charset="UTF-8">
-
PHP (nella parte superiore del file, prima di qualsiasi output):
header('Content-Type: text/html; charset=utf-8');
-
-
Dopo esserti connesso al database, imposta il set di caratteri su UTF-8 per il tuo oggetto di connessione, in questo modo (direttamente dopo la connessione)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */
Questo è per
mysqli_*
, ce ne sono di simili permysql_*
e PDO (vedi in fondo a questa risposta). -
Assicurati inoltre che il database e le tabelle siano impostati su UTF-8, puoi farlo in questo modo:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
(Tutti i dati già archiviati non verranno convertiti nel set di caratteri corretto, quindi dovrai farlo con un database pulito o aggiornare i dati dopo averlo fatto se ci sono caratteri interrotti).
- Se stai usando
json_encode()
, potrebbe essere necessario applicare ilJSON_UNESCAPED_UNICODE
flag, altrimenti convertirà i caratteri speciali nel loro equivalente esadecimale.
Ricorda che TUTTO nell'intera pipeline di codice deve essere impostato su UFT-8, altrimenti potresti riscontrare caratteri interrotti nella tua applicazione.
Oltre a questo elenco, potrebbero esserci funzioni che dispongono di un parametro specifico per specificare un set di caratteri. Il manuale ti parlerà di questo (un esempio è htmlspecialchars()
).
Ci sono anche funzioni speciali per i caratteri multibyte, ad esempio:strtolower()
non abbasserà i caratteri multibyte, per questo dovrai usare mb_strtolower()
, guarda questa dimostrazione dal vivo
.
Nota 1 :Nota che è da qualche parte indicato come utf-8
(con un trattino) e da qualche parte come utf8
(Senza esso). È importante sapere quando usarli, poiché di solito non sono intercambiabili. Ad esempio, HTML e PHP vogliono utf-8
, ma MySQL no.
Nota 2 :In MySQL, "charset" e "collation" non sono la stessa cosa, vedi Differenza tra codifica e confronto?
. Tuttavia, entrambi dovrebbero essere impostati su utf-8; generalmente le regole di confronto dovrebbero essere utf8_general_ci
o utf8_unicode_ci
, vedi UTF-8:Generale? Bidone? Unicode?
.
Nota 3 :Se stai usando emoji, MySQL deve essere specificato con un utf8mb4
charset invece dello standard utf8
, sia nel database che nella connessione. HTML e PHP avranno solo UTF-8
.
Impostazione UTF-8 con mysql_
e DOP
-
PDO:questo viene fatto nel DSN del tuo oggetto. Nota il
charset
attributo,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
-
mysql_
:Questo è fatto in modo molto simile amysqli_*
, ma non prende il connection-object come primo argomento.mysql_set_charset('utf8');