PHP Umlaute und MySQL (wieder einmal)

  • Ersteller Ersteller + BELA B. +
  • Erstellt am Erstellt am
B

+ BELA B. +

Gast
Hallo Liebe Gemeinde,

Ich habe ein eigenartiges Problem, und bitte euch um eure Hilfe.

Und zwar, ich habe eine PHP / HTML Seite programmiert, mit MySQL anbindung.

Folgendes:

Ich habe ein Formular auf der Website, welches Umlaute in die DAtenbank speichert, und auch wieder richtig ausgibt.
Das Problem ist nur, ich schreibe in mein Fomular ein Ö zum Beispiel, und in der Datenbank wird aber ein komisches Zeichen ala ö gespeichert. Ausgegeben wird der Umlaut witzigerweise richtig auf der Website.
Es geht mir nur darum, den Umlaut korrekt in das Feld der MySQL Tabelle zu speichern. Und ich weiß leider nicht wie?

META ist auf UTF-8 gestellt auf der website. die einzelnen Felder in den Tabellen auf UTF 8 um zu stellen zeigte keinen erfolg.

Habt ihr ideen?

bitte um Hilfe.

lg
 
Generell möchte ich dir empfehlen alle Umlaute und Sonderzeichen vor dem ablegen in Unicode zu wandeln.

PHP Funktion substr_replace bzw. str_replace anschauen.

SQL Injection und Co KG lassen grüßen.
 
Stell die ganze DB auf UTF-8 um. Alles andere ergibt heute kein Sinn mehr.
 
Die COLLATION der Datenbank bzw. Tabelle bzw. des Feldes muss passend zum Input eingestellt werden (in deinem Fall utf8_general_ci).

Außerdem sollte die Zeichenkodierung der Verbindung ebenfalls auf utf8 gestellt werden.

MySQL :: MySQL 5.6 Reference Manual :: 10.1.4 Connection Character Sets and Collations

Darf man fragen, über welche PHP-API du mit MySQL kommunizierst? Da gibt es nämlich auch noch einiges zu beachten.


frainer schrieb:
Es handelt sich um ein Model-Problem, kein View-Problem.
 
Code:
function convert( $input ) {

  if( !mb_check_encoding( $content, 'UTF-8') || 
  !( $input === mb_convert_encoding( mb_convert_encoding( $input, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32' ) ) ){

    $input = mb_convert_encoding( $input, 'UTF-8' );

  }

  return $input;

}

Kann in einigen Fällen nützlich sein.
 
Hi Leute, danke für eure Antworten.
Werde mich Morgen (Heute) nochmal melden. Werde auch gleich eure Tipps befolgen :-)
 
@ omaliesschen: Diese ganzen mb_* Funktionen kannst du bei dem ganzen Kauderwelch über Board werfen. mb_convert_encoding an der Stelle macht es nur noch schlimmer, auch mit einem $from_encoding von ASCII, ISO-8859-1, ISO-8859-15.
Code:
var_dump( mb_convert_encoding( 'ö', 'UTF-8' ) ); = string(8) "ö"

@ TE: Ich hab dafür mal ne kleine Funktion geschrieben, die mir allen aufgetretenen Encodingmüll richtig umgesetzt hat. Vieles sollte drin sein, aber natürlich nicht alles. Am besten ein Mal über die DB jagen und gut ist. Vorher aber alles auf utf-8 umstellen, damit das nicht mehr passiert.
 

Anhänge

Hallo nochmal.
Die Datenbank habe ich mal umgestellt auf UTF-8. Das ist leider erfolglos.
Ich habe mal per Formular Ö Ä Ü ä ö in ein Feld speichern versucht. Im phpMyAdmin bzw. in dem Feld der Tabelle ist folgendes angekommen:
Ö Ä Ü ä à ! Die Website ist per META auf UTF-8 gestellt, und im PHP Script ist zusätzlich der Header ebenso auf UTF-8 gestellt.

Ich weiß nicht wirklich, was ich machen soll, oder habe ich etwas überlesen?

lg
 
Yuuri schrieb:
@ omaliesschen: Diese ganzen mb_* Funktionen kannst du bei dem ganzen Kauderwelch über Board werfen. mb_convert_encoding an der Stelle macht es nur noch schlimmer, auch mit einem $from_encoding von ASCII, ISO-8859-1, ISO-8859-15.
Code:
var_dump( mb_convert_encoding( 'ö', 'UTF-8' ) ); = string(8) "ö"

@ TE: Ich hab dafür mal ne kleine Funktion geschrieben, die mir allen aufgetretenen Encodingmüll richtig umgesetzt hat. Vieles sollte drin sein, aber natürlich nicht alles. Am besten ein Mal über die DB jagen und gut ist. Vorher aber alles auf utf-8 umstellen, damit das nicht mehr passiert.

Ich nutz die Funktion in Kombination mit html_entities(,utf-8) und ich meine bisher kein Zeichen gefunden zu haben das zu Fehlern führt. Ohne die Funktion kann in einigen Fällen schon ein simples   von der NULL verschluckt werden.

Ich hab so ziemlich alle Zeichen gestestet die man im Netz findet. Die Funktion alleine reicht nicht aus. Stimm ich dir zu. Deswegen schrieb ich ja dass es in einigen Fällen nützlich sein kann.

PS: Wenn Du die obige Funktion nutzt bekommst Du das richtige Ergebnis:
Code:
var_dump( convert( 'ö', 'UTF-8' ) );
string(4) "ö"

http://www.utoronto.ca/web/HTMLdocs/NewHTML/iso_table.html
http://www.webmonkey.com/2010/02/special_characters/
http://webdesign.about.com/od/localization/l/blhtmlcodes-gr.htm

Hier gibts ein paar Fragezeichen. Aber immerhin kein Kauderwelch:
http://webdesign.about.com/od/localization/l/blhtmlcodes-ro.htm
http://webdesign.about.com/od/localization/l/blhtmlcodes-hi.htm

Character Set CNS 11643 und ähnliche sind auch nicht willkommen. Solange es nichts zerbricht kann man damit Leben.

Tragisch ist es wenn ein Zeichen die komplette Ausgabe nullt.



全字庫新增行動裝置網頁
全字庫軟體包新增Big-5E字集
中文全字庫抄錄申請書及授權條款版本更新
全字庫服務因行政院組織改造,已於101年2月6日由行政院研究發展考核委員會辦理。
新增國際ISO CJK Ext-C及D屬其他國家漢字共2,538字

Erwischt:
укгезәөшөхзәхөшк2049һһлдябчсячмииюсит.июбҗрарэ'
.'лдэфвәәуүйәуйүәу034928348539857әшаыдларорашһһрлоавы

PS: Die UTF-8 Tools von phpbb sind sehr umfangreich. Zig tausend Zeilen..
 
Zuletzt bearbeitet:
omaliesschen schrieb:
Wenn Du die obige Funktion nutzt bekommst Du das richtige Ergebnis:
Code:
var_dump( convert( 'ö', 'UTF-8' ) );
string(4) "ö"
Genau das ist ja das falsche Zeichen. ;) Dort sollte höchstwahrscheinlich ein ö heraus kommen und kein so komisches Etwas.
 
Man muss GAR NICHTS konvertieren, wenn die Daten eben erst einmal sauber sind. Dann stellt man nur überall beim Verbindungsaufbau sicher, dass alles korrekt auf UTF-8 steht und gut is.

Übrigens würde ich so oder so nicht mit so einer Inline-Konvertierung arbeiten. Viel sauberer ist, einfach eine Dummy-Datenbank zusätzlich anzulegen. Jetzt stellt man in einem Script 2 Verbindungen parallel her: eine ohne sauberes UTF-8 auf die unsaubere DB und eine mit korrektem SET NAMES & Co.
Jetzt einfach Tabelle für Tabelle, Zeile für Zeile aus DB 1 auslesen, und die Werte in DB 2 schreiben. Am Ende enthält DB 2 genau das, was in DB 1 war, nur ohne jeglichen Zeichensalat.

Solange man keine Foreign Keys verwendet sind die nötigen Abfragen wirklich trivial. Mit Foreign Keys wirds etwas spannender.
 
Yuuri schrieb:
@ omaliesschen: Diese ganzen mb_* Funktionen kannst du bei dem ganzen Kauderwelch über Board werfen

Ist dem wirklich so oder beziehst du dich damit explizit nur auf die mb-Konvertierungsfunktionen?

Ich benutze nur selten PHP und bitte dementsprechend um Berichtigung, aber als ich mich das letzte mal auseinandergesetzt hatte, fand ich es als schon deutlich spürbar, dass die PHP so gar nicht für Unicode konzipiert wurde. Liege ich falsch, oder ist die Multibytestring-Erweiterung pflicht?

PHP:
// Doc: utf8 w/o BOM, PHP 5.4.16
<?php
	$str = "ÄÜÖäüö";
	echo(strlen($str))." ";
	echo(mb_strlen($str, 'UTF-8'));
	// 12 6
?>
 
Zuletzt bearbeitet:
Ja man braucht die mbstring-Bibliothek. Man kann auch die in PHP fest integrierte iconv-Bibliothek verwenden, die kann aber weniger.
 
Zurück
Oben