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_UNICODEflag, 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
charsetattributo,$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');