String mit Apostrophen in DB eintragen -> Fehler!

Kona

Mitglied
Hallo erstmal,

mein aktuelles Problem besteht darin, dass ich Strings, die ein Apostroph enthalten, nicht korrekt in meine Datenbank hineinbekomme.

Ich schaffe es zwar, die Strings bei Selbstaufrufen der Seite so zu verändern, dass ich sie danach wieder rekonstruieren kann.

PHP:
$eingabestring = strtr($string, "'", "§");
 ...
 $ausgabestring = strtr($eingabestring, "§", "'");

Allerdings brauche ich den String mit den Apostrophen auch so in meiner Datenbank.
Wenn ich den Eintrag von Hand via phpMyAdmin vornehme, ist das erwartungsgemäß kein Problem.

Wenn ich aber den String über mein selbstgeschriebenes Script übermittle, kann ich machen was ich will; sobald das Apostroph im String vorkommt, endet der String. Auch eine Verwendung von Escape-Zeichen hat nichts gebracht ebenso wie das doppelte Eintragen des Apostrophs (z.B. statt: "You're" "You''re").

PHP:
 $charlist = "'";
 $eingabestring = addcslashes($string, $charlist);

Was kann ich tun, damit das Apostroph korrekt übertragen wird?
 
Ich bin mir nicht sicher, ob ich dich richtig verstehe, aber ich gehe mal davon aus, dass du das meinst:

PHP:
//Um ein Apostroph oder ein Anführungszeichen in die DB zu bringen musst du diese mit einem \ versehen

$Text = "Dieser Text sollte, obwohl ich ein \' und ein \" benutze, korrekt eingetragen werden.";
mysql_query("INSERT INTO tabelle (text) VALUES ('$Text')");

Hoffe es klappt!
 
Aha... man lernt bekannt nie aus :)

Aber vielleicht hilft dir das weiter (DW-Usern wird das wohl bekannt vorkommen):


PHP:
   function wertsql($wert, $typ, $defWert = "", $ndWert = "") 
   {
     $wert = (!get_magic_quotes_gpc()) ? addslashes($wert) : $wert;
   
     switch ($typ) {
   	case "text":
   	  $wert = ($wert != "") ? "'" . $wert . "'" : "NULL";
   	  break;	
   	case "long":
   	case "int":
   	  $wert = ($wert != "") ? intval($wert) : "NULL";
   	  break;
   	case "double":
   	  $wert = ($wert != "") ? "'" . doubleval($wert) . "'" : "NULL";
   	  break;
   	case "date":
   	  $wert = ($wert != "") ? "'" . $wert . "'" : "NULL";
   	  break;
   	case "defined":
   	  $wert = ($wert != "") ? $defWert : $ndWert;
   	  break;
     }
     return $wert;
   }
   
   $query = sprintf("INSERT INTO tabelle (datenspalte) VALUES (%s)", wertsql($_POST['eingabestring'], "text"));

Je nachdem, kann "text" auch durch "int", "double", "long", "date", "defined" ersetzt werden. Jedenfalls werden sowohl Apostrophe als auch Anführungszeichen "geslasht". Und der Datentyp für MySQL wird ebenfalls mit übermittelt (so hab`s ich zumindest verstanden ;))
 
Zuletzt bearbeitet:
Hallo, da bin ich wieder.

Ich hatte einen Fehler in der Reihenfolge, wie ich die Strings bearbeite, um das Apostroph zu schützen. Letztendlich hat es so funktioniert:

PHP:
$charlist = "'";
$dbentry = addcslashes($entry, $charlist);

Allerdings habe ich jetzt ein neues Problem und trotz der recht hohen Wahrscheinlichkeit, dass wieder was in meiner Verarbeitungsreihenfolge nicht sitmmt, frage ich euch auch nochmal um Rat, dafür gibt es ja das Forum.

Ich habe wie oben beschrieben meinen Eintrag schön in die Datenbank bekommen. Dort könnte jetzt stehen: "Hallo wie geht's"
Jetzt möchte ich diesen Eintrag auslesen und zur Bearbeitung in ein Formular eintragen. Das sieht bei mir wie folgt aus:
PHP:
$row = mysql_fetch_object($query);
$dbentry = $row->Eintrag;
echo "
<form method='post' action='die tut hier eh nichts zu sache'>
<tr><td>Datenbankeintrag</td>
<td><input type='text' size='strlen($dbentry)' value='$dbentry'></td>
</tr>
</form>";
Als Eintrag im Textfeld erscheint jetzt: "Hallo wie geht"

Ok, den Fehler kenn ich, dachte ich mir und bearbeite das ganze folgendermaßen:

PHP:
$row = mysql_fetch_object($query);
$charlist = "'";
$dbentry = addcslashes($row->Eintrag, $charlist);
echo "
<form method='post' action='die tut hier eh nichts zu sache'>
<tr><td>Datenbankeintrag</td>
<td><input type='text' size='strlen($dbentry)' value='$dbentry'></td>
 </tr>
</form>";
Leider hab ich so nur mäßigen Erfolg, denn jetzt kommt folgende Ausgabe: "Hallo wie geht\".
Wenn ich allerdings meine Variable $dbentry ganz normal ausgeben lasse und sie nicht in ein Formular eintrage, erscheint alles richtig: "Hallo wie geht's"

Wo liegt jetzt hier bitte mein Fehler
 
jooo, sauber, das funktioniert sogar mit Einstellung der richtigen Attribute.
Super, dankeschön, Problem gelöst.

Jetzt nur noch eine kleine Verständnisfrage:

Mit dem Übertragen von ungeschützen Apostrophen kann man sich ja verwundbar für so SQL-Injections machen. Dies kann ja, wenn ich das jetzt richtig verstanden habe mit der Funktion mysql_escape_string() verhindern. Ist dies weiterhin notwendig, wenn man die Eingabe mit addslashes bzw. addcslashes bearbeitet hat? (Meiner Meinung nach nicht, aber ich lass mal lieber die Experten hier antworten ;-) )
 
Zurück