[PHP/MySQL] incorrect string value

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rubix
  • Registratie: Juli 2004
  • Laatst online: 26-09-2022
Beste mensen,

Ik ben inmiddels al lang bezig met een probleem in PHP en ik kom er helaas zelf niet uit. Als ik POST-data uit een HTML-formulier met PHP in een MySQL-database wil opslaan, krijg ik de volgende foutmelding:

code:
1
Incorrect string value: '\xFCberfo...' for column 'goal' at row 1


Ik zit al een tijd in dit project te vechten met de encoding en wanneer het ene probleem wordt opgelost, verschijnt er weer een nieuw probleem.

Als eerste had ik een probleem met de weergave. Speciale karakters die in de php-bestanden stonden zoals ü en ë werden niet juist weergegeven. Ik heb toen die bestanden opnieuw opgeslagen als UTF-8 ipv. ASCII. Verder heb ik header('Content-Type:text/html; charset=utf-8'); toegevoegd aan connect.php (wordt ingevoegd op iedere pagina) dat verhielp het probleem.

Toen echter werden die karakters uit de database niet juist weergegeven. De betreffende tabel was echter wel ingedeeld als "utf8_general_ci". Een vriend van me heeft me toen de tip gegeven om mysql_set_charset('utf8'); toe te voegen na het openen van de databaseverbinding, dit repareerde de weergave.

Sindsdien krijg ik echter bovenstaande foutmelding bij INSERT en UPDATE queries. Ik heb van alles geprobeerd, zoals het toevoegen van enctype="multipart/form-data" accept-charset="UTF-8" in de FORM tag, mb_internal_encoding('utf8'); toegevoegd aan connect.php, mysql_query("SET NAMES utf8"); en mysql_query("SET CHARACTER SET utf8"); laten uitvoeren voordat de andere queries worden uitgevoerd, alles helaas zonder resultaat.

Na eindeloos Googlen ben ik het spoor compleet bijster. Sowieso heb ik nog nooit op een server meegemaakt dat ik zo veel regels code moet gebruiken om tot een juiste karakterweergave te komen. Ik vraag me dan ook af of er niet een configuratiefout is, hoewel ik wel MySQL opnieuw heb geconfigureerd en daarbij voor de beste ondersteuning voor multilingual heb gekozen.

De oplossing die ik nu heb gevonden is het volgende:
PHP:
1
2
3
if(isset($_POST)){
    $_POST = array_map('utf8_encode', $_POST);
}

Het werkt, maar het zou volgens mij niet nodig moeten zijn.

Weet iemand een manier om bovenstaande euvels op een efficiënte manier het hoofd te bieden?

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • apokalypse
  • Registratie: Augustus 2004
  • Laatst online: 16:42
Rubix schreef op zondag 30 mei 2010 @ 23:56:
Na eindeloos Googlen ben ik het spoor compleet bijster. Sowieso heb ik nog nooit op een server meegemaakt dat ik zo veel regels code moet gebruiken om tot een juiste karakterweergave te komen. Ik vraag me dan ook af of er niet een configuratiefout is, hoewel ik wel MySQL opnieuw heb geconfigureerd en daarbij voor de beste ondersteuning voor multilingual heb gekozen.
Hit nr 1:
Bug #30131 "Incorrect string value" error (1366) when inserting special characters
Status: Not a Bug
Ik kan me niet voorstellen dat daar geen nuttige informatie in staat. Ik krijg sowieso duizenden resultaten op google.

Acties:
  • 0 Henk 'm!

  • Rubix
  • Registratie: Juli 2004
  • Laatst online: 26-09-2022
Ik kreeg ook talloze resultaten op Google waarvan ik in ieder geval bovenstaande heb geprobeerd. De link die jij geeft was ik ook reeds tegen gekomen maar ook daar staat geen nieuwe informatie in en mijn Duits is niet toereikend, maar voor zover ik daarin kan lezen heb ik dat in mijn 1e bericht ook al beschreven.

Ik zal het nog even aanvullen. De karakterset van het document is UTF-8, de database is UTF-8 en verwacht ook UTF-8, enkel de POST-data is blijkbaar niet UTF-8. Ik heb ook een workaround hierboven geplaatst maar het is geen oplossing. Ik ging ervan uit dat mijn bovenstaande beschrijving duidelijk zou maken dat ik al een lange zoektocht op Google achter de rug had. Wellicht staat op pagina 346125 dé oplossing, maar na vele pagina's doorzoeken kwam ik op een gegeven moment enkel op dezelfde antwoorden uit die ik al had geprobeerd. Wellicht heb ik iets over het hoofd gezien, maar als ik geen moeite zou hebben gedaan tot intensief speuren zou ik hier niet gepost hebben. Daarom hoop ik dat iemand hier met een frisse kijk op de situatie wellicht het probleem herkent en een oplossing kan bieden.

[ Voor 56% gewijzigd door Rubix op 31-05-2010 01:10 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Is de content-type van je pagina ook echt daadwerkelijk UTF-8 in de browser? Controleer dat eens.

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 08-04 04:38
als je aan de server kant alles al hebt geprobeerd, misschien moet je eens gaan kijken op invoer niveau.

misschien kun je hier wat mee:
http://www.w3.org/TR/html....html#adef-accept-charset

Acties:
  • 0 Henk 'm!

  • Rubix
  • Registratie: Juli 2004
  • Laatst online: 26-09-2022
stef-o schreef op maandag 31 mei 2010 @ 08:51:
als je aan de server kant alles al hebt geprobeerd, misschien moet je eens gaan kijken op invoer niveau.

misschien kun je hier wat mee:
http://www.w3.org/TR/html....html#adef-accept-charset
Hoi Stef-O, ik had dat reeds toegevoegd aan het form, helaas zonder resultaat:
Rubix schreef op zondag 30 mei 2010 @ 23:56:
Ik heb van alles geprobeerd, zoals het toevoegen van enctype="multipart/form-data" accept-charset="UTF-8" in de FORM tag,
HuHu schreef op maandag 31 mei 2010 @ 08:39:
Is de content-type van je pagina ook echt daadwerkelijk UTF-8 in de browser? Controleer dat eens.
Firefox geeft volgens mij alles juist aan:

Afbeeldingslocatie: http://kicken.dendmedia.com/paginainfo.png

Edit:
Het is wellicht waardevol om hierbij te vermelden dat de POST data via javascript wordt gegenereerd. Om een zo laag mogelijk dataverkeer te bewerkstelligen heb ik ervoor gekozen om een groot deel van de handelingen via Ajax te laten verlopen. Dit is hoe de POST-string voor de formulieren wordt gegenereerd:


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function getFormValues(fobj,valFunc){
    var str = "";
    var valueArr = null;
    var val = "";
    var cmd = "";
    for(var i = 0;i < fobj.elements.length;i++){
        switch(fobj.elements[i].type){
            case "text":
            case "hidden":
            case "textarea":
            case "checkbox":
            case "radio":
            case "password":
            if(valFunc){
                cmd = valFunc + "(" + 'fobj.elements[i].value' + ")";
            }
            str += fobj.elements[i].name +
            "=" + escape(fobj.elements[i].value) + "&";
            break;
            case "select-one":
            str += fobj.elements[i].name +
            "=" + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + "&";
            break;
        }
    }
    str = str.substr(0,(str.length - 1));
    document.getElementById('formContents').innerHTML = '';
    document.getElementById('formPaper').style.backgroundImage = 'url(/images/ani_loading_'+getFormColor()+'.gif)';
    return str;
}


Verder is het zo dat wanneer ik in PHP de regel:
PHP:
1
mysql_set_charset("utf8");

weglaat, de data wel goed gaat met de INSERT- en UPDATE-queries, maar opgehaalde data weer niet goed wordt weergegeven in de PHP-pagina.

Edit 2:
Dit is de header die ik mee stuur via Ajax:

JavaScript:
1
doc.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8");


Bij Firefox komt er geen MySQL-fout bij een submit (ik gebruik normaal IE8 bij het testen) maar speciale karakters komen nog niet goed door, namelijk als blokjes.

[ Voor 59% gewijzigd door Rubix op 31-05-2010 12:44 ]

Pagina: 1