[php]Databas-tabell har UTF8, men inte listen på sidan

Permalänk

[php]Databas-tabell har UTF8, men inte listen på sidan

Jag har en list (<select><option>) som fylls på från en databastabell. Allt i tabellen är UTF8, sidan är satt till UTF8 och inget annat på sidan har problem med ÅÄÖ, förutom denna rull-list (som skapas i en extern PHP-fil).
Är det någon som vet varför ÅÄÖ krånglar, om allt är satt till UTF8?

Vad jag har prövat:
1) Ändra encoding i tabellen till Latin1 och sedan tillbaka till UTF8 och uppdatera databasen
2) utf8_encode($strängen)
3) <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

php filen kanske inte är sparad i utf8 format? hade samma problem och det löste mitt problem iaf.

Visa signatur

| Ryzen 1700 @ 4.0 ghz | Asus PRIME X370-PRO | 32 GB Corsair Vengeance LP 3000 mHz | Gigabyte GTX 770 2-way SLI | BenQ XL2410T, 5x AOC e2460SDA | Fractal design R5 | https://i.imgur.com/rjO3bLw.jpg

Software developer

Permalänk
Medlem

Jag tror det kan krångla om ditt .php-dokument inte blir sparat med UTF-8 teckenkodning. Så kolla i din editor vilken teckenkodning som används.

Permalänk

php-dokumentet är i UTF8!

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk

Jag har annan text på både målsidan och den importerade php-koden som har ÅÄÖ i sig... jag skriver till och med ut samma text från samma fil på samma sida i en div och får rätt tecken, det är bara i rull-listen det blir fel.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

hmm provat med mysql_set_charset ?

Visa signatur

| Ryzen 1700 @ 4.0 ghz | Asus PRIME X370-PRO | 32 GB Corsair Vengeance LP 3000 mHz | Gigabyte GTX 770 2-way SLI | BenQ XL2410T, 5x AOC e2460SDA | Fractal design R5 | https://i.imgur.com/rjO3bLw.jpg

Software developer

Permalänk

Tror inte den är så aktuell... Har inget att sätta den på. Den är ju mest för när man skall ha saker in i databasen

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk

Ett tips kan vara att spara om alla php-filer i UTF-8 även om de verkar vara rätt, vissa texteditorer kan ibland fucka upp kodningen av någon anledning. Testa gärna med något annat program och se om det blir någon skillnad.

Permalänk
Medlem

Vad använder du för program när du redigerar dina filer?
Använder själv Notepad++ till mitt php forum och spara alla filer i (Utf-8 utan Bom)
Se bild

Visa signatur

Man lever som man bör. Bör leva som man lever. Ibland blir det torsk men alltid en seger.

Permalänk
Medlem

Sätt din mysqlanslutning till UTF8 direkt efter att du upprättat din mysqlanslutning.

Permalänk
Medlem

mysql_query("SET NAMES `utf8`");

Permalänk
Medlem
Skrivet av Sir. Haxalot:

mysql_query("SET NAMES `utf8`");

Som denna person skrev. Antagligen behöver du configurera om MySQL servern för att göra detta eller så gör du detta kommandot precis efter du har connectat till SQL servern. Som default måste du använda dig av raden ovan bara så att du vet.

Om du har insertat data innan och haft samma problem, värt att nämna att du kan behöva skriva om alla data.

Visa signatur

Speldator: i7-8700k, 32GB DDR4, RTX2080
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift

Permalänk
Skrivet av morphman86:

Jag har en list (<select><option>) som fylls på från en databastabell. Allt i tabellen är UTF8, sidan är satt till UTF8 och inget annat på sidan har problem med ÅÄÖ, förutom denna rull-list (som skapas i en extern PHP-fil).
Är det någon som vet varför ÅÄÖ krånglar, om allt är satt till UTF8?

Vad jag har prövat:
1) Ändra encoding i tabellen till Latin1 och sedan tillbaka till UTF8 och uppdatera databasen
2) utf8_encode($strängen)
3) <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

Jag brukar alltid köra allt som har åäö genom utf8_decode()-funktionen. Fungerar alltid för mig i alla fall när jag kör php.

Prova utf8_decode($strängen) istället för utf8_encode.

Mvh,
T

Visa signatur

CPU: AMD FX-8350 @ 4.7GHz | RAM: 32GB Vengeance @1600MHz | GPU: Asus HD7970 DCII Top @ 1.0/5.6 GHz | ASRock 990FX Fatal1ty | PSU: Newton R3 800W Platinum | HD: 128 GB Plextor M3 Pro, 300 GB WD Green | triple-boot: Win7-64,WinXP-32,debian-64

Permalänk
Hedersmedlem
Skrivet av Sir. Haxalot:

mysql_query("SET NAMES `utf8`");

Skrivet av MugiMugi:

Som denna person skrev. Antagligen behöver du configurera om MySQL servern för att göra detta eller så gör du detta kommandot precis efter du har connectat till SQL servern. Som default måste du använda dig av raden ovan bara så att du vet.

Om du har insertat data innan och haft samma problem, värt att nämna att du kan behöva skriva om alla data.

Från http://se2.php.net/manual/en/function.mysql-set-charset.php:

Citat:

Using mysql_query() to execute SET NAMES .. is not recommended.

Använd antingen mysql_set_charset():

mysql_set_charset('utf-8');

direkt efter t ex `mysql_select_db()` om du använder det (sedan länge icke rekommenderade, i nära framtida versioner 'deprecated' för att därefter helt tas bort) gamla `mysql`-biblioteket, eller mysqli_set_charset('utf-8') / $mysqli->set_charset('utf-8') om du använder `mysqli`.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Skrivet av TMO KOTOR:

Ett tips kan vara att spara om alla php-filer i UTF-8 även om de verkar vara rätt, vissa texteditorer kan ibland fucka upp kodningen av någon anledning. Testa gärna med något annat program och se om det blir någon skillnad.

Skrivet av IntelCorei5:

Vad använder du för program när du redigerar dina filer?
Använder själv Notepad++ till mitt php forum och spara alla filer i (Utf-8 utan Bom)
Se bild

Använder Notepad++, har testat att spara om alla filer i UTF-8, trots att det står som standard... Samma problem.

Skrivet av bellasoda:

Jag brukar alltid köra allt som har åäö genom utf8_decode()-funktionen. Fungerar alltid för mig i alla fall när jag kör php.

Prova utf8_decode($strängen) istället för utf8_encode.

Mvh,
T

Ingen skillnad

Skrivet av phz:

Från http://se2.php.net/manual/en/function.mysql-set-charset.php:

Citat:

Using mysql_query() to execute SET NAMES .. is not recommended.

Använd antingen mysql_set_charset():

mysql_set_charset('utf-8');

direkt efter t ex `mysql_select_db()` om du använder det (sedan länge icke rekommenderade, i nära framtida versioner 'deprecated' för att därefter helt tas bort) gamla `mysql`-biblioteket, eller mysqli_set_charset('utf-8') / $mysqli->set_charset('utf-8') om du använder `mysqli`.

Testade, fortfarande samma problem.

--------

Jag har alltså lagt in informationen som UTF-8 i en tabell inställd för UTF-8 och vill visa det på en sida inställd på UTF-8. Exakt samma position skrivs ut på andra ställen utan problem, det är ENDAST i rull-listen som Å, Ä och Ö blir <?>.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Hedersmedlem
Skrivet av morphman86:

Jag har alltså lagt in informationen som UTF-8 i en tabell inställd för UTF-8 och vill visa det på en sida inställd på UTF-8. Exakt samma position skrivs ut på andra ställen utan problem, det är ENDAST i rull-listen som Å, Ä och Ö blir <?>.

Visa kod om du vill kunna få mer hjälp.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Skrivet av phz:

Visa kod om du vill kunna få mer hjälp.

Här vill jag få ut strängen:

$pos = strrpos($prodGroupNameString, $prodGroupName); if($pos === false){ $prodGroupNameString .= '<option value="' . $prodGroupName .'">' . $prodGroupName . '</option>'; } ?> <div class="hiddenDiv" name="<?php echo $prodGroupName; ?>" onclick="addProduct(<?php echo $art; ?>);"> <p>Artikelnummer: <?php echo $art;?></p> <p><?php echo $desc; ?></p> <p><?php echo "H: " . $y . " B: " . $x . " L: " . $z; ?></p> <img src="<?php echo $imgPath; ?>" alt="<?php echo $desc; ?>" height="<?php echo $y; ?>" width="<?php echo $x; ?>" /> </div> <?php } ?> <select id="dropdown" onchange="dropDown(this.value);"> <option value="Välj produkt...">Välj produkt...</option> <?php echo $prodGroupNameString; ?> </select>

Här läggs den in i databasen:

include "dbconnect.php"; $target_table = "planographic"; $source_file = "PLANOGRAM.csv"; clearDB($target_table); csv_file_to_mysql_table($source_file, $target_table); function csv_file_to_mysql_table($source_file, $target_table, $max_line_length=10000) { $counter = 0; set_time_limit(600); echo "Updating $target_table from $source_file<br />"; if (($handle = fopen("$source_file", "r")) !== FALSE) { echo "File open, retrieving data from $source_file <br />"; $columns = fgetcsv($handle, $max_line_length, ";"); foreach ($columns as &$column) { $column = str_replace(".","",$column); } $insert_query_prefix = "INSERT INTO $target_table (art, description, productGroupNumber, productGroupName, X, Y, Z, EAN, nullPoint)\nVALUES"; while (($data = fgetcsv($handle, $max_line_length, ";")) !== FALSE) { while (count($data)>count($columns)) array_push($data); $query = "$insert_query_prefix (".implode(",",quote_all_array($data)).");"; mysql_query($query) or die(mysql_error()); $counter++; } fclose($handle); } else { echo "Could not open file '$source_file' <br />"; } echo "Successfully added $counter rows to $target_table from $source_file<br />"; } function quote_all_array($values) { foreach ($values as $key=>$value) if (is_array($value)) $values[$key] = quote_all_array($value); else $values[$key] = quote_all($value); return $values; } function quote_all($value) { if (is_null($value)) return "NULL"; $value = "'" . mysql_real_escape_string($value) . "'"; return $value; } function clearDB($table){ $queryClear = "TRUNCATE " . $table; mysql_query($queryClear) or die(mysql_error()); echo "Clearing $table<br />"; }

Vet inte riktigt hur det skall hjälpa, charsetten sätts ju i inställningarna för tabellen samt i meta-taggen för sidan. Här är meta-taggen, om du vill ha den:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Hedersmedlem

Är .csv-filen i UTF-8? Har du satt `mysql_set_charset('utf8')` innan du läser in filen i databasen?

Om du dumpar datan ur databasen, hur ser den ut? Minimalt exempel:

<!doctype html> <meta charset="utf-8"> <title>Test</title> <pre> <?php require('dbconnect.php'); // Testa med och utan nedanstående rad och se om det är någon skillnad mysql_set_charset('utf8'); $result = mysql_query('SELECT * FROM planographic'); while ($row = mysql_fetch_assoc($result)) var_dump($row); ?> </pre>

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk

Jag lyckades lösa det, fråga mig inte hur. Jag läste in CVS-filen i databasen två gånger till och plötsligt funkade det, testade att köra in den en gång till och det slutade funka... Det verkar vara något skumt med datorn jag sitter vid, för det funkar ungefär var femte gång. Jag "tömde ut" cvs-filen i en array, satte utf8_encode på varje "rad" och lade tillbaka i en ny fil och efter den omvägen funkar det varje gång.

Dock tycks inte mitt program tänka så. Jag får fortfarande okänt fel varje gång jag använder en av de positioner som innehåller Å Ä eller Ö i just den kolumnen, de andra kolumnerna är ok. Det enda stället jag använder den kolumnen är för att välja vilken del i sidomenyn som skall vara synlig (<div class="hiddenDiv" name="<?php echo $prodGroupName; ?>" onclick="addProduct(<?php echo $art; ?>);"> från mitt tidigare inlägg och det är $prodGroupName som är problemet).
Det går att välja den i rull-listen, divvarna med det värdet på $prodGroupName blir synliga, men när jag klickar på den och den skall läggas till i ett kanvas-element, så får jag okänt fel, som om den fortfarande har fel charset. Det är endast de med Å, Ä eller Ö i $prodGroupName som blir problem.

Koden som aktiveras onclick på divven är följande:

function addProduct(article){ var source = new Array(); source = getImageSrc(article); //hämtar bilden i kinetic-format var numStack = numPerStackCalc(source[3]); //en funktion för att räkna ut djup, används till andra delar av programmet var temp = [{ src: source[0], x: this.x, y: this.y, width: source[1], height: source[2], depth: source[3], numPerStack: numStack, drag: true, article: article, desc: source[4], prodGroup: source[4], id: window.idTag }]; product.push(temp[0]); //lägger in produktinfo plus bildinfo i en array hasBeenAdded++; //Behövdes för att hålla reda på antal som blivit tillagda för en borttagningsfunktion updateStage(); //Lägger in bilden i canvas och ritar upp den på skärmen toList(temp[0]); //array som används till en listning av produkterna }

Hoppas kommentarerna hjälper. Om inte, kan jag ge lite mer av koden.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk

Tydligen låg felet på annan plats. Det var bara en tillfällighet att det råkade vara just de produkter med Å,Ä,Ö i namnen som det blev fel på. Det är nämligen artikelnummret som blir fel.

Dessa produkter är de enda som har ett bindestreck i sitt artikelnummer och någonstans mellan PHP'n och Javascriptet görs det om från en sträng till ett uträknat nummer.
60070-60 blir då 60070-60 i PHP'n, men 60010 i JS'en.

<div class="hiddenDiv" name="<?php echo $prodGroupName; ?>" onclick="addProduct(<?php echo $art; ?>);">

är där jag kallar på det, men mottagaren får det som ett uträknat tal.

function addProduct(article)

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Hedersmedlem
Skrivet av morphman86:

Tydligen låg felet på annan plats. Det var bara en tillfällighet att det råkade vara just de produkter med Å,Ä,Ö i namnen som det blev fel på. Det är nämligen artikelnummret som blir fel.

Dessa produkter är de enda som har ett bindestreck i sitt artikelnummer och någonstans mellan PHP'n och Javascriptet görs det om från en sträng till ett uträknat nummer.
60070-60 blir då 60070-60 i PHP'n, men 60010 i JS'en.

<div class="hiddenDiv" name="<?php echo $prodGroupName; ?>" onclick="addProduct(<?php echo $art; ?>);">

är där jag kallar på det, men mottagaren får det som ett uträknat tal.

function addProduct(article)

Du får lägga till quotes i JavaScript, annars är det så det fungerar (liksom PHP och de flesta (alltid farligt att säga "alla" . Tänker t ex direkt på shell script) andra programmeringsspråk).

Alltså:

<div class="hiddenDiv" name="<?php echo $prodGroupName; ?>" onclick="addProduct('<?php echo $art; ?>');">

borde fungera.

(Notera att du bör vara defensiv när du skriver ut data från en databas via PHP i HTML (se htmlspecialchars()), och inte minst direkt i JavaScript-omgivning (se json_encode()).)

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk

Jo tack, märkte det. En rejäl slump som spelade in här, men det är så det brukar vara. Det var dock bra att jag fick ordning på tecknen ändå, det ser så oproffsigt ut med <?> istället för å,ä,ö

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk

Låter som att webbservern skickar med latin1-header. Vill man, kan man alltid ändra den informationen antingen med en .htaccess-fil, ändra i konfigurationsfilerna, eller ändra på varje sida med header()-funktionen.

Permalänk

Skall tänka på det till nästa gång, men just nu fungerar det så jag vågar inte peta för mycket på det. Fulkod, men det funkar.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10