gelöschter Benutzer

MySQL - eintragen von Daten geht schief...

am 25.06.2010, 14:40 Uhr eröffnete folgenden Thread
PHP & MySQL    5636 mal gelesen    34 Antwort(en).

Hallo ihr Lieben,
ich habe momentan ein Problem, dass ich einfach nicht gelöst kriege:

In vielen der neuen Nutzereinträge auf meiner Seite werden seit heute morgen Sonderzeichen fehlerhaft dargestellt (ä,ö,ü,ß etc.).
Allerdings sind die Fehler schon so in der Datenbank, sprich es läuft schon irgendetwas beim Eintragen schief. Ein Fehler seitens der Nutzer würde ich eher ausschließen, da selbst die Kategorien falsch eingetragen werden (aus "Gesundheit & Medizin" wird "Gesundheit & Medizin") und diese können durch den Nutzer nicht verändert werden.

Allerdings, und das finde ich seltsam, tritt dieser Fehler nur sporadisch auf (in 20% der Fälle ca.) und ich schaffe es auch nicht in selbst nachzubilden...
Weiss jemand Rat oder hatte schonmal ein ähnliches Problem?

Viele Grüße
Johnny


joerg
Avatar joerg
Fachinformatiker Anwendungsentwicklung
Content Gott (1941 Beiträge)
am 25.06.2010, 15:02 Uhr schrieb joerg

Hallo Johnny

Ein Beispiel wäre ganz nett um sich die Ausgabe mal anzuschauen.

Du könntest htmlentities auf die Ausgabe der entsprechenden Felder der Datenbank anwenden.

Nur das klärt nicht warum das Problem seit heute bei dir auftritt. Sind irgendwelche Skripts oder was anderes verändert worden?

Welche Kollation verwendet deine Datenbank?
Wie sehen die fehlerhaften Einträge in der Datenbank aus?
Unter welchem Format sind deine Skripts abgespeichert?

Gruß
Jörg


Zufällige Umleitung zu der Startseite einer meiner Domains
Meine ungewöhnlichen Tools


gelöschter Benutzer
am 25.06.2010, 15:29 Uhr schrieb

Hallo Jörg,
danke für deine schnelle Antwort,
htmlentities verwende ich bereits für die Ausgabe ...die fehlerhaften Einträge sehen in etwa so aus : ü , standartmäßiges Kodierungskauderwelsch also. Und was bereits falsch in die Datenbank hineinkommt, geht natürlich auch falsch wieder hinaus!
Skripts o.Ä. sind nicht verändert worden...die Kollation ist momentan : Latin1_swedish_ci (ISO 8859-1) für a) die Datenbank b) die Skripts...

Und gerade ist mir ein Eintrag aufgefallen der total aus der Reihe tanzt ...dort steht unter Kategorie nämlich: "reizeit, Buntes, Vermischtes" anstatt "Freizeit, Buntes, Vermischtes". Bislang wurden nur Sonderzeichen als Kauderwelsch dargestellt, aber hier verschwindet ja ein ganz normales Zeichen einfach so.

Haltet ihr es für möglich, dass die Datenbank überlastet ist oder bald abschmiert ?

Besorgte Grüße
Johnny


joerg
Avatar joerg
Fachinformatiker Anwendungsentwicklung
Content Gott (1941 Beiträge)
am 25.06.2010, 15:52 Uhr schrieb joerg

Hallo Johnny

So gut kenne ich mich mit MySql und den verschiedenen Kollationen nicht aus.

Das ü wird bei meinen Datenbanken nur zum Problem wenn das Skript nicht als UTF 8 abgespeichert ist.

notepad++ ist mir da halt eben eine wertvolle Hilfe.

Änderst du das Charset der Mysql Datenbank in deinen Skripts irgendwo?

Ich hoffe das danach einer der Experten hier dir dann eine bessere Antwort geben kann.

Gruß
Jörg


Zufällige Umleitung zu der Startseite einer meiner Domains
Meine ungewöhnlichen Tools


gelöschter Benutzer
am 25.06.2010, 16:07 Uhr schrieb

Hey Jörg,
das Charset der Mysql DB ändere ich in den Skripts eigentlich nicht!
Ich habe nun eine Log-Funktion geschrieben, die mir hoffentlich Aufschluss darüber gibt wann genau es knallt (und im Idealfall auch warum!).
Notepad++ verwende ich auch, mit Ansi2Uni 1.1 für Batch-Konvertierungen.

Vielen Dank für die bisherige Hilfe
Gruß
Johnny


Graccem
Entwickler
Neuling (7 Beiträge)
am 25.06.2010, 21:10 Uhr schrieb Graccem

Hallo Johnny,

eventuell hat dein Hoster den Standard-Zeichensatz für die MySQL-Verbindung geändert. Schicke deshalb, sobald dein Script eine Datenbank-Verbindung aufgebaut hat , folgende Befehl an die MySQL:

SET NAMES \'iso-8859-1\'

Damit könnten dann alle neuen Insert/Update eventuell wieder korrekt geschrieben werden. Die vorhandenen Daten ändert man damit nicht (sofern diese denn in der Datenbank fehlerhaft sein sollten). Das erklärt allerdings nicht, wieso ein "normaler" Buchstabe verloren gegangen ist.

HTH




gelöschter Benutzer
am 25.06.2010, 21:36 Uhr schrieb

Ja, daran hatte ich auch schon gedacht Florian... wäre es für diesen Fehler typisch, dass es bei identisch augebauten Einträgen bei manchen "knallt" und manche so arbeiten wie vorgesehen?

Ich habe eine Logfunktion geschrieben, die schon vor dem Datenbankeintrag die Einträge gesondert in eine .txt Datei schreibt ...Ergebnis: schon dort sind einige Einträge fehlerhaft ! Nun frage ich mich eben wie es sein kann, dass Einträge die aus einem <select> Feld gewählt werden müssen schon vor dem Datenbankeintrag Fehler aufweisen... da ist doch irgendwas faul - insbesondere weil ich es selbst nach 20 Testversuchen nicht geschafft habe diesen Fehler nachzustellen.

Meine Vermutung ist, dass irgendjemand extern per Skript Nachrichten seiner Kunden auf die Seite lädt - es ist auch ein merklicher Anstieg an Einträgen zu bemerken - und dabei eine falsche Kodierung gewählt hat (UTF-8?). Technisch denkbar wäre es ja ..
Da muss halt doch bald mal ein Captcha her ~~

Viele Grüße
Johnny

P.S.: Das Skript logt auch Datum + Uhrzeit und IP - heute Abend werden wohl keine Einträge mehr eingestellt, aber vielleicht erfahre ich morgen früh mehr...


Graccem
Entwickler
Neuling (7 Beiträge)
am 26.06.2010, 09:13 Uhr schrieb Graccem

Bei einer inkorrekten DB-Verbindung können Zeichen geschrotet werden. Dies habe ich bis aber nur festgestellt, wenn die Seite selber in UTF-8 war und die Verbindung nur ISO-8859-1 konnte. Dadurch wurde aus dem einen Zeichen mit 2 Byte zwei Zeichen mit 1 Byte.

Aber wenn das in den Logfiles schon fehlerhaft ist, dann spricht es für eine fehlerhafte externe Quelle. Aber bevor du ein Captcha einbaust, würde ich gucken, dass du dir ein Script schreibst, dass einfach den String anguckt und versucht den Zeichensatz zu ermitteln. Und wenn dieser nicht deiner Erwartung entspricht, wird eine Fehlermeldung ausgegeben. Aber alternativ machst du eine Konvertierung.




gelöschter Benutzer
am 26.06.2010, 10:54 Uhr schrieb

Hallo zusammen!

Ich hänge mich hier mal mit rein, weil das eventuell auch ein Problem von mir lösen könnte.

Auf der Seite, die Jörg im 2ten Post verlinkt hat, kann man ja (auch) einen Befehl - htmlspecialchars -finden, der die dort genannten Sonderzeichen in den entsprechen Code umwandelt.

Wie kann ich das jetzt in die MySql-Datenbank einsetzen.

Bei mir besteht nämlich das Problem, das der RSS-Feed wegen eben dieser Sonderzeichen nicht funktioniert.

Weiß dort jemand evtl. Abhilfe??

Gruß

Marcus



gelöschter Benutzer
am 26.06.2010, 12:00 Uhr schrieb

Hallo Marcus,
htmlspecialchars oder htmlentities wandeln dir Sonderzeichen in den entsprechenden HTML-Code um...so wird aus & -> & und aus ü -> ü.
Deine Datenbank sollte mit solchen Sonderzeichen gut klarkommen und deshalb verwendet man die Befehle eigentlich erst bei der Ausgabe...

Beispiel:
$sql_statement = "SELECT * FROM beispiel WHERE ID = 12";
$result = mysql_query($sql_statement);
$entry = mysql_fetch_array($result);
//Ausgabe
echo htmlentities($entry[tabellenspalte]);

Sollten aber schon die Einträge in deiner Datenbank (einfach im phpmyadmin nachschauen) Fehler aufweisen, wie bei mir, wird die ganze Geschichte etwas komplizierter.


Meine Log-Files haben im übrigen Aufschluss gegeben. Die fehlerhaften Einträge kommen alle aus einer externen Quelle. Scheinbar verdient jemand seine Kohle dadurch die Mitteilungen auf möglichst vielen Seiten zu verteilen und macht dies - eigentlich geschickt - per Skript.
Das blöde ist, dass er ganz offensichtlich eine fehlerhafte Zeichenkollation verwendet und mir damit zusätzliche Arbeit verursacht ._.
Ein kleiner Auszug aus dem Logfile (IP - Adresse blende ich aus...)

Gelesene Daten:
fputs($logfile, date("d.m.Y, H:i:s",time()) . ", " . $_SERVER[\'REMOTE_ADDR\'] . ", " . $_SERVER[\'REQUEST_METHOD\'] . ", " . $_SERVER[\'SCRIPT_NAME\'] .", ". $_SERVER[\'HTTP_USER_AGENT\'] . ", " . $_SERVER[\'HTTP_REFERER\'] ."\\n");

Normaler Eintrag:

26.06.2010, 00:47:38, IP-ADRESSE, POST, /pressemitteilungen/pressemitteilung_eintragen.php, Mozilla/5.0 (Windows; U; Windows NT 5.2; de; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4, www.portalderwirtschaft.de/pressemitteilungen/pressemitteilung_eintragen.php



Fehlerhafter Eintrag:
26.06.2010, 09:30:21, IP-ADRESSE, POST, /pressemitteilungen/pressemitteilung_eintragen.php, Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729) FirePHP/0.3,

Das ist noch nicht soo spektakulär, allerdings schickt Nr. 2 z.T. 20 Einträge nacheinander exakt im 4 Sekunden Takt. Das kann nun wirklich kein Mensch (auch nicht mit Copy-Paste) leisten.
Vor allen Dingen da es sich um vollkommen unterschiedliche Einträge handelt, in der unterschiedliche Ansprechpartner und unterschiedliche Einsteller genannt werden ...

Wie gesagt, ein Captcha wird wohl die Lösung sein - auch wenn dann weniger Content kommt!
Viele Grüße
Johnny


romacron
JDev Xer
Content Gott (1224 Beiträge)
am 26.06.2010, 12:14 Uhr schrieb romacron

Das klingt ja fast wie eine Einladung zum Wochenende

Die Captcha löst das Problem falscher Einträge nicht. Das wäre ein Fataler Fehler davon auszugehen.

Die Daten müssen validiert werden, bevor die in die Datenbank geschrieben werden.

Die aussperren, die nicht ins formular klicken.
.js
var click_detected=false;

ein kleiner Ansatz <form onclick="set_mouse_click_detected();" >

<button onclick="check_user_clicked_the_form();">
Damit hat man schon mal 50% weniger mist





« zurück zu: PHP & MySQL

Das Seitenreport Forum hat aktuell 5275 Themen und 36110 Beiträge.
Insgesamt sind 48360 Mitglieder registriert.