PHP - Jobba med databaser
Anslut till MySQL-databas med UTF-8-anslutning (Mysqli)
Om du vill använda teckentabellen UTF-8 i din webbsajt/webbapp krävs lite extra arbete för att tecken ska kodas/avkodas korrekt och för att de ska sparas korrekt i MySQL-databasen.
Först och främst måste MySQL-databasen använda teckentabellen UTF-8 när den spar data. För att den ska göra det anger du några extra parametrar när du skapar databasen. Om du vill skapa databasen direkt i MySQL- kommandoradsverktyget mysql kan du göra det enligt följande exempel:
create database databasnamn default character set utf8 default collate utf8_general_ci;
De HTML-dokument/PHP-filer som ska visa innehåll/innehåller formulär ska kodas i UTF-8 och taggen <meta charset="UTF-8"> ska användas i källkoden.
Värt att nämna i sammanhanget är även PHP-funktionen header;
header("Content-Type: text/html; charset=utf-8");
och förmulärattributet accept-charset;
<form action="saveformdata.php" accept-charset="UTF-8">
Om databasen skapats med parametrar enligt exemplet ovan, HTML-dokumenten/PHP-filerna kodats i UTF-8 och har taggen <meta charset="UTF-8"> i källkoden ska header och accept-charset inte behövas.
Värt att nämna är också att det brukar rekommenderas att man kodar HTML-dokument/PHP-filer i UTF-8 utan BOM (byte order mark) för att undvika problem med vissa textredigerare, äldre webbläsare och PHP-funktionen header. Själv har jag upplevt problem med avkodningen av specialtecken i PHP-filer kodade i UTF-8 utan BOM, trots att <meta charset="UTF-8"> funnits i källkoden. Koda i UTF-8 med eller utan BOM är alltså frågan... Här är det som vanligt trial and error-metoden som gäller, du får prova dig fram.
Det om detta... Med din UTF-8-MySQL-databas på plats:
Procedural stil
Spar exempelkoden nedan i en fil med teckenkodning UTF-8 och filändelsen .php.
Exempelkod:
<?php // connect $host = "127.0.0.1"; $user = "db_username"; $password = "password for db_username"; $database = "db_name"; $conn = mysqli_connect($host, $user, $password, $database, 3306); //check connection if(mysqli_connect_errno()){ printf("Connect failed: %s", mysqli_connect_error()); exit(); } echo "<p>Connected to database</p>"; // change character set to utf8 if(!mysqli_set_charset($conn, "utf8")){ printf("Error loading character set utf8: %s", mysqli_error($conn)); } else { printf("Current character set: %s", mysqli_character_set_name($conn)); } // close connection mysqli_close($conn); ?>
Objekt-orienterad stil
Spar exempelkoden nedan i en fil med teckenkodning UTF-8 och filändelsen .php
Exempelkod:
<?php // connect $host = "127.0.0.1"; $user = "db_username"; $password = "password for db_username"; $database = "db_name"; $mysqli = new mysqli($host, $user, $password, $database, 3306); // check connection if($mysqli->connect_errno){ printf("Connect failed: %s", $mysqli->connect_error); exit(); } echo "<p>Connected to database</p>"; // change character set to utf8 if(!$mysqli->set_charset("utf8")){ printf("Error loading character set utf8: %s", $mysqli->error); exit(); } else { printf("Current character set: %s", $mysqli->character_set_name()); } // close connection $mysqli->close(); ?>
Mer info:
Mysqli - Connections
Mysqli - Set charset
mysql — The MySQL Command-Line Tool
Set HTTP header to UTF-8 using PHP
PHP - header
HTML <form> accept-charset Attribute