# MySQL entfernt Backslash



## Zenti (6. November 2010)

Hey Leute,

ich bin total am verzweifeln. Ich weiß nicht, ob ich irgendwas übersehe habe, nur ich komm nicht weiter.

Ich habe in einer Variablen mittels mysql_real_escape_string einen Wert escaped. Was auch wunderbar klappt.
Nur beim speichern in der DB entfernt MySQL die Backslashes. Mir n absolutes Rätsel. Hier mal alle Infos:


```
$value = mysql_real_escape_string($_POST['value']);   // $_POST['value'] = 'test'
echo $value;            // $value = \'test\'
mysql_query("UPDATE `Test` set `value` = '$value' WHERE `ID` = '1' LIMIT 1"); // Value = 'test'
```


Hoffe, ihr könnt mir weiter helfen. Arbeite aktuell an einem Fremdserver und vermute, dass es irgendeine Einstellungssache ist.

Danke schon mal,
Zenti


----------



## CPoly (6. November 2010)

Was heißt denn "beim speichern in der DB entfernt MySQL die Backslashes."? Bekommst du einen Syntaxfehler beim ausführen des Queries?
Eingetragen werden sollte folgendes (so sollte es in der Datenbank in der Spalte "value" stehen)

```
'test'
```


----------



## Zenti (6. November 2010)

Sollte da nicht \'test\' drin stehen. Sonst wäre ja die MySQL_injection möglich, oder irre ich mich?!
Danke für die schnelle Antwort


----------



## CPoly (6. November 2010)

Du irrst dich. Du willst ja

```
'test'
```
eintragen. Weil dort aber Hochkommas vorkommen, was die Syntax deines Queries zerstören würde, escapest du diese mit dem Backslash (bzw. mysql_real_escape_string macht das für dich). Die Backslashes selbst gehören ja nicht zu deinem Text, sie maskieren nur die Sonderzeichen. Wäre ja auch blöd, wenn in der Datenbank was anderes an kommt, als das was du wolltest.
Du kannst ja mal mysql_real_escape_string weglassen. Dann wirst du mit diesem "'test'" einen Syntax Error bekommen.


----------



## Zenti (6. November 2010)

Okay danke, habs mal getestet
Lass ich mysql_real_escape_string weg, kommt das selbe Ergebnis, also 'test'. Desweiteren verstehe ich nicht ganz, was du schreibst. Das klingt zwar logisch, so wie du es schreibst, aber welchen Nutzen hätte denn dann stripslashes, wenn MySQL die Backslashes automatisch entfernt****

EDIT: hmm... ich sehe gerade, dass er ohne mysql_real_escape_string 'test' gar nicht in die DB einträgt. Jetzt versteh ich nix mehr?!


----------



## CPoly (6. November 2010)

"Automatisch entfernt" ist falsch ausgedrückt. Durch das Backslash nimmt man dem Hochkomma seine spezielle Bedeutung und MySQL interpretiert es als normales Zeichen.

Das ist doch in PHP genauso. Wenn du dort 'test' in einen String stecken willst, musst du es ja auch escapen (Wenn man mal außer acht lässt, dass man sowohl einfache als auch doppelte Anführungsstriche verwenden könnte).

```
<?php
	$foobar = '\'test\'';
	echo $foobar;
?>
```

Die Ausgabe lautet

```
'test'
```

Vielleicht kann es ja noch jemand anderes erklären.

EDIT:


Zenti hat gesagt.:


> EDIT: hmm... ich sehe gerade, dass er ohne mysql_real_escape_string 'test' gar nicht in die DB einträgt. Jetzt versteh ich nix mehr?!



Vermutlich wegen dem angesprochenen Syntaxfehler. Lass dir die Fehlermeldung mal anzeigen.

```
mysql_query("UPDATE `Test` set `value` = '$value' WHERE `ID` = '1' LIMIT 1") OR die(mysql_error());
```


----------



## Zenti (6. November 2010)

Nee CPoly,

ich geb dir vollkommen recht. Es macht auch Sinn wie gesagt. Mich verwirrt nur, dass ich damals bei gebracht bekommen habe:
Immer wenn ein Eintrag in die DB kommt Slashes hinzufügen und immer wenn es raus geht Slashes wieder weg.
IN: mysql_real_escpae_string($value);
OUT: stripslashes($value);
Und genau so code ich soweit ich denken kann. Nur zum ersten Mal sitze ich an nem Server, der die Hochkommas genauso interpretiert, wie du es beschreibst. Das verwundert mich eben so stark.


----------



## CPoly (6. November 2010)

Dann hat dein Lehrer etwas falsch gemacht. Vermutlich war auf den anderen Servern "magic quotes" (http://php.net/manual/en/security.magicquotes.php) eingeschaltet. Und mysql_real_escape_string war dann eigentlich doppelt-gemoppelt.


----------



## Zenti (6. November 2010)

Jo, das hab ich gerade überlegt. Weil auf diesem Server hab ich s extra ausgeschaltet eben. Gut, dann weiß ich bescheid. Hab grad mal versucht, ne Injection zu starten, reagiert er nicht drauf.
Danke auf jede Fall.^^



EDIT:

Hab jetzt noch mal was getestet:


```
$test = "'test'";
echo $test;               // 'test'
echo "<br/>";
echo mysql_real_escape_string($test);              // \'test\'
```

Wie erwartet zeigt PHP mir die Backslashes von $test an. Wieso sollten diese dann bei MySQL umgewandelt werden?


----------



## CPoly (6. November 2010)

In PHP gehören sie zum String dazu. In PHP ist die MySQL Anfrage ja auch nur ein String. Wenn der String dann aber beim MySQL Server ankommt, wird er interpretiert (wie eine Skriptsprache). Und bei der Interpretation nehmen die Backslashes den Hochkommas ihre spezielle Bedeutung.


----------



## Zenti (6. November 2010)

Okay, ich danke dir^^


----------

