PHP - Jobba med databaser

Webbutveckling / PHP

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