Umlaute und Sonderzeichen in Datenbank schreiben und abrufen

Dj Malcolm

Grünschnabel
Hallo,
ich bastel momentan an einem Script über welches ich Bands und dazugehörige Wikipedia Artikel in eine Datenbank schreiben möchte.
Generell alles kein großes Problem, nur die Sonderzeichen machen mir ein Problem.
PHP:
$name = htmlspecialchars($_POST['name'], ENT_QUOTES);

Ich wandel sowohl die Eingaben für die Wikipedia Links, als auch den Interpretennamen mit htmlspecialchars um. Wie gesagt klappt alles soweit gut. Auch Umlaute sind kein Problem bisher.
Nun mein Problem tauchte dann beim Interpreten Gigi D’Agostino auf. Wie kann ich ein Apostroph so in die Datenbank schreiben, dass ich auch später noch damit arbeiten kann?
Konkret gebe ich die Variable $name per get an die nächste Seite um sie dort weiter zu verarbeiten.
PHP:
"SELECT interpretid FROM interpreten WHERE interpret = '$name'"
Dummerweise bekomme ich mit dieser Abfrage kein Ergebnis sobald ein Apostroph im Namen der Band war.

Hoffe es kann mir einer helfen, falls nötig kann ich auch noch meine Quelltexte posten aber das wäre gerade relativ viel.

Liebe Grüße
Dj Malcolm
 
Hi und Willkommen bei tutorials.de,

So?
PHP:
"SELECT interpretid FROM interpreten WHERE interpret = '" . 
mysql_real_escape_string($name) . "'"

Das sollte man aus Sicherheitsgründen sowieso machen.
$_GET, $_POST usw. können vom Benutzer beeinflusst werden.
Mit gezielten Eingaben kann man das Ergebnis der Abfrage ändern
und so Sachen aus der DB bekommen, die einen eigentlich nichts angehen.
 
Danke für die Antwort. Leider besteht das Problem immer noch. Kann es sein, dass es was mit der Übergabe der Variable per $_GET zu tun hat, dass das nicht funktioniert? Ich habe grad mal geschaut in der Datenbank wird eingetragen : Gigi D'Agostino während im Link Gigi%20D'Agostino übergeben wird.
Ich würde jetzt mit str_replace() arbeiten, nur bleibt für mich da die Frage, ob ein Apostroph das einzige Zeichen ist, bei dem es da Probleme gäbe? Bzw gibts da eine schönere Möglichkeit das zu lösen?
 
Das %20 im Link steht für ein Leerzeichen, weil in Internetadressen
eigentlich keine Leerzeichen erlaubt sind. In der DB ist das ja in Ordnung.

Und das &#... (ich schreibs aus forumstechnischen Gründen nicht aus) kommt von htmlspecialchars.
Wenn du den Wert aus der DB abfragst und Richtung Browser ausgibst
wird &#... wieder in das ursprüngliche Zeichen umgewandelt.
Falls du es trotzdem nicht willst, lass es eben weg: Einfach
PHP:
$name = $_POST['name'];
statt
PHP:
$name = htmlspecialchars($_POST['name'], ENT_QUOTES);

PS: str_replace wäre sehr, sehr viel mehr Aufwand.
Es gibt so viele "Sonder"-zeichen...
 
Ohne htmlspecialchars bekomme ich schon beim versuch einen Interpreten mit Apostroph einzutragen einen Error in der sql Syntax.also mittels str_replace würde es funktionieren gerade getestet. Allerdings fürchte ich, dass ich da irgendwann wie du schon sagtest auf andere Sonderzeichen treffe die dasselbe Problem verursachen.

PHP:
$name = $_GET['name'];
$name = str_replace("'", "'", $name);

Hab das jetzt gelöst indem ich $name über eine Session weitergegeben habe, das scheint das Problem gelöst zu haben. Ich werde nun mal fleissig weiter eintragen und schauen ob ich das Problem mit anderen Sonderzeichen nochmal finde.

Vielen Dank für deine Hilfe, hat mir ganz neue Denkansätze gegeben :)
 
So gerade nochmal getestet mit mysql_real_escape_string habe ich wieder das Problem, auf der folgeseite, dass ich die Variable nicht weiter verarbeitet bekomme ich versuch das nun noch einmal nach zu bauen irgendwo hab ich da nen Fehler drin glaub ich
 
Ok hier mal der komplette funktionierende Code wie ich ihn habe, nun frag ich einfach mal, was ich aus Sicherheitsaspekten ändern sollte?
interpreten_eintragen.php
PHP:
<?PHP
session_start();
include 'mysqlconnect.inc.php';

$summe = htmlspecialchars($_POST['summe'], ENT_QUOTES);
$ergebnis =htmlspecialchars($_POST['ergebnis'], ENT_QUOTES);
$name = htmlspecialchars($_POST['name'], ENT_QUOTES);
$wikipedia = htmlspecialchars($_POST['wikipedia'], ENT_QUOTES);
$_SESSION['name'] = $name;
if (empty($name)) {

exit ("Bitte eine Band eingeben");
}
elseif (empty($wikipedia)) {

exit("Bitte nur Bands mit Wikipedia Seiten eintragen.");
}
else
{
if	($summe==$ergebnis)
{

		$eintrag = "INSERT INTO interpreten (interpret,wikipedialink)
		VALUES ('$name', '$wikipedia')";
		if ($eintragen = mysql_query($eintrag)OR die(mysql_error()))
		{
		echo "$name wurde in die Datenbank eingetragen<br>";

		echo "<a href='genreauswahl.php'>Genre für $name eingeben</a>";
		}
		else
		{
		echo "$name konnte nicht korrekt in die Datenbank eingetragen werden.";
		}
}



else
{
echo 'Dein Ergebnis is leider Falsch.<br>Versuche es noch einmal!';
}
}

?>

genreauswahl.php
PHP:
<?php
session_start();
include 'mysqlconnect.inc.php';
$name = $_SESSION['name'];
echo $_SESSION['name'];
$sql1 = mysql_query("SELECT interpretid FROM interpreten WHERE interpret = '" . mysql_real_escape_string($name) . "'");
while ($ds = mysql_fetch_object($sql1)){
    echo 'Bitte w&auml;hlen sie ein oder mehrere Genre f&uuml;r '.$name.' aus.';
    $interpretid = $ds -> interpretid;
    echo '<br>InterpretID: ';
    echo $interpretid;

}
echo '<form action="genre_eintragen.php" method="post">';
echo '<select name="genre[]" size="13" multiple>';
$sql = mysql_query("SELECT * FROM genre");
while ($ds = mysql_fetch_object($sql)){
    echo '<option value="' . $ds -> genreid . '">' . $ds -> genre . '</option>';

}
echo' </select><br>';
echo '<input type="hidden" name="name" value="'.$name.'">';
echo '<input type="hidden" name="interpretid" value="'.$interpretid.'">';
echo '<input type="submit" value=" Absenden ">';
echo '<input type="reset" value=" Abbrechen">';
echo '</form>';
session_destroy();
?>
 
interpreten_eintragen.php
Warum behandelst du alle 4 übergebenen Variablen mit htmlspecialchars?
Vor allem bei summe und ergebnis (was ist das überhaupt) macht das keinen Sinn.
htmlspecialchars braucht man nur, wenn man etwas, dass Zeichen wie < > drin haben könnte,
wieder ausgeben will. Wenn man es einfach so ausgibt würde der HTML-Code durcheinander kommen, wenn da irgendwelche <> usw. drin sind.
summe und ergebnis werden nie ausgegeben -> htmlspecialchars kann man sich sparen.
Beim Rest...es ist nicht falsch, Werte so vorbehandelt in die DB einzufügen,
aber man sollte sich merken, ob es jetzt behandelt oder unbehandelt drin steht.

Dann das insert. mysql_real_escape_string.
Immer, bei jeder Variable im SQL, die Sonderzeichen wie \ " ' usw. drin haben könnte.
Wenn man zuerst schon geprüft hat, ob in der Variable nur eine Zahl ist (oder Ähnliches)
könnte man es sich auch sparen, aber sonst immer.
PHP:
$eintrag = "INSERT INTO interpreten (interpret,wikipedialink)
        VALUES ('" . mysql_real_escape_string($name) . "', '" . mysql_real_escape_string($wikipedia) . "')";
Alternative: Prepared Statements. Aber das geht hier zu weit vom Thema weg.
 
Zurück