Avatar billede henninghabor Nybegynder
12. januar 2013 - 06:09 Der er 6 kommentarer og
1 løsning

Ingen output fra MySQL

Hej,

Jeg har et ret så irriterende problem på min lokale server:

-- phpMyAdmin SQL Dump
-- version 3.5.5
-- http://www.phpmyadmin.net
--
-- Vært: localhost
-- Genereringstid: 12. 01 2013 kl. 05:01:54
-- Serverversion: 5.1.67-community
-- PHP-version: 5.4.10

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `habor_dk`
--

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen `fr_cat`
--

CREATE TABLE IF NOT EXISTS `fr_cat` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ins` datetime NOT NULL COMMENT 'Inserted',
  `uid` int(11) NOT NULL COMMENT 'User ID',
  `catn` varchar(255) COLLATE latin1_danish_ci NOT NULL COMMENT 'Category name',
  `descr` text COLLATE latin1_danish_ci NOT NULL COMMENT 'Description',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci COMMENT='Forum categories' AUTO_INCREMENT=2 ;

--
-- Data dump for tabellen `fr_cat`
--

INSERT INTO `fr_cat` (`id`, `ins`, `uid`, `catn`, `descr`) VALUES
(1, '2013-01-12 04:43:59', 1, 'Nyt på habor.dk', 'Her kan du læse om de projekter, der er under udarbejdelse og de eksisterende projekter, der bliver opdateret.');

Jeg har Apache 2.2, MySQL Server 5.1, php 5.4.10 og phpMyAdmin 3.5.5.

Når jeg via php henter rækken, får jeg ingen output fra catn og descr, hvis de indeholder æøå.

Hvad skal jeg rette i min server-opsætning for at få output fra catn og descr?
Avatar billede henninghabor Nybegynder
12. januar 2013 - 13:33 #1
Jeg fandt selv løsningen:

mysql_set_charset("utf8") or die ("Default charset kunne ikke vælges: " . mysql_error ());
Avatar billede olebole Juniormester
12. januar 2013 - 18:06 #2
<ole>

Nej, det er ikke en løsning. Det svarer til at trampe på termometret ... patienten er stadig lige syg, selvom du ikke kan se det  =)

Problemet er, at du sætter din database til at bruge iso-8859-1, mens dit dokument tydeligvis er utf-8. I stedet skal du oprette tabellen sådan:

CREATE TABLE IF NOT EXISTS `fr_cat` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ins` datetime NOT NULL COMMENT 'Inserted',
  `uid` int(11) NOT NULL COMMENT 'User ID',
  `catn` varchar(255) COLLATE latin1_danish_ci NOT NULL COMMENT 'Category name',
  `descr` text COLLATE latin1_danish_ci NOT NULL COMMENT 'Description',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci COMMENT='Forum categories' AUTO_INCREMENT=2 ;

Derudover skal alle dine dokumenter være gemt som utf-8 - ligesom du skal bruge en utf-8-meta i alle dokumenter

/mvh
</bole>
Avatar billede henninghabor Nybegynder
12. januar 2013 - 22:57 #3
Hej olebole,

Tak fordi du gad tage dig tid til at give mig den hjælp, jeg helt tydeligt havde behov for.

Og hej. Lang tid siden. :)

Vil du ha' del i points?
Avatar billede olebole Juniormester
12. januar 2013 - 23:21 #4
Ellers tak, jeg har ikke samlet point de senere år  =)

Jeg opdager lige, at du også bør ændre collations på dine felter. Jeg overså, at to felter er sat til latin1_danish_ci. De bør også rettes til utf8_danish_ci
Avatar billede henninghabor Nybegynder
12. januar 2013 - 23:35 #5
Dem har jeg selvfølgelig også ændret. ;)

Jeg venter lige med at ændre kodningen på mine filer, da det gør at mit layout er knap så pænt. Så jeg må lige læse lidt først.

Mht. mysql_set_charset("utf-8"). Hvis den ikke er i min php kode, henter den stadig ikke æøå felter.
Avatar billede arne_v Ekspert
13. januar 2013 - 04:10 #6
Hvilket charset data er gemt paa disk i database med og hvilket charset som mysql(i) extension leverer data til PHP med er 2 forskellige ting.

Demo:

<?php
function dump($con, $field, $cs) {
    $con->set_charset($cs);
    $result = $con->query(sprintf('SELECT LENGTH(%s) AS L, CHAR_LENGTH(%s) AS CL, %s AS S FROM csfun', $field, $field, $field));
    while ($row = $result->fetch_assoc()) {
        echo sprintf("%s as %s - DB length : %d bytes %d chars - PHP length : %d bytes %d chars\r\n",
                    $field, $cs, $row['L'], $row['CL'], strlen($row['S']), mb_strlen($row['S'], $cs));
    }
    $result->free();
}

$con = new mysqli('localhost', 'root', '', 'Test');
$con->query('CREATE TABLE csfun (id INTEGER, s1 VARCHAR(50) CHARACTER SET latin1, s2 VARCHAR(50) CHARACTER SET utf8, PRIMARY KEY (id))');
$con->query('INSERT INTO csfun VALUES(1, \'ABC\', \'ABC\')');
$con->query('INSERT INTO csfun VALUES(2, \'ÆØÅ\', \'ÆØÅ\')');
dump($con, 's1', 'latin1');
dump($con, 's1', 'utf8');
dump($con, 's2', 'latin1');
dump($con, 's2', 'utf8');
$con->query('DROP TABLE csfun');
$con->close();
?>

Output:

s1 as latin1 - DB length : 3 bytes 3 chars - PHP length : 3 bytes 3 chars
s1 as latin1 - DB length : 3 bytes 3 chars - PHP length : 3 bytes 3 chars
s1 as utf8 - DB length : 3 bytes 3 chars - PHP length : 3 bytes 3 chars
s1 as utf8 - DB length : 3 bytes 3 chars - PHP length : 6 bytes 3 chars
s2 as latin1 - DB length : 3 bytes 3 chars - PHP length : 3 bytes 3 chars
s2 as latin1 - DB length : 6 bytes 3 chars - PHP length : 3 bytes 3 chars
s2 as utf8 - DB length : 3 bytes 3 chars - PHP length : 3 bytes 3 chars
s2 as utf8 - DB length : 6 bytes 3 chars - PHP length : 6 bytes 3 chars
Avatar billede arne_v Ekspert
13. januar 2013 - 04:10 #7
dog ingen tvivl om at lidt konsistens er godt
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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