PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Umlautfehler beim Einbuchen von Paidmails in die Datenbank



MrChicken
29.12.2012, 15:21
Hallo,

ich habe ein kleine Problem mit den Interfaces von STG oder mit meiner Datenbank, das wei ich nicht genau :rolleyes:

Wenn ich den Paidmail Cron laufen lasse bucht er die Paidmails nur falsch in die Datenbank ein (Tabelle vms_gebuchte_werbung).
Da steht im Beschreibungstext dann so 'n Schinken: für, müsst usw.

Wenn ich die Datenstze aus der Datenbank lsche, zeigt er mir beim lschen auch an: bla bla bla USING utf8

Ich verwende aber kein utf sondern den iso Zeichensatz bei den Dateien und latin1_swedish_ci als Kollation in der MySQL Datenbank. Sollten also beide mit den Umlauten klar kommen oder nicht?

Wieso werden die Datenstze dann nicht richtig abgespeichert?

Hoffe ihr knnt mir helfen. Die Forensuche spuckt nicht wirklich was zu meinem Problem aus.

Gru,
MrChicken

dude32
29.12.2012, 16:49
wie sieht denn die ausgabe aus???
genau so ein kauderwelsch???

MrChicken
29.12.2012, 16:53
Ja, das wird auch auf der Webseite so angezeigt.

Es muss wohl am Interface liegen. Wenn ich ber das Adminmen eine Paidmail einbuche mit ,, werden die korrekt in die DB geschrieben und auch korrekt angezeigt.

Dann versteh ich aber nicht wieso das Interface den Mailtext "bearbeitet"/falsch speichert...

dude32
29.12.2012, 16:54
schcik mir mal bitte den link zu deiner seite

MrChicken
29.12.2012, 16:58
Hast ne PN (und ich hab sie mal in meine Signatur geschrieben).

dude32
29.12.2012, 17:01
vieleicht hilft dir das hier weiter:


MySQL PHP Umlaute/Sonderzeichen fixen UTF-8/ISO

vom 2011/11/18
Jeder kennt das Problem, aus irgendeinem Grund wurden Wrter in der falschen Kodierung in die Datenbank geschrieben. Wenn das passiert ist, kann man daran erkennen, dass sich Zeichen wie diese untergemischt haben:
'¦, '¨, '?, '´, '¸, 'À, 'Á, 'Â, 'Ã, 'Ä, 'Å, 'Æ, 'Ç, 'È, 'É, 'Ê, 'Ë, 'Ì, 'Í, 'Î, 'Ï, 'Ñ, 'Ò, 'Ó, 'Ô, 'Õ, 'Ö, 'Ø, 'Ù, 'Ú, 'Û, 'Ü, 'Ý, 'Þ, 'ß, ' , 'á, 'â, 'ã, 'ä, 'å, 'æ, 'ç, 'è, 'é, 'ê, 'ë, 'ì, '*, 'î, 'ï, 'ð, 'ñ, 'ò, 'ó, 'ô, 'õ, 'ö, 'ø, 'ù, 'ú, 'û, 'ý, 'þ, 'ÿ Das Problem ist, dass diese Zeichen nicht utf8 kodiert worden sind, aber in utf8 abgespeichert worden sind, weil die DB Spalte so definiert worden ist (Kolation: utf8_general z.B:).
Um dies zu vermeiden, sollte also vorher die Funktion
$string = utf8_encode($string); angewendet werden.
Die Codierung von Strings kann berprft werden mit der Funktion mb_detect_encoding (vielen Dank an FranKee).
echo mb_detect_encoding($string); Eine einfache rekusive Funktion um ein mehrdimensionales Array nach UTF-8 zu kodieren ist (performanter wre noch mit Refernzen zu arbeiten):
function utf8encodeArray($array) { foreach($array as $key => $value) { if(is_array($value)) { $array[$key] = utf8encodeArray($value); } elseif(!mb_detect_encoding($value, 'UTF-8', true)) { $array[$key] = utf8_encode($value); } } } Eine weitere Fehlerquelle, ist die bertragung der Daten zur Datenbank, diese sollte immer beim ffnen der Datenbankverbindung auf UTF-8 gesetzt werden:
mysql_query("SET NAMES 'utf8'");
Wenn es bereits zu spt ist und die Daten in der DB gespeichert worden sind, kann man die falschen Umlaute wie folgt ersetzen:
private function getUmlauteArray()
{
return array(
'ü'=>'',
'ä'=>'',
'ö'=>'',
'Ö'=>'',
'ß'=>'',
' '=>'',
'á'=>'',
'â'=>'',
'ã'=>'',
'ù'=>'',
'ú'=>'',
'û'=>'',
'Ù'=>'',
'Ú'=>'',
'Û'=>'',
'Ü'=>'',
'ò'=>'',
'ó'=>'',
'ô'=>'',
'è'=>'',
'é'=>'',
'ê'=>'',
'ë'=>'',
'À'=>'',
'Á'=>'',
'Â'=>'',
'Ã'=>'',
'Ä'=>'',
'Å'=>'',
'Ç'=>'',
'È'=>'',
'É'=>'',
'Ê'=>'',
'Ë'=>'',
'Ì'=>'',
'Í'=>'',
'Î'=>'',
'Ï'=>'',
'Ñ'=>'',
'Ò'=>'',
'Ó'=>'',
'Ô'=>'',
'Õ'=>'',
'Ø'=>'',
'å'=>'',
'æ'=>'',
'ç'=>'',
'ì'=>'',
'*'=>'',
'î'=>'',
'ï'=>'',
'ð'=>'',
'ñ'=>'',
'õ'=>'',
'ø'=>'',
'ý'=>'',
'ÿ'=>'',
'€'=>''
);
und mit der Funktion ersetzen:
public function fixeUmlauteDb()
{
$umlaute = $this->getUmlauteArray();
foreach ($umlaute as $key => $value)
{
$sql = "UPDATE table SET tracks = REPLACE(row, '{$key}', '{$value}') WHERE row LIKE '%{$key}%'";
}
}
Achtung: Das Script funktioniert nur, wen die Codierung der PHP Datei UTF-8 ist (kann z.B. mit Notepad++ gecheckt/verndert werden: Hauptmen->Kodierung->UTF-8 ). ISO codierte Dateien funktionieren leider nicht, weil 30% der Umlaute als ? dargestellt werden. Das Script funktioniert also nur mit einer UTF8 codierten Projekt.


Quelle: http://www.sebastianviereck.de/mysql-php-umlaute-sonderzeichen-utf8-iso/

MrChicken
29.12.2012, 18:03
Hilft noch nicht ganz: Muss ich dann nicht die Codierung der Seite und die Kollation der MySQL Spalte berall ndern?


Und noch etwas was ich nicht ganz verstehe:
Beispiel:
Bei der IF Abfrage von Hand:

Die GNSTIGSTE ALL NET FLAT auf dem Markt. Nur 19,90 + Smart-Phone GRATIS!|Die GNSTIGSTE ALL ....

Fr Beschreibung|Mailtext werden Umlaute vom Sponsor also richtig gezeigt.

In die DB wird geschrieben:
Beschreibung:

Die GÜNSTIGSTE Wird also durch die Seitencodierung richtig umgeschrieben =

Mailtext:

Die G??NSTIGSTE ALL NET FL Wird natrlich nicht erkannt.

Also warum wird der Mailtext nicht richtig geschrieben? Kann es sein, weil das TYP longtext in der DB ist?

Masterphil
30.12.2012, 13:34
Ja, du musst deine Seite dann erst komplett auf UTF-8 Codieren, damit dannn die Ausgabe auch wieder stimmt.

Ist einiges an Arbeit aber somit bist du zukunftssicher.


Ich mache das mit dem PsPad, hatte mir JP empfohlen und geht recht einfach damit.

MfG