Avatar billede AnyFellow Mester
27. august 2015 - 14:10 Der er 10 kommentarer og
1 løsning

Problemer med utf8 data fra mysql db

Jeg har en hjemmeside, der har været lagt i skuffen i et års tid. Hjemmesiden er nu fundet frem igen, og lagt på et subdomæne, men jeg har pludselig problemer med at vise danske karakterer på min hjemmeside, på data hentet fra DB.

Jeg er helt blank på hvad der kan være galt, og kunne godt bruge hjælpe til hvad jeg kan kontrollere.

Jeg har allerede kontrolleret følgende:

Alle .php er gemt i UTF8 uden BOM (checket i notepad++)

Hjemmesiden har dette metatag:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

En søgning i databasen på CHARACTER_SET_NAME og COLLATION_NAME viser kun utf8 og utf8_general_ci

Når jeg laver forbindelse til databasen via pdo, bruger jeg denne i min forbindelsesstreng: charset=utf8

W3C-validatoren viser at hjemmesiden er encoded i UTF8

Jeg har kontrolleret min header her:
http://www.rexswain.com/httpview.html
Den viser at headeren indeholder: Content-Type:·text/html;·charset=UTF-8
Avatar billede Temp_dk Nybegynder
27. august 2015 - 15:37 #1
$db = new PDO('mysql:host='.$url.'; dbname='databasen'.'; charset=utf8', $dbuser, $kord);

/*
* brug utf-8
*/
$db->exec("SET CHARACTER SET utf8");
Avatar billede arne_v Ekspert
27. august 2015 - 18:11 #2
Saa alt siger at data er UTF-8.

Men er data i DB faktisk UTF-8?
Avatar billede AnyFellow Mester
27. august 2015 - 20:23 #3
Temp_dk...> Ingen forskel.

arne_v...>
Det vil jeg mene. Inden jeg afsluttede mit projekt, lavede jeg et dump af hele databasen i en sql-fil. Når jeg åbner sql-filen, er den utf8 uden bom. Jeg importerer sql-filen i phpmyadmin (husker at angive at den er utf8), og importen går fint. Data ser fine ud.

Prøver jeg at redigerer data i phpmyadmin i et felt som er utf8_general_ci, ser data korrekte ud, og ændrer jeg den danske karakter til en anden dansk karakter, vises den stadig forkert.
Avatar billede AnyFellow Mester
27. august 2015 - 20:32 #4
arne_v...>
Hvis jeg bruger utf8_decode() på en af mine felter, inden den vises på hjemmesiden, bliver den forkerte karakter ikke korrekt.

Bruger jeg utf8_encode() bliver tegnet korrekt. Det er vel et tegn på at mine data ikke er utf8?

Hvordan får jeg dem importeret som utf8 så?
Avatar billede AnyFellow Mester
27. august 2015 - 20:42 #5
Jeg har kontrolleret mit dump og selve databasen bliver oprettet med denne:
CREATE DATABASE IF NOT EXISTS `xxx` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `xxx`;

Mine tabeller oprettes alle med denne:
CREATE TABLE IF NOT EXISTS `xxx` (
  `xxx` int(11) NOT NULL AUTO_INCREMENT,
  `xxx` varchar(30) NOT NULL,
  PRIMARY KEY (`xxx`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=260 ;
Avatar billede nemlig Professor
27. august 2015 - 22:32 #6
Kan det være fordi headeren ikke er sat i php-filen:
Jeg havde et lignende problem, da mit webhotel skiftede standard-tegntabel på serveren.
Løsningen var at sætte headeren sådan her: (mit problem var dog modsat, da jeg havde alt mit gemt i ISO-8859-1 og One.com skiftede til UTF-8)

header('Content-Type: text/html; charset=utf-8');
Avatar billede ejvindh Ekspert
28. august 2015 - 08:29 #7
Det lyder godt nok som et "one.com"-webhotel.

Andre har bøvlet med lignende problemer, og måske du kan finde en løsning i denne tråd (der godt nok er målrettet et bestemt CMS, men løsningerne burde kunne oversættes til andre systemer):

http://php-fusion.dk/forum/viewthread.php?thread_id=19299
Avatar billede AnyFellow Mester
28. august 2015 - 10:36 #8
nemlig....> Ingen effekt

ejvindh...> Jeg har kigget tråden igennem, og kan se at det der foreslås allerede er på plads i min kode.

Min .htaccess indeholder: AddDefaultCharset UTF-8

Det er ikke et one.com webhotel.
Avatar billede AnyFellow Mester
29. august 2015 - 21:41 #9
Jeg har forsket lidt videre og når jeg kører denne:
show variables like 'char%

...mod databasen, via den connection min hjemmeside bruger, får jeg følgende retur:
character_set_client => latin1
character_set_connection => latin1
character_set_database => utf8
character_set_filesystem => binary
character_set_results => latin1
character_set_server => latin1
character_set_system => utf8

Jeg går ud fra det er skidt at nogle af dem står til latin1?

Resultatet er det samme, uanset hvilken af disse 2 connections jeg anvender:
$conn = new PDO("mysql:host=".$db_host.";dbname=".$db_name.";charset=utf8;", $db_user, $db_pass, array(PDO::ATTR_PERSISTENT => true));

eller

$conn = new PDO("mysql:host=".$db_host.";dbname=".$db_name.";charset=utf8;", $db_user, $db_pass, array(PDO::ATTR_PERSISTENT => true, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

Jeg har søgt op nettet omkring hvordan jeg skulle kunne ændre character_set_connection til utf8, men det burde den være med den connectionstreng jeg anvender.
Avatar billede AnyFellow Mester
09. september 2015 - 07:50 #10
Problemet har løst sig selv, idet mit webhotel pludselig har justeret databaseserverens settings tilbage til hvad de havde været tidligere. Årsagen til at de ikke stod rigtigt er ukendt.

Tak for deltagelse i tråden. Læg et svar, hvis du ønsker del i point.
Avatar billede AnyFellow Mester
16. september 2015 - 08:02 #11
Lukker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester