18. juli 2012 - 12:36Der 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?
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...
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|
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?
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...
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>"; }
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');
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..
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)
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!
Synes godt om
Ny brugerNybegynder
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.