kostenloser Webspace werbefrei: lima-city


Problem mit Umlauten seit PHP 5

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    schmevin

    schmevin hat kostenlosen Webspace.

    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&uuml;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&oumlrter verwendet, darum wird er nicht ver&oumlffentlicht.
    			Wir bitten um ihr Verst&aumlndnis.');
    		}
    		
    		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("ä", "&auml;", $nachricht);
    			$nachricht = str_replace("Ä", "&Auml;", $nachricht);
    			$nachricht = str_replace("ö", "&ouml;", $nachricht);
    			$nachricht = str_replace("Ö", "&Ouml;", $nachricht);
    			$nachricht = str_replace("ü", "&uuml;", $nachricht);
    			$nachricht = str_replace("Ü", "&Uuml;", $nachricht);
    			$nachricht = str_replace("ß", "&szlig;", $nachricht);
    			$nachricht = str_replace("<", "<&nbsp;", $nachricht);
    			$nachricht = str_replace(">", ">&nbsp;", $nachricht);
    			$nachricht = str_replace("\r\n", "<br />", $nachricht);
    
    			$name = str_replace("ä", "&auml;", $name);
    			$name = str_replace("Ä", "&Auml;", $name);
    			$name = str_replace("ö", "&ouml;", $name);
    			$name = str_replace("Ö", "&Ouml;", $name);
    			$name = str_replace("ü", "&uuml;", $name);
    			$name = str_replace("Ü", "&uuml;", $name);
    			$name = str_replace("ß", "&szlig;", $name);
    			$name = str_replace("<", "<&nbsp;", $name);
    			$name = str_replace(">", ">&nbsp;", $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&uuml;r ihren Eintrag.</p>
    				<p>Sie werden in wenigen Sekunden weitergeleitet...</p>
    				<!--<div id ="link1"><p><a href="../gb.php"><-- zur&uuml;ck</a></p></div>-->
    				<?php
    			}
    			else
    			{
    				echo "Fehler im System. Konnte nicht gespeichert werden...";
    			}
    			
    			mysql_close($verbindung);
    		}
    	}
    	}
    	}
    ?>
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    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]
  4. Autor dieses Themas

    schmevin

    schmevin hat kostenlosen Webspace.

    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
  5. 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 ...

  6. Noch ein Tipp von mir: damit MySQL auch immer die richtige Zeichenkodierung verwendet:
    mysql_set_charset('utf8');
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!