Problem mit Umlauten seit PHP 5
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
code
dank
datenbank
datum
eintrag
eintragen
ergebnis
fehler
http
links maximal echo
nachricht
string
system
text
umlaut
url
verbindung
vorliegender string
zeichensatz
-
Hallo Leute,
Ich habe folgendes Problem mir meinem Gästebuch: Wenn Umlaute im Text vorkommen, wird der gesamte Text einfach überhaupt nicht mehr angezeigt.... so als ob man nichts hineingeschrieben hätte. Da es vorher immer ging, vermute ich dass es mit dem Update von Lima City auf die neueste PHP Version zu tun hat, nun werden Texte mit Umlauten anscheinend gar nicht erst in die Datenbank eingetragen. Hier ist der Code, hoffe ihr könnt mir weiterhelfen:
<?php include 'sam.php'; if(isset($_POST["send_button"])) { if(!empty($_POST["website"])) { header("refresh:0; url = index.html"); } if(isset($_POST["name"])) { if(isset($_POST["nachricht"])) { $name = htmlspecialchars($_POST["name"]); $nachricht = htmlspecialchars($_POST["nachricht"]); $links = substr_count($nachricht, 'http://'); $maximal = 1; if ($links > $maximal) { echo ('Es ist nur ein Link pro Beitrag erlaubt.'); } elseif($name == "" or $nachricht == "") { echo "Sie haben ihren Namen und/oder ihren Kommentar nicht ausgefüllt..."; } $badwords = array("viagra", "porn", "href", "</a>"); foreach($badwords as $word) { if(eregi($word, $nachricht)) { $error = TRUE; } } if($error) { echo('In ihrem Beitrag wurden nicht erlaubte Wörter verwendet, darum wird er nicht veröffentlicht. Wir bitten um ihr Verständnis.'); } else { $verbindung = mysql_connect($url, $user, $passwd) or die ("Fehler im System!"); mysql_select_db($db) or die ("Verbindung zur Datenbank war nicht möglich..."); $id = 0; $abfrage = "SELECT id FROM $table ORDER BY id DESC LIMIT 1"; $ergebnis = mysql_query($abfrage) or die ("Error: $abfrage <br>".mysql_error()); while($row = mysql_fetch_object($ergebnis)) { $id = $row->id; } $id++; $timestamp = time(); $datum = date("d.m.Y \u\m H:i", $timestamp); $nachricht = str_replace("ä", "ä", $nachricht); $nachricht = str_replace("Ä", "Ä", $nachricht); $nachricht = str_replace("ö", "ö", $nachricht); $nachricht = str_replace("Ö", "Ö", $nachricht); $nachricht = str_replace("ü", "ü", $nachricht); $nachricht = str_replace("Ü", "Ü", $nachricht); $nachricht = str_replace("ß", "ß", $nachricht); $nachricht = str_replace("<", "< ", $nachricht); $nachricht = str_replace(">", "> ", $nachricht); $nachricht = str_replace("\r\n", "<br />", $nachricht); $name = str_replace("ä", "ä", $name); $name = str_replace("Ä", "Ä", $name); $name = str_replace("ö", "ö", $name); $name = str_replace("Ö", "Ö", $name); $name = str_replace("ü", "ü", $name); $name = str_replace("Ü", "ü", $name); $name = str_replace("ß", "ß", $name); $name = str_replace("<", "< ", $name); $name = str_replace(">", "> ", $name); $eintrag = "INSERT INTO $table (id, name, nachricht, datum) VALUES ('$id', '$name', '$nachricht', '$datum')"; $eintragen = mysql_query($eintrag); if($eintragen = true) { ?> <p>Vielen Dank für ihren Eintrag.</p> <p>Sie werden in wenigen Sekunden weitergeleitet...</p> <!--<div id ="link1"><p><a href="../gb.php"><-- zurück</a></p></div>--> <?php } else { echo "Fehler im System. Konnte nicht gespeichert werden..."; } mysql_close($verbindung); } } } } ?>
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Sehr wahrscheinlich liegt das daran, dass sich der Standardwert für den Zeichensatz geändert hat:
http://php.net/manual/de/function.htmlspecialchars.php
Changelog
Version Beschreibung
5.4.0 Der Standardwert für encoding wurde zu UTF-8 geändert.
5.4.0 Die Konstanten ENT_SUBSTITUTE, ENT_DISALLOWED, ENT_HTML401, ENT_XML1, ENT_XHTML und ENT_HTML5 wurden hinzugefügt./quote] -
Danke, hab's auch gerade entdeckt, es lag demnach an der Funktion htmlspecialchars.
Vorher war ja ISO-8859-1 bei PHP der Standard-Zeichensatz, seit PHP 5.4 ist es aber wie du sagst UTF 8.
... jetzt scheint die neue Schreibweise so auszusehen;
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )
Danke für die Hilfe!
Beitrag zuletzt geändert: 28.7.2013 23:10:12 von schmevin -
Hallo
um zu verhindern, dass ein bereits als UTF-8 vorliegender String nochmal (doppelt) encoded wird,
kann man folgende Funktion nutzen:
function str_encode_utf8($str) { if (mb_detect_encoding($str, 'UTF-8', true) === false) { $str = utf8_encode($str); } return $str; }
damit wird String nur zu UTF-8 umgewandelt, wenn es noch kein UTF-8 String ist.
also anstatt$nachricht = utf8_encode($nachricht);
evtl. besser$nachricht = str_encode_utf8($nachricht);
und nochwas ... damit Du in MySQL "sicher" speicherst,
am besten immer mysql_real_escape_string() beutzen
also so$nachricht = mysql_real_escape_string($nachricht);
... nach Öffnen der Datenbank-Verbindung und vor Schreiben in die DB-Tabelle
ich weiss jetzt nicht, ob in mysql_real_escape_string()
auch gleich der Zeichensatz (UTF-8) mit erledigt wird,
aber es hilft auf jeden Fall schonmal gegen SQL-injection-Hacks ...
-
Noch ein Tipp von mir: damit MySQL auch immer die richtige Zeichenkodierung verwendet:
mysql_set_charset('utf8');
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage