Query SQL INSERT INTO mit $_POST
Guma
- php
Hallo und guten Tag, da mein "News"-system veraltet ist schreibe ich es gerade um. dabei greife ich mit $_POST auf Variablen zu, die dann in ein Query sollen.
So sieht mein Ansatz aus:
$db->query("INSERT INTO $n\_table
(titel,short_text,long_text,datum) VALUES ('".$_POST['TITEL']."','".$_POST['$SHORT_TEXT']."','".$_POST['$LONG_TEXT']."','".$_POST['$DATUM']."')");
Ich bekomme folgenden Fehler:
Database error: Invalid SQL: INSERT INTO news (titel,short_text,long_text,datum) VALUES ('fg','','','','','','','')
MySQL Error: ()
Session halted.
Warum wird nur das erste Feld in der DB gefüllt. Was mache ich hier falsch?
Moin,
So sieht mein Ansatz aus:
$db->query("INSERT INTO
$n\_table
(titel,short_text,long_text,datum) VALUES ('".$_POST['TITEL']."','".$_POST['$SHORT_TEXT']."','".$_POST['$LONG_TEXT']."','".$_POST['$DATUM']."')");
Warum wird nur das erste Feld in der DB gefüllt. Was mache ich hier falsch?
warum schreibst du das erste Feld als $_POST['TITEL'] und machst dann jeweils ein $ von dem Namen? Ist SHORT_TEXT wirklich eine Variable? Wenn ja, wozu dann in Hochkomma?
MfG,
Juan
Danke Joan und Wahsaga,
ich habe es so umgeschrieben:
$db->query("INSERT INTO $n\_table
(titel,
short_text,
long_text,
online,
datum)
VALUES
(
'" . addslashes($_POST['TITEL']) . "',
'" . addslashes($_POST['SHORT_TEXT']) . "',
'" . addslashes($_POST['LONG_TEXT']) . "',
'" . $_POST['ONLINE'] ."',
'" . $_POST['DATUM'] ."',
)
");
so wird alles in die DB gewchrieben was ich eingebe. Danke ist das Jetzt ok programmiert oder gibts da noch Verbesserungsmöglichkeiten?
Guma
hi,
so wird alles in die DB gewchrieben was ich eingebe. Danke ist das Jetzt ok programmiert
Nein.
oder gibts da noch Verbesserungsmöglichkeiten?
addslashes ist nicht zum Absichern von DB-Eingaben gedacht, benutze dafür mysql_real_escape_string().
Und wende dies auf _alle_ Werte an, sofern du dir über ihren Typ und Inhalt nicht hundertprozentig sicher sein kannst - das gilt auch für $_POST['ONLINE'] und $_POST['DATUM'].
gruß,
wahsaga
Hallo Wahsager,
Erfolgt das Absichern schon beim INSERT INTO in die Datenbank oder erst bei der Ausgabe auf der Webseite?
Kannst mir ein Beispiel aufzeigen?
echo $begrüßung;
Erfolgt das Absichern schon beim INSERT INTO in die Datenbank oder erst bei der Ausgabe auf der Webseite?
Mit mysql_real_escape_string() werden bestimmte Zeichen maskiert (siehe Handbuch). addslashes() macht das gleiche, nur unvollständig. Ebenso unvollständig sind die Maskierungen die das PHP-Feature Magic Quotes einfügt. Wenn du diese drin hast musst du die erst mal entfernen. Wenn es geht solltest du das Feature ausschalten.
Die Maskierung dient dazu, diese Sonderzeichen so zu kennzeichnen, dass sie bei der Übertragung zur Datenbank nicht als Sonderzeichen interpretiert werden.
Wenn für das Ausgabemedium Maskierungen erforderlich sind, dann solltest du diese erst einfügen, wenn die Daten zur Ausgabe gesendet werden. Wenn du sie schon in die DB einfügst musst du sie erst wieder entfernen, wenn du mal ein anderes Ausgabemedium verwenden willst.
Kannst mir ein Beispiel aufzeigen?
Gegeben sei: String 'mit' einfachen Anführungszeichen
mysql_real_escape_string() macht daraus: String 'mit' einfachen Anführungszeichen
damit der INSERT-Befehl am Ende so aussehen kann:
INSERT ... VALUES ('String 'mit' einfachen Anführungszeichen', ...)
echo "$verabschiedung $name";
Gut, vielen Dank für die weiteren antworten, ich überlege mir jetzt ob ich die Strings zuerst prüfe und dann in die SQL DB stecke
Es grüßt Euch guma
Hallo,
Gegeben sei: String 'mit' einfachen Anführungszeichen
mysql_real_escape_string() macht daraus: String 'mit' einfachen Anführungszeichen
damit der INSERT-Befehl am Ende so aussehen kann:
INSERT ... VALUES ('String 'mit' einfachen Anführungszeichen', ...)
Die Maskierungen sind ausschließlich für die Textschnittstelle der DB wichtig. Wenn man den Datenblock formatgerecht und direkt (also ohne SQL-Schnittstelle) an die DB übergeben würde, wären auch keine Maskierungen notwendig, denn dann wüsste die DB schließlich genau, was Daten und was Befehlsworte (Somderzeichen) sind.
Folglich verschwinden die Maskierungen auch an der Schnittstelle wieder und werden nicht mit abgespeichert.
Trotzdem muss Du (Guma) auch für die Anzeige im Browser Maßnahmen ergreifen. Der verträgt nämlich auch nicht alle Zeichen.
Universell für den HTML-Kontext (also nicht für Dialogfelder) wäre da
echo nl2br(htmlentities($datenwert_aus_db,ENT_QUOTES));
Formatierende Leerzeichen müssten ggf. noch separat behandelt werden.
LG
Chris
hi,
Erfolgt das Absichern schon beim INSERT INTO in die Datenbank oder erst bei der Ausgabe auf der Webseite?
Denk' mal drüber nach: _Wen_ oder _was_ willst du schützen ...?
gruß,
wahsaga
hi,
$db->query("INSERT INTO
$n\_table
(titel,short_text,long_text,datum) VALUES ('".$_POST['TITEL']."',
Hier verwendest du TITEL als Indexname für einen Wert im Array.
'".$_POST['$SHORT_TEXT']."','".$_POST['$LONG_TEXT']."','".$_POST['$DATUM']."')");
Und hier dann $SHORT_TEXT, $LONG_TEXT und $DATUM - aber so heißen deine Indizes vermutlich nicht.
Btw: Informiere dich _dringend_ über das Thema SQL Injections.
gruß,
wahsaga