MySQL, PHP und Umlaute
am 08.03.2006 20:28:12 von Michael Koch
Hallo,
habe hier ein Problemchen. Ich habe ein Script programmiert, daß
Teilnehmerdaten in eine MySQL Datenbank eintragen soll (Windows 2003).
Soweit so gut. Das funktioniert auch wunderbar, wenn keine Umlaute im Namen
sind.
Diese Abfrage funktioniert nicht, wenn ich Sie über mein Skript starte mit
mysql_query():
INSERT INTO teilnehmer
(Name,Vorname,Firma,Titel,Anrede,Veranstaltung,Mail,AnmeldeI P,AnmeldeDatum)
VALUES('dsdsd','jürgen','Test','1','1','2','mkoch@test.de',' xx.134.70.97','
2006-03-08').
Das Skript wirft dann den Fehler:"Data too long for column 'Vorname' at row
1" und trägt die Zeile auch nicht ein.
Wenn ich nun diesen String nehme und gebe in an z.B. PhpMyAdmin, dann trägt
er die Zeile wunderbar ein.
Einer eine Idee wo ich ansetzen könnte?
Gruß und Danke
Michael
Re: MySQL, PHP und Umlaute
am 08.03.2006 21:26:07 von Bodo Kaelberer
Hi Michael
Michael Koch am 8 Mar 2006 19:28:12 GMT:
> habe hier ein Problemchen. Ich habe ein Script programmiert, daß
> Teilnehmerdaten in eine MySQL Datenbank eintragen soll (Windows 2003).
> Soweit so gut. Das funktioniert auch wunderbar, wenn keine Umlaute im Namen
> sind.
> Diese Abfrage funktioniert nicht, wenn ich Sie über mein Skript starte mit
> mysql_query():
> INSERT INTO teilnehmer
> (Name,Vorname,Firma,Titel,Anrede,Veranstaltung,Mail,AnmeldeI P,AnmeldeDatum)
> VALUES('dsdsd','jürgen','Test','1','1','2','mkoch@test.de',' xx.134.70.97','
> 2006-03-08').
>
> Das Skript wirft dann den Fehler:"Data too long for column 'Vorname' at row
> 1" und trägt die Zeile auch nicht ein.
Da sehe ich erst mal keinen Zusammenhang zum Umlaut.
Wieviel Zeichen passen denn laut Tabellendefinition in die Spalte
"Vorname"?
KLappt ansonsten identisch mit dem Text "juergen"?
Existiert das Problem auch bei anderen Spalten?
> Wenn ich nun diesen String nehme und gebe in an z.B. PhpMyAdmin, dann trägt
> er die Zeile wunderbar ein.
Du lässt Dir vom Script das von diesem verwendete Statement ausgeben,
kopierst es in PHPMyAdmin und dort funktioniert es?
Ist das Statement in der angezeigten Seite identisch mit dem im
Source-Code? Wegen im Browser nicht angezeigter Leerzeichen?
--
Re: MySQL, PHP und Umlaute
am 08.03.2006 22:23:05 von Michael Koch
Hi Bodo,
Bodo Kaelberer wrote:
> Da sehe ich erst mal keinen Zusammenhang zum Umlaut.
>
> Wieviel Zeichen passen denn laut Tabellendefinition in die Spalte
> "Vorname"?
50 varchars passen in die Spalte.
> KLappt ansonsten identisch mit dem Text "juergen"?
Ja, das klappt wunderbar. Nur wenn ein Umlaut drin ist, klappt es nicht.
Deswegen denke ich daß es damit auch zusammenhängen muß.
> Existiert das Problem auch bei anderen Spalten?
Ja, bei allen Spalten, bei denen ich was im Skript eintragen kann. Sind
alle vom Typ varchar. Liegt es womöglich daran?
> Du lässt Dir vom Script das von diesem verwendete Statement ausgeben,
> kopierst es in PHPMyAdmin und dort funktioniert es?
Ja, richtig. Dort funktionierts.
> Ist das Statement in der angezeigten Seite identisch mit dem im
> Source-Code? Wegen im Browser nicht angezeigter Leerzeichen?
Hmm, gute Frage. Zumindest wenn ich das Statement aus dem HTML-Quelltext
kopiere, müsste es identisch sein, oder? So funktionierts nämlich. Aber ich
poste mal entsprechenden Code aus dem Skript. Vielleicht findet jemand
einen Fehler.
$sql="INSERT INTO teilnehmer
(Name,Vorname,Firma,Titel,Anrede,Veranstaltung,Mail,AnmeldeI P,AnmeldeDatum)
"." VALUES('" . $_POST['fName1'] . "','" . $_POST['fVorname1'] . "','" .
$_POST['fFirma'] . "','" . $_POST['fTitel1']. "','" . $_POST['fAnrede1'] .
"','" . $_POST['fVeranstaltung']. "','" . $_POST['fEmail']. "','" . getenv
("REMOTE_ADDR") . "','" . date( "Y-m-d", time()) . "')";
Noch ne Idee?
Danke
Michael
Re: MySQL, PHP und Umlaute
am 08.03.2006 23:03:14 von Bodo Kaelberer
Abend Michael
Michael Koch am 8 Mar 2006 21:23:05 GMT:
> > Existiert das Problem auch bei anderen Spalten?
>
> Ja, bei allen Spalten, bei denen ich was im Skript eintragen kann. Sind
> alle vom Typ varchar. Liegt es womöglich daran?
Wüsste nicht, wieso. Zum Zweck der Erruierung kannst Du es natürlich
mal mit CHAR oder TEXT ausprobieren.
Ich haue seit Jahr und Tag meine Umlaute einfach in die Datenbank und
fertig. Egal ob CHAR, VARCHAR oder TEXT und egal ob MySQL3 oder MySQL
mit Charsets.
Mein MySQL (4.1.10) schert sich übrigens einen Scheiss darum, ob der
Test reinpasst. Der wird einfach abgeschnitten.
Vermutlich liegt bei Dir ein ganz anderes Problem vor, dass
fälschlicherweise so gedeutet wird. Oder es ist dem Error-Code eine
falsche Fehlermeldung zugeordnet?
Welche MySQL-Version hast Du denn und hast Du ein charset für das Feld
definiert? Ich verwende latin1_swedish_ci. Mit einem utf8 kannst Du es
auch mal probieren.
> > Ist das Statement in der angezeigten Seite identisch mit dem im
> > Source-Code? Wegen im Browser nicht angezeigter Leerzeichen?
>
> Hmm, gute Frage. Zumindest wenn ich das Statement aus dem HTML-Quelltext
> kopiere, müsste es identisch sein, oder?
Eigentlich ja. (-;
Kannst Du das Statement mal in der MySQL-Console testen?
>
>
> $sql="INSERT INTO teilnehmer
> (Name,Vorname,Firma,Titel,Anrede,Veranstaltung,Mail,AnmeldeI P,AnmeldeDatum)
> "." VALUES('" . $_POST['fName1'] . "','" . $_POST['fVorname1'] . "','" .
> $_POST['fFirma'] . "','" . $_POST['fTitel1']. "','" . $_POST['fAnrede1'] .
> "','" . $_POST['fVeranstaltung']. "','" . $_POST['fEmail']. "','" . getenv
> ("REMOTE_ADDR") . "','" . date( "Y-m-d", time()) . "')";
>
>
Ich habe mal die Variablen mit Dummies aufgefüllt und das
resultierende Statement sieht korrekt aus. Wenn da also nicht
exotische Werte aus dem POST kommen stehen (hundert Leerzeichen oder
dergleichen - das müsstet Du im Source sehen), dann fällt mir nichts
sein.
Würde es mit PHPMyAdmin nicht funktionieren, würde ich sagen, Dein
MySQL spinnt (-;
Mal ein anderes Thema: Werte direkt aus $_POST in das Statement zu
übernehmen ist potentiell anfällig für SQL-Objektions. In der Regel
ist es das nicht, weil magic_quotes_pgc auf on steht. Aber das soll ab
PHP6 anders sein und kann ja nach Konfiguration auch jetzt schon
abgestellt sein.
Der saubere Weg ist, dass Du mittels get_magic_quotes_gpc() prüfst, ob
es aktiv ist und wenn ja, die Werte aus $_POST mittels stripslashes()
entstrippst. Dann werden sie mittels mysql_real_escape_string() so
kodiert, dass sie im Statement verwendet werden können.
Vielleicht löst die Verwendung von mysql_real_escape_string() auch
dein Umlaute-Problem. Das agiert nämlich u.a. abhängig vom Charset.
Bye
--
Re: MySQL, PHP und Umlaute
am 08.03.2006 23:04:16 von Michael Koch
Hallo zusammen,
Michael Koch wrote:
> Das Skript wirft dann den Fehler:"Data too long for column 'Vorname'
> at row 1" und trägt die Zeile auch nicht ein.
>
> Wenn ich nun diesen String nehme und gebe in an z.B. PhpMyAdmin, dann
> trägt er die Zeile wunderbar ein.
>
> Einer eine Idee wo ich ansetzen könnte?
So ich hab es rausgefunden. Ich muß einfach die einzelnen Strings, durch
utf8_encode nach utf8 konvertieren, dann klappts.
Ist schon arg verwirrend mit diesen vielen Zeichensätzen :-(.
Gruß
Michael
Re: MySQL, PHP und Umlaute
am 09.03.2006 03:21:05 von Michael Fesser
..oO(Michael Koch)
>So ich hab es rausgefunden. Ich muß einfach die einzelnen Strings, durch
>utf8_encode nach utf8 konvertieren, dann klappts.
Sollte eigentlich nicht notwendig sein.
>Ist schon arg verwirrend mit diesen vielen Zeichensätzen :-(.
Eigentlich nicht. Ich benutze hier konsequent UTF-8, von der Datenbank
über den Weg ins Skript bis hin zur Ausgabe:
o Die betreffenden Felder in der DB werden mit "CHARACTER SET utf8"
angelegt, damit die Daten korrekt gespeichert werden.
o Nach der Verbindung zur DB wird als erstes "SET NAMES 'utf8'"
gesendet, damit die Daten korrekt übertragen werden.
o PHP schickt per header() ein "Content-type: text/html; charset=UTF-8"
raus, damit die Daten korrekt ausgegeben werden.
Micha