Avatar billede downloading Nybegynder
18. juli 2012 - 12:36 Der er 21 kommentarer og
1 løsning

Send data i url med 'æøå' i UTF8 mellem to siden og gem i MySQL

Hej alle sammen.

Jeg har igennem noget tid nu haft nogle problemer med encoding, databaser og at sende information i mellem disse. Mit problem er:

Jeg har en side i UTF8 der laver et link: "test.dk/test.php?variabel=Alan Sørensen"

test.php er ligeledes UTF8 og skal gemme variablen i en MySQL database der ligeledes er UTF8.

Hvordan skal man gøre det? Hvis jeg blot bruger echo uden vidre virker det i firefox og crome, men ikke i IE. Er den rigtige måde at gøre det på at bruge: urlencode($variabel) på siden med linket og urldecode($_GET['varaibel']) på test.php eller er der en anden korrekt metode?

På forhånd mange tak.
Avatar billede olebole Juniormester
18. juli 2012 - 16:59 #1
<ole>

Hvad betyder det, at dine filer "er i UTF-8"? Hvad har du gjort for at sørge for det?

Hvad betyder det, at din database "er UTF-8"? Hvad har du gjort for at sørge for det?

/mvh
</bole>
Avatar billede downloading Nybegynder
18. juli 2012 - 19:25 #2
Hvad betyder det, at dine filer "er i UTF-8"? Hvad har du gjort for at sørge for det?
Min editor står til at encode filerne i UTF-8

Hvad betyder det, at din database "er UTF-8"? Hvad har du gjort for at sørge for det?
Min MySQL tabeller er lavet med tegnsætningen "utf8_general_ci"

Giver det mening?
Avatar billede downloading Nybegynder
18. juli 2012 - 19:29 #3
Nej vent, min editor står til ANSI, måske det er et problem?
Avatar billede olebole Juniormester
18. juli 2012 - 19:43 #4
Ja, det er helt afgørende!  =)

Desuden skal du bruge utf8_danish_ci
Avatar billede olebole Juniormester
18. juli 2012 - 19:44 #5
Vær opmærksom på, at allerede bestående indholds encoding ikke automatisk ændres, når du skifter tegnsæt/kollation på din database eller tabel
Avatar billede downloading Nybegynder
18. juli 2012 - 19:52 #6
okay.. Så mine filer skal IKKE være ANSI, men UTF-8... Jeg har lidt problemer med at forstå om det skal være med eller uden bum?

Grunden til at min database er utf8_general_ci er at dataen i  der indsættet som link i "test.dk/test.php?variabel=Alan Sørensen" er taget fra en database der er utf8_general_ci, mener du stadig jeg bør bruge utf8_danish_ci? Som det er nu får jeg ting i databasen som TÃ¥ke Sær Tæøåke i stedet for Tåke Sær Tæøåke...
Avatar billede olebole Juniormester
18. juli 2012 - 20:04 #7
Så er den anden database også sat forkert op. Du kan ikke blande tegnsæt sammen.

Du skal gemme uden BOM. Det er tre 'usynlige' tegn i begyndelsen af filen, og de kan give problemer ved includes i kombination med brug af headers (også sessions og cookies).

Hvis du bruger phpMyAdmin til at administrere dine databaser med, skal du være sikker på, den er sat rigtigt op. Tjek evt. i browserens kildekode og se, hvad Content-Type meta'en siger.

Ofte er den sat op til iso-8859-1, og så er der sat vand over til ballade  :o|
Avatar billede downloading Nybegynder
18. juli 2012 - 20:13 #8
Den anden database er en joomla database og de står også fint hvis jeg går ind i den database i min phpMyAdmin.

phpMyAdmin er vidst også sat rigtigt op
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Min erfaring sagde mig også at der skulle bruges uden bum da jeg netop havde problemer med header på et tidspunkt. Jeg forstår dog ikke det med databasen. Hvis nu jeg fx gerne vil gemme både svenske, tyske og danske navne (som fx ö, æ, ø, å, é osv) hvorfor kan jeg så ikke gøre det uden problemer i en utf8_general_ci?

På forhånd tak.
Avatar billede olebole Juniormester
18. juli 2012 - 21:58 #9
Fordi, utf8_general_ci ikke sorterer æ, ø og å korrekt
Avatar billede downloading Nybegynder
18. juli 2012 - 22:13 #10
Når alle mine filer er ANSI as UTF-8 (uden bum), det er valget i Notepad++, da opstår samme fejl og det fremkommer stadig i phpMyAdmin som TÃ¥ke Sær Tæøåke i stedet for Tåke Sær Tæøåke...
Avatar billede olebole Juniormester
18. juli 2012 - 22:35 #11
Er det data, du lige har sat ind, du taler om?
Avatar billede downloading Nybegynder
18. juli 2012 - 22:51 #12
yep
Avatar billede olebole Juniormester
19. juli 2012 - 00:16 #13
Måske, din opsætning bruger en ANSI-forbindelse. Du kan prøve at skifte til utf-8:

$mysqli->set_charset('utf8');
Avatar billede downloading Nybegynder
19. juli 2012 - 00:39 #14
Hvis jeg udkommenterer linjen med utf8 er der ingen warnings, men den skriver som sagt mærkeligt i databasen. Skriver jeg linjen i min mysql connect som er angivet nedenfår får jeg fejlene også angivet nedenfor.

mysql_set_charset('utf-8');
// Make a MySQL Connection
mysql_connect('server', 'user', 'pass');
mysql_select_db("db") or die(mysql_error());



Warning: mysql_set_charset() [function.mysql-set-charset]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /home/www/mysql_connect.php on line 3

Warning: mysql_set_charset() [function.mysql-set-charset]: A link to the server could not be established in /home/www/mysql_connect.php on line 3

Warning: mysql_set_charset() [function.mysql-set-charset]: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /home/www/mysql_connect.php on line 3

Warning: mysql_set_charset() [function.mysql-set-charset]: A link to the server could not be established in /home/www/mysql_connect.php on line 3

Warning: Cannot modify header information - headers already sent by (output started at /home/www/mysql_connect.php:3) in /home/www/postxml.php on line 16


Bruger jeg følgende

får jeg
object(stdClass)#2 (8) { ["charset"]=> string(6) "latin1" ["collation"]=> string(17) "latin1_swedish_ci" ["comment"]=> string(0) "" ["dir"]=> string(0) "" ["min_length"]=> int(1) ["max_length"]=> int(1) ["number"]=> int(8) ["state"]=> int(801) }
hvilket jo kunne tyde på at det er sat til latin1. Men hvordan ændre jeg det med den kode du har, jeg bruger normalt MySQL og php med den connect jeg har vist og koder som:
$query = "SELECT * FROM tabel WHERE felt = '".$value."' ORDER BY id DESC";
$result = mysql_query($query)
or die(mysql_error('Error when selecting data'));
while($row = mysql_fetch_assoc($result)) {                    echo "'".$row["felt1"]."' at ".date('Y-m-d H:i', $row["felt2"])."<br>";
}


Mange tak for hjælpen..
Avatar billede downloading Nybegynder
19. juli 2012 - 00:42 #15
ups.. Bruger jeg følgende
  $db = mysqli_init();
  $db->real_connect('server', 'user', 'pass');
  var_dump($db->get_charset());
Avatar billede olebole Juniormester
19. juli 2012 - 03:44 #16
MySQL-API'et kan absolut ikke anbefales. Det er gammelt, fejlkonstrueret og usikkert. Brug MySQLI med prepared statements i stedet. Du åbner en MySQLI forbindelse med:

$mysqli = new mysqli('server', 'user', 'pass', 'database');
if (mysqli_connect_errno()) die (mysqli_connect_error());

// Først nu kan du sætte dit charset
$mysqli->set_charset('utf8');
Avatar billede downloading Nybegynder
19. juli 2012 - 13:06 #17
DET VIRKER! :)

Har lavet det hele om til MySQLI og brugt din
$mysqli->set_charset('utf8');

og nu står alt som det skal i databasen.. Du skal have rigtig mange tak for hjælpen! :) Vil du ikke skrive et svar?
Avatar billede olebole Juniormester
19. juli 2012 - 16:11 #18
Kanon! Ellers tak, jeg samler ikke point. Læg selv et svar og accepter det, så tråden lukkes  =)
Avatar billede downloading Nybegynder
19. juli 2012 - 16:17 #19
okay. Men ikke desto mindre mange tak for hjælpen..! Jeg tænker at det også må have kunnet virke med MySQL men at fejlen muligvis ligger i mysql_set_charset('utf-8'); men det er blot et gæt.. Alt i alt, der virker som det skal med MySQLI :) Tak for hjælpen..
Avatar billede olebole Juniormester
19. juli 2012 - 16:32 #20
Selvtak. Jo, det ville det sikkert, men hele den extension (MySQL) er officielt deprecated. Den falder formodentlig helt væk indenfor overskuelig fremtid, så du kan ligeså godt lære og vænne dig til at bruge MySQLI eller PDO (Portable Data Objects)  *o)
Avatar billede olebole Juniormester
19. juli 2012 - 16:33 #21
Har du ikke rodet med det før, er der her en lille begynder guide om emnet  =)
Avatar billede tobrukDk Novice
20. juli 2012 - 03:42 #22
#downloading

mysqli er vejen frem!. jeg har læse på flere side at det er bedre og mere sikkert og du bliver rigtigt god til php og mysqli hvis du kigge efter olebole lille guide som har lavet til os!! ;) jeg mener klart det er noget som du kan bruge frem over!
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