bierkistenschlepper
Goto Top

Text in Datenbanken

Hallo,

ich möchte in meiner MySQL Datenbank einen (längeren) Text speichern. Es handelt sich dabei um Gästebucheinträge und die Beschreibungen für Events. Ich habe dazu den Typ TEXT verwendet. Problem ist jetzt:

Umlaute
auf der Webseite erscheint z.B. das ö durch eine schwarze Raute ersetzt. Da man hier sehr viel rumprobieren kann ohne ein Ergebnis zu erhalten, frage ich mal lieber die Profis face-smile Der Text wurde jetzt erstmal direkt in die DB eingegeben und die DB ist UTF8 kodiert.

Zeilenumbrüche
Der Text wird in der Datenbank zwar mit Umbrüchen gespeichert, durch PHP aber offenbar ohne Umbrüche ausgegeben. Wie erreiche ich, dass die Umbrüche da bleiben ? Oder muss ich das händisch machen, indem ich nach einem \n im String suche und dann durt ein </p><p> einfüge?

Content-Key: 116928

Url: https://administrator.de/contentid/116928

Printed on: April 25, 2024 at 01:04 o'clock

Member: godlie
godlie May 27, 2009 at 10:50:26 (UTC)
Goto Top
Hallo,

Also du hast im groben 2 Probleme:

1. Umlaute:
hier heist die Lösung wahl des richtigen Charsets. Wahrscheinlich wird deine Webseite in Latin-9 ausgegeben. Probiers mal mit UTF-8 als Charset bei der Website.
Eventuell hast du ein Problem mit der Datenbankanbindung, such hierzu mal nach php+mysql+umlaute da gibs massig Ergebnisse.

2. Zeilenumbrüche
Jag den gesamten text mal durch ein
$text = nl2br($text);
Member: Bierkistenschlepper
Bierkistenschlepper May 27, 2009 at 11:05:26 (UTC)
Goto Top
DAs erste Problem habe ich gerade mit htmlentities gelöst.

Ich weiß allerdings nicht, ob das die normale Lösung ist, denn es erscheint mir doch etwas umständlich, bei jedem Textfeld diese Funktion aufzurufen...

Die Spalten der Tabelle haben die Kollation utf8_general_ci (vorher hatten die irgendwas mit Latin...)
Wenn ich oben in meine PHP-Datei ein <?xml version="1.0" encoding="UTF-8" ?> einfüge, dann kommt
Parse error: parse error in C:\xampp\htdocs\stammtisch\termine.php on line 1

Das 2. hat natürlich einwandfrei geklappt face-smile
Member: godlie
godlie May 27, 2009 at 11:12:07 (UTC)
Goto Top
Naja wie wärs wenn du beim speichern in die DB ein html_entity_decode(). verwendest?
Member: Bierkistenschlepper
Bierkistenschlepper May 27, 2009 at 11:17:39 (UTC)
Goto Top
Ok, das könnte ich noch probieren. Der obige Text war ja direkt in die DB geschrieben...
Member: dog
dog May 27, 2009 at 21:00:54 (UTC)
Goto Top
Aaaaaalso...

Du beachtest den Zeichensatz zu wenig.
Dieser muss komplett durchgängig sein von PHP zur DB und Zurück.

D.h.
PHP Seiten in UTF-8 ausgeben:
header("Content-type: text/hmtl;Charset=UTF-8");  

Formulare in UTF-8 anfragen:
<form [...] accept-charset="utf-8">  

Die DB-Verbindung in UTF-8 benutzen:
mysql_query('SET NAMES `utf8`');  

Und Anstatt htmlentities() htmlspechialchars() verwenden, mehr macht bei UTF-8 keinen Sinn.

Die Spalten der Tabelle haben die Kollation utf8_general_ci (vorher hatten die irgendwas mit Latin...)
Wenn ich oben in meine PHP-Datei ein <?xml version="1.0" encoding="UTF-8" ?> einfüge, dann kommt
Parse error: parse error in C:\xampp\htdocs\stammtisch\termine.php on line 1

A) Schreibst du HTML oder XHTML? Bei Ersteren hätte ein <?xml nichts zu suchen...
b) Die Fehlermeldung ist ein Hinweis darauf, dass in deiner PHP-Installation unnötigerweise short_open_tags aktiv sind - Am Besten ganz schnell deaktivieren

Ich weiß allerdings nicht, ob das die normale Lösung ist, denn es erscheint mir doch etwas umständlich, bei jedem Textfeld diese Funktion aufzurufen...

Du brauchst unbedingt entweder bei der Ein- oder Ausgabe htmlspechialchars(), ansonsten hast du eine prima XSS-Lücke gebastelt: http://de.wikipedia.org/wiki/Cross-Site_Scripting

Grüße

Max
Member: Bierkistenschlepper
Bierkistenschlepper May 28, 2009 at 05:51:52 (UTC)
Goto Top
Vielen Dank für die ausführliche Erklärung

Ich programmiere in XHTML. Deswegen kann ich mir die Fehlermeldung nicht ganz erklären. Aber UTF-8 wird ja ohnehin als Standard angenommen, wenn die Angabe fehlt.

Wie ich bei der PHP Installation auf dem Server irgendwas einstellen soll weiß ich nicht. Da muss vermutlich der Kundendienst ran.
Member: Bierkistenschlepper
Bierkistenschlepper May 29, 2009 at 08:51:59 (UTC)
Goto Top
Ich dachte bisher ich muss bei der Eingabe html_entity_decode machen. Was ist denn nun richtig?
Member: dog
dog May 29, 2009 at 12:18:07 (UTC)
Goto Top
Die html_entity-Funktionen haben einen Sinn: HTML-Steuerzeichen umwandeln.

Bei der Eingabe ein decode zu benutzen macht keinen Sinn, weil ein User ja allerhöchstens Steuerzeichen wie "<" direkt eingeben wird, aber nicht "&lt;" - in der Hoffnung, dass daraus ein "<" wird.

Umgekehrt hingegen ist ein encode bei der Ausgabe ein absolutes Muss.
Sonst könnte ein Benutzer in ein Formularfeld z.B. einfach "<script>alert("Hallo");</alert>" eingeben und das für so in die Seite eingefügt und auch vom Browser ausgeführt.

Nur html_entities_encode() oder htmlspechialchars() umgehen dieser Problem, indem sie Steuerzeichen wie "<" in andere Steuerzeichen umwandeln, die allerdings einfach in der Anzeige und ich der Verarbeitung enden.

Grüße

Max
Member: Bierkistenschlepper
Bierkistenschlepper Jun 07, 2009 at 12:39:53 (UTC)
Goto Top
Ich hätte nochmal ne kleine Frage: Ich will en Gästebuch machen und sehe mich vor das Problem gestellt, dass beim Reload der Seite immer wieder ein neuer Eintrag angelegt wird. Wir verhindere ich das denn am besten?

Textfeld auf Unique setzen geht nicht. Timestamp ebenfalls nicht, da der ja automatisch neuberechnet wird.

Das einzige was mir einfällt wäre: Alle Einträge abrufen und gucken ob der Eintrag schon dabei ist. Besonders effizient dürfte das allerdings nicht sein.
Member: dog
dog Jun 07, 2009 at 14:25:35 (UTC)
Goto Top
Normalerweise baut man Formulare so auf:

<?php
	if(isset($_POST['submit']) {  
		
		header("Location: gaestebuch.php");  
	}
?>

<form action="" method="post">  
	<input type="submit" name="submit" value="Hinzufügen" />  
</form>

Und da sollte es dann auch keine Probleme mit Reloads geben.
Member: Bierkistenschlepper
Bierkistenschlepper Jun 07, 2009 at 15:17:18 (UTC)
Goto Top
Was genau macht denn dabei die Funktion header? Was dazu bei php.net steht ist mir leider mehr als unklar. Ich nutzt nämlich sehr viel include und dabei gab es nie irgendwelche Probleme... Ich nehme an der Befehl sorgt hier nur dafür, dass eine HTTP-Sitzung aufgebaut wird? Und Gästebuch.php ist bei dir dann die Datei, welche die Eingaben auch verarbeitet?
Ich habe bis jetzt nur die folgende Abfrage

if ('POST' == $_SERVER['REQUEST_METHOD']) {
if (!isset($_POST['autor'], $_POST['inhalt'], $_POST['antwort'], $_POST['stadt'], $_POST['formaction'])){
die ('Benutze nur Formulare von der Homepage.');
}
if (('' == $autor = trim($_POST['autor'])) or
('' == $inhalt = trim($_POST['inhalt'])) or
('' == $antwort = trim($_POST['antwort']))) {
die ('Bitte fülle das Formular vollständig aus.');
}

Wobei formaction der Name des Submitbuttons ist.
Member: dog
dog Jun 08, 2009 at 16:36:33 (UTC)
Goto Top
Was genau macht denn dabei die Funktion header?

Mach dich doch erstmal mit dem HTTP-Protokoll vertraut.
http://de.wikipedia.org/wiki/HTTP
http://bolege.de/http-header/#art3_location

Die header()-Funktion löst nur ein spezifisches Problem:
dass beim Reload der Seite immer wieder ein neuer Eintrag angelegt wird

Den Code den du gepostet hast müsste in mein Beispiel in Zeile 3 eingefügt werden.

Grüße

Max
Member: Bierkistenschlepper
Bierkistenschlepper Jun 09, 2009 at 20:19:44 (UTC)
Goto Top
Hallo, und nochmals ein Problem

Ich kann problemlos "äüöß" in mein Forumlar schreiben. Alles wird richtig ausgegeben.

Ein Freund kann das nicht, bei ihm steht statt "äüöß" dann da "??". Es werden also nicht nur Zeichen falsch kodiert, sondern auch gelöscht. Hat jemand ne Ahnung woran das liegt?

Er verwendet Firefox und XP und ich Opera und Vista.. Ich verwende utf8_decode.
Member: dog
dog Jun 10, 2009 at 00:40:02 (UTC)
Goto Top
Lies dir doch bitte mal den Artikel genau durch:

http://www.joelonsoftware.com/articles/Unicode.html

Danach machen wir dann hier weiter face-smile

Grüße

Max
Member: Bierkistenschlepper
Bierkistenschlepper Jul 27, 2009 at 07:54:15 (UTC)
Goto Top
So, mein Problem scheint sich nicht so einfach zu lösen.

es geht um folgende Seite: www.shstammtisch.de

Wenn ich äüöß in das GB schreibe klappt alles. Bei den anderen wird immer ein ? darauf. Woran liegt das wieder? das Formular akzeptiert nun UTF-8; In der DB steht das ? auch schon

Vor dem einfügen werden folgende Sachen gemacht:
$inhalt = utf8_decode(trim($_POST['inhalt'])
$badwords=array('sex', 'arsch', 'drop', 'delete', 'function');
$inhalt = str_ireplace($badwords, '*', $inhalt);

Wieso geht es bei mir und bei anderen nicht?

Ich nutze den Opera, und wenn ich den IE nutze gibt es bei mir auch in den Feldern Inhalt und Autor die Fragezeichen, im FEld Wohnort aber seltsamerweise nicht???


Edit: Offenbar war die Funktion utf8_decode() zusammen mit trim() schuld. Warum, das kann ich nicht ganz nachvollziehen.
Member: Bierkistenschlepper
Bierkistenschlepper Jul 27, 2009 at 11:55:51 (UTC)
Goto Top
Der Firefox macht jetzt noch seltsamere Sachen.
äüößäüöÃ
kommt raus, wenn man äüöß eingibt.

Kann mir bitte mal jemand sagen woran das liegt? Der Fehler tritt erst dann auf, wenn ich in der DB gespeichert habe. Das Feld in der DB ist aber ebenfalls utf8_general_ci

Im IE und Opera funktioniert es jetzt problemlos.

Es kann doch eigentlich nicht sein, dass das so schwierig ist in allen Browsern ein gleiches Verhalten zu erreichen.

WAs mir noch aufgefallen ist: Gebe ich das an
<?xml version="1.0" encoding="UTF-8"?>
Wird die Seite überhaupt nicht mehr angezeigt.

Ich glaube das Problem ist folgende Zeile
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

der Opera zeigt nur mit ihr alles richtig an, der Firefox scheint sie nicht zu mögen und ignoriert sie