Php, mySQL und '

Hi,
habe ein Formular, über das Text eingegeben werden kann, der dann in einer SQL-Datenbank gespeichert wird. Jetzt will ich einen Text mit einem ’ darin eingeben. Das wird in der DB auch richtig gespeichert (die Funktionen addslashes und stripslashes habe ich schon gefunden), wenn ich danach allerdings per SQL-Abfrage auf die DB zugreife und den Text in ein einfaches Textfeld schreibe (input type =„text“), wird nur der Text bis zu eben diesem ’ dargestellt. Aus Julia’s PHP-Prog würde dann z.B. nur Julia.
Woran liegt das, und wie kann ich das umgehen?

MfG
Julia

Hi!

habe ein Formular, über das Text eingegeben werden kann, der
dann in einer SQL-Datenbank gespeichert wird. Jetzt will ich
einen Text mit einem ’ darin eingeben. Das wird in der DB auch
richtig gespeichert (die Funktionen addslashes und
stripslashes habe ich schon gefunden), wenn ich danach
allerdings per SQL-Abfrage auf die DB zugreife und den Text in
ein einfaches Textfeld schreibe (input type =„text“), wird nur
der Text bis zu eben diesem ’ dargestellt. Aus Julia’s
PHP-Prog würde dann z.B. nur Julia.
Woran liegt das, und wie kann ich das umgehen?

Das Apostroph stellt für den SQL-Zugriff ein Ende-Zeichen dar, d.h. es wird nur bis zum Apostroph gelesen, der Rest weggeworfen.

Tausch beim Schreiben in die Datenbank das Apostroph gegen ein anderes Sonderzeichen aus (aus Julia’s wird z.B. Julia#s) und beim Auslesen der Daten tauscht du das # wieder in ein Apostroph um.

Grüße
Heinrich

Unsinn…
Halllo,

sorry, aber das ist Unsinn. Wozo sollte ich Anführunsgzeichen durch # austauschen? Was mache ich, wenn ich wirklich mal das Hashzeichen benutzen will?

Außerdem ist die PHP-Funktion, automatisch Anführungszeichen zu escapen, ziemlicher Mist, den man möglichst komplett ausschalten sollte, z.B. per .htaccess php_flag magic_quotes_gpc off. Weiterhin solltest du die Funktionen addslashes() und stripslashes() auch weg lassen und beimSpeichern der Daten mysql_real_escape_string() benutzen, um unter anderem Anführungszeichen entsprechend dem charset der Verbindung zu escapen (auch wegen sql-injection attacks). Beim Auslesen der Daten wird definitiv nichts abgeschnitten. Ich vermute mal, dass du in deiner HTML-Datei einfache Anführungszeichen (’) oder sogar gar keine benutzt, anstatt doppelte ("), wie es richtig wäre. Für ein normales Editfeld übergibst du den Wert mit value="$variable".

Es gibt im Deutschen übrigens kein Genitiv-Apostroph wie im Englischen. Sorry, ich konnte es mir nicht verkneifen. Falls „Julia’s PHP-Prog“ der in englischer Schreibweise sein sollte, habe ich nichts gesagt.

Daniel

Hi Daniel,

Außerdem ist die PHP-Funktion, automatisch Anführungszeichen
zu escapen, ziemlicher Mist, den man möglichst komplett
ausschalten sollte, z.B. per .htaccess php_flag
magic_quotes_gpc off
. Weiterhin solltest du die Funktionen
addslashes() und stripslashes() auch weg lassen und
beimSpeichern der Daten mysql_real_escape_string() benutzen,
um unter anderem Anführungszeichen entsprechend dem charset
der Verbindung zu escapen (auch wegen sql-injection attacks).

Oje, so viel Informationen auf einmal - so weit bin ich noch nicht! Hatte nur das Problem, daß ’ und " beim Auslesen aus der DB ohne diese Funktionen eben mít Slash rauskommen, und das wollte ich nicht.

Beim Auslesen der Daten wird definitiv nichts abgeschnitten.
Ich vermute mal, dass du in deiner HTML-Datei einfache
Anführungszeichen (’) oder sogar gar keine benutzt, anstatt
doppelte ("), wie es richtig wäre. Für ein normales Editfeld
übergibst du den Wert mit value="$variable".

Ich benutze beides, einfache wie doppelte, und das soll auch so sein. Witzig ist, daß es so wie ich es habe klappt, wenn man z.B. in textarea-Felder ausgibt. Nicht aber beim normalen Input-Feld.

Es gibt im Deutschen übrigens kein Genitiv-Apostroph wie im
Englischen. Sorry, ich konnte es mir nicht verkneifen. Falls
„Julia’s PHP-Prog“ der in englischer Schreibweise sein sollte,
habe ich nichts gesagt.

lol - eigentlich bin ich immer die Grammatik-Fachfrau :wink:
Das war jetzt nur ein Beispiel. Du hast richtig geraten, es geht ums Englische.

Viele Grüße,
Julia

So mache ich es …
Hallo Julia,

also an HTML sollte es nicht liegen, dass ein Text nach dem ’ nicht mehr dargestellt wird, es sei denn, Du verwendest im HTML-Tag eben dieses Zeichen (z.B. so: ). Also bei mir klappt das hier z.B. problemlos: .

Um bei der Kommunikation zwischen HTML-Formular und mySQL-Datenbank keine Schwierigkeiten zu bekommen, verwende ich die folgenden Ersetzungen:

**$arrQS** = array("\\", '"', "\r\n", "\n"); _//QuerySearch_
**$arrQR** = array("\\\\", '\"', '\n', '\n'); _//QueryReplace_
 
**$query** = 'UPDATE tabelle' .
 ' SET inhalt="' .<u>str_replace(<b>$arrQS</b>, <b>$arrQR</b>, <b>$FormularInhalt</b>)</u>. '"' .
 ' WHERE ID=1'; 
 
**$arrES** = array( '"', '', '&' ); _// EchoSearch_
**$arrER** = array('"', '\<', '\>', '&'); _// EchoReplace_
 
**echo**'' .<u>str_replace(<b>$arrES</b>, <b>$arrER</b>, <b>$DatenbankInhalt</b>)</u>. '';
**echo**'';

Die Definition der vier Arrays erfolgt natürlich global irgendwo und nicht direkt vor der Aktion.

Voraussetzung dafür, dass es funktioniert, ist natürlich, dass bei der SET-Formulierung die doppelten Anführungszeichen verwendet werden, weil sonst die maskierten Zeichen (z.B. \n für den Zeilenumbruch) nicht übersetzt werden.
Andersrum müssen auch für die HTML-Tags doppelte Anführungszeichen verwendet werden, da sonst das einfache (’) nicht darstellbar ist, für das es leider keine HTML-Umschreibung gibt (wie " für das doppelte).

Wenn das allerdings beachtet wird, hat man meines Erachtens keine Probleme mehr. Ich hatte sie jedenfalls nicht und konnte beliebige Zeichen über das Formular in die Datenbank schicken und auch zurückladen.

Statt es einfachen Hochkommas würde ich übrigens lieber das ´ verwenden. Das ist nicht nur korrekt in „Julia´s Something“ (das Hochkomma ist da - genau genommen - falsch), sondern es verhindert auch Dein Problem und sieht zudem besser aus.

Viele Grüße,
Kristian