Grundsatzfragen zu " und ' und `...
Frank
- datenbank
Hallo allerseits,
irgendwie hab ich das alles noch nie richtig geblickt ...
Bsp.:
my $sth = $dbh->prepare("REPLACE INTO 2005
(ID,Datum,Titel,Text,Kategorie,Publisher) VALUES ('$ID','$Datum','$Titel','$Text','$Kategorie','$Publisher')") ...
Meine Fragen:
1. Der Tabellenname (oder oft auch für Feldnamen):
Manchmal reicht einfach nur Tabelle zu schreiben und manchmal muss ich Tabelle
schreiben.
Gibt es dafür 'ne Regel oder ist es ohne ` grundsätzlich heikel ?
_________
2. Ich verwende ja folgende Begrenzer: " und '
Wenn jetzt in der Variable $Text aber ein ' enthalten ist, gibt es ERROR.
Da reicht auch kein maskieren mit ' innerhalb der Variable.
Kann ich die Begrenzer innerhalb der MySQL-Anweisung wilkürlich ändern ?
Bsp.: statt " nehm ich | und statt ' nehm ich ~
Oder was kann ich tun, um nicht alle ' in den Variablen ersetzen zu müssen ?
Danke, Frank
Moin!
- Der Tabellenname (oder oft auch für Feldnamen):
Manchmal reicht einfach nur Tabelle zu schreiben und manchmal muss ichTabelle
schreiben.
Gibt es dafür 'ne Regel oder ist es ohne ` grundsätzlich heikel ?
Die Backticks sind Escapezeichen, in die zwingend DB-, Tabellen- und Spaltennamen eingeschlossen werden müssen, die mit reservierten Worten der Datenbank identisch sind. Eine Spalte ALTER kollidiert beispielsweise mit dem Befehl ALTER und muß daher in Backticks.
Namen, die nicht kollidieren, dürfen auch in Backticks.
- Ich verwende ja folgende Begrenzer: " und '
Aber nicht für die Datenbank.
In deiner Codezeile ist " der Stringbegrenzer von Perl. ' ist ein im String enthaltenes simples Zeichen. Dessen Bedeutung wird erst in der Datenbank wirksam.
Wenn jetzt in der Variable $Text aber ein ' enthalten ist, gibt es ERROR.
Da reicht auch kein maskieren mit ' innerhalb der Variable.
Richtig. Alle benutzerdefinierten Werte muß man durch eine Escapingfunktion leiten, in der alle Zeichen, die unerwünschte Sonderbedeutung haben, entschärft werden. Siehe mysql_real_escape_string - auch Perl muß da eigentlich ein Interface zu dieser MySQL-Client-Funktion haben.
Kann ich die Begrenzer innerhalb der MySQL-Anweisung wilkürlich ändern ?
Bsp.: statt " nehm ich | und statt ' nehm ich ~
Nein, das ist ausgeschlossen. Escape deine Strings, und alles wird gut.
- Sven Rautenberg
Danke Sven !
Die Backticks sind Escapezeichen, in die zwingend DB-, Tabellen- und Spaltennamen eingeschlossen werden müssen, die mit reservierten Worten der Datenbank identisch sind. Eine Spalte ALTER kollidiert beispielsweise mit dem Befehl ALTER und muß daher in Backticks.
Hast Du vielleicht ein Beispiel für "reservierte Wörter der Datenbank" ?
_________
Da reicht auch kein maskieren mit ' innerhalb der Variable.
Richtig. Alle benutzerdefinierten Werte muß man durch eine Escapingfunktion leiten, in der alle Zeichen, die unerwünschte Sonderbedeutung haben, entschärft werden. Siehe mysql_real_escape_string - auch Perl muß da eigentlich ein Interface zu dieser MySQL-Client-Funktion haben.
Escapen durch verdoppeln Bsp.: '' klappt.
Durch Backslash nicht, obwohl es gehen sollte
http://dev.mysql.com/doc/refman/5.1/de/string-syntax.html
Grüsse, Frank
hi,
Escapen durch verdoppeln Bsp.: '' klappt.
Durch Backslash nicht, obwohl es gehen sollte
http://dev.mysql.com/doc/refman/5.1/de/string-syntax.html
du musst den backslash bei perl in Strings die von " begrenzt werden auch maskieren. also maskierst du ' durch \'
das funktioniert in diesem Fall auch mit der Funktion quotemeta().
mfG,
steckl
Hi,
Hast Du vielleicht ein Beispiel für "reservierte Wörter der Datenbank" ?
die liste der reservierten Worte in MySQL gibts hier. Nur so als Information am Rande: Während der Unterschied zwischen ' und " für so ziemliche alle SQL-konformen Datenbanken gelten dürfte, sind die Backticks für reservierte Worte keinesfalls ein einheitliches Zeichen. Microsoft beispielsweise verwendet in seinen Produkten für solche Zwecke eckige Klammern.
MfG
Rouven
Hell-O!
- Der Tabellenname (oder oft auch für Feldnamen):
Manchmal reicht einfach nur Tabelle zu schreiben und manchmal muss ichTabelle
schreiben.
Gibt es dafür 'ne Regel oder ist es ohne ` grundsätzlich heikel ?
Schau mal in das Kapitel Datenbank-, Tabellen-, Index-, Spalten- und Aliasnamen (MySQL 5.1).
- Ich verwende ja folgende Begrenzer: " und '
Oder was kann ich tun, um nicht alle ' in den Variablen ersetzen zu müssen ?
Schau dir mal das Kapitel Placeholders and Bind Values in der Doku zu DBI.pm an. Wenn dein DBMS sowas unterstützt, brauchst du dir um das Gequote keine Sorgen mehr zu machen.
Siechfred
Danke Euch Allen,
kurze Frage noch zu den reservierten Worten:
Ich kann mir nicht vorstellen, dass '2005' ein reserviertes DB-Wort ist, wie etwa ALTER oder ähnlich.
Aber egal.
Wenn Ihr mir jetzt sagt:
Backticks sind in jedem Fall besser und nie falsch,
dann mach ich das doch einfach in Zukunft ...
Grüsse, Frank
Also ich hatte die Tabelle auch mal umbenannt in N2005 statt 2005,
weil ich dachte: Nur ziffern macht Probleme.
.
Ging auch nicht ohne Backticks ...
echo $begrüßung;
Ich kann mir nicht vorstellen, dass '2005' ein reserviertes DB-Wort ist, wie etwa ALTER oder ähnlich.
2005 ist auch kein Wort sondern eine Zahl. Und als solche hat sie eine andere Bedeutung und wird auch intern als Zahl und nicht als String behandelt. Du könntest deine Tabelle auch 2005+42 nennen. Notierst du das ohne die Backticks versucht MySQL damit zu rechnen. Mit Backticks wird es als Bezeichner interpretiert.
echo "$verabschiedung $name";