Insert mit $_POST
Stanload
- php
Hallöchen zusammen,
so kurz vorm WE hab ich da noch eine Frage *g*, die wahrscheinlich recht einfach ist, nur ich mich zu blöde anstelle.
Ich habe ein Formular mit action="<?php echo $PHP_SELF; ?>.
Wenn der Button gedrückt wird, überprüfe ich, ob bestimmte Felder gefüllt wurden und ob das PW mit der Wiederholung übereinstimmt.
Anschließend möchte ich den Datensatz in die DB schreiben und dabei mit den per $_POST übergebenen Werten arbeiten und nicht unbedingt Variablen (könnten später relativ viele werden) erst definieren.
Im Moment schaut's so aus:
if ( $_POST['submit'] ):
if ( $_POST['nick']!=="" &&
$_POST['pass']!=="" &&
$_POST['passcheck']!=="" &&
$_POST['pass']==$_POST['passcheck'] &&
$_POST['name']!=="" &&
$_POST['bdate']!=="" ):
include("data.php");
$eintrag = "INSERT INTO members
(nick,name,place,bdate)
VALUES
('$_POST['nick']',
'$_POST['name']',
'$_POST['place']',
'$_POST['bdate']') or die(mysql_error());
$eintragen = mysql_query($eintrag);
mysql_close($connect);
Ich bekomme dann aber folgende Meldung:
Parse error: parse error, expecting T\_STRING' or
T_VARIABLE' or `T_NUM_STRING' in ...
Könnte mir vielleicht wer weiterhelfen, wo es hier hängt?
Bis denn
Stanload
Die Anweisungen nach einem if... werden in PHP in geschweiften Klammern zusammengefasst:
if (Bedingung) {
tue dies;
tue das;
}
Hallo,
Die Anweisungen nach einem if... werden in PHP in geschweiften Klammern zusammengefasst:
if (Bedingung) {
tue dies;
tue das;
}
Hm, mit dem : hat es auch geklappt, man darf halt nur nicht das endif vergessen. Das war dann einige Zeilen weiter unten noch vorhanden, hatte ich aber versehntlich nicht hier angegeben.
Hab's aber nun auf { } geändert.
Bis denn
Stanload
hi,
$eintrag = "INSERT INTO members
(nick,name,place,bdate)
VALUES
('$_POST['nick']',
'$_POST['name']',
'$_POST['place']',
'$_POST['bdate']') or die(mysql_error());
du machst den "insert ..."-string nicht wieder zu - es fehlt ein " vor dem or die(...)
btw: wie gefährlich es ist, usereingaben ungeprüft zu übernehmen und zum befüllen der DB zu verwenden, ist dir das bewusst?
wenn du es so lässt, wundere dich nicht, wenn dir irgendjemand deine tabellen löscht ...
gruss,
wahsaga
Hallo,
du machst den "insert ..."-string nicht wieder zu - es fehlt ein " vor dem or die(...)
Ich habe ihn nun zugemacht und bekomme erneut die selbe Fehlermeldung :-(.
btw: wie gefährlich es ist, usereingaben ungeprüft zu übernehmen und zum befüllen der DB zu verwenden, ist dir das bewusst?
Wie, ungeprüft? Ich überprüfe doch, ob dieverse Felder gefüllt wurden. Was müsste ich denn ncohj prüfen?
wenn du es so lässt, wundere dich nicht, wenn dir irgendjemand deine tabellen löscht ...
Hm, wie kann man das denn dann hinbekommen *nichts peil im Moment*?
Bis denn
Stanload
Hallo Stanload,
btw: wie gefährlich es ist, usereingaben ungeprüft zu übernehmen und zum befüllen der DB zu verwenden, ist dir das bewusst?
Wie, ungeprüft? Ich überprüfe doch, ob dieverse Felder gefüllt wurden. Was müsste ich denn ncohj prüfen?
das schon, ja, aber sobald in einem der einzutragenden Werte ein ' vorkommt, wirft dir das dein ganzen Query durcheinander - probier es mal aus. Deshalb sollten Daten die vom User kommen immer erst durch eine Funktion o.ä. gejagt werden, die die "gefährlichen" Zeichen "entschärft" - in deinem Fall durch mysql_escape_string() (->http://de.php.net/mysql_escape_string).
wenn du es so lässt, wundere dich nicht, wenn dir irgendjemand deine tabellen löscht ...
Hm, wie kann man das denn dann hinbekommen *nichts peil im Moment*?
u.U. kann es passieren, das dir einer ein "DELETE FROM tabellenname" mitreinschmuggelt und dir damit eben die Tabelle löscht (was aber idR nicht funktionieren wird, da du INSERT schon fest angegeben hast, und mysql_query() keine zwei Querys ausführen kann).
noch kurz was zu deinem Code aus [pref:t=58014&m=325287]:
if ( $_POST['nick']!=="" &&
bist du sicher, dass du wirklich '!==' willst, und nicht nur '!='? Mit '!==' überprüfst du nämlich auch noch auf Typengleichheit, was hier imho nicht nötig ist (siehe http://de.php.net/language.operators.comparison). Außerdem gibt es auch eine Funktion die prüft, ob eine Variable leer ist: empty() (wer hätte es gedacht :-))
Grüße aus Nürnberg
Tobias
Hiho Tobias,
das schon, ja, aber sobald in einem der einzutragenden Werte ein ' vorkommt, wirft dir das dein ganzen Query durcheinander - probier es mal aus. Deshalb sollten Daten die vom User kommen immer erst durch eine Funktion o.ä. gejagt werden, die die "gefährlichen" Zeichen "entschärft" - in deinem Fall durch mysql_escape_string()
und in die () kann man mehrere Werte packen oder kann ich dort gleich ($_POST) hineinpacken und der komplette String wird überprüft?
Es werden automatisch alle "gefährlichen" Zeichen auf einen Schlag entschärft? Wo erfahre ich denn, welche es sind? Ich würde nämlich dann eine Meldung ausgeben wollen, von wegen "Diese Zeichen sind nicht erlaubt: ...".
noch kurz was zu deinem Code aus [pref:t=58014&m=325287]:
if ( $_POST['nick']!=="" &&
bist du sicher, dass du wirklich '!==' willst, und nicht nur '!='? Mit '!==' überprüfst du nämlich auch noch auf Typengleichheit, was hier imho nicht nötig ist (siehe http://de.php.net/language.operators.comparison). Außerdem gibt es auch eine Funktion die prüft, ob eine Variable leer ist: empty() (wer hätte es gedacht :-))
OK, ein != genügt auch. Das emty ist eine gute Idee, klappt aber dann nicht zur Überprüfung des PW und der Wiederholung.
Kann man auch hier mehrere Werte mitgeben, die auf einmal geprüft werden sollen?
Und wie schaut's dann wieder mit $_POST[...] aus?
Im Allgemeinen ist diese Frage leider immer noch offen, oder muss ich wirklich die Werte in Variablen reinschreiben?
Wenn, dann würde ich die wohl einmal deklarieren und includen, wenn es wirklich nicht anders gehn sollte.
Bis denn
Stanload
Hallo Stanload,
und in die () kann man mehrere Werte packen oder kann ich dort gleich ($_POST) hineinpacken und der komplette String wird überprüft?
nein, du musst jeden einzelnen Wert "durchjagen".
dein Query muss dann statt
"INSERT [...] VALUES
('$_POST['nick']',[...])"
eben so aussehen:
"INSERT [...] VALUES
('".mysql_escape_string($_POST['nick'])."',[...])"
Es werden automatisch alle "gefährlichen" Zeichen auf einen Schlag entschärft? Wo erfahre ich denn, welche es sind? Ich würde nämlich dann eine Meldung ausgeben wollen, von wegen "Diese Zeichen sind nicht erlaubt: ...".
keine Ahnung, aber das ist auch egal - du kannst diese Zeichen durchaus zulassen - nur müssen sie eben bevor du sie durch mysql_query() jagst maskiert werden.
Das emty ist eine gute Idee, klappt aber dann nicht zur Überprüfung des PW und der Wiederholung.
hää? was hindert dich an
[...]
!empty($_POST['pass']) &&
!empty($_POST['passcheck']) &&
$_POST['pass']==$_POST['passcheck']
[...]
statt
[...]
$_POST['pass']!=="" &&
$_POST['passcheck']!=="" &&
$_POST['pass']==$_POST['passcheck'] &&
[...]
?
Kann man auch hier mehrere Werte mitgeben, die auf einmal geprüft werden sollen?
nein.
Und wie schaut's dann wieder mit $_POST[...] aus?
du meinst mit empty($_POST)? - keine Ahnung was da passiert, aber ich glaube nicht, das das was bringt - da müsstest du dir schon deine eigene Funktion schreiben die sowas macht.
Im Allgemeinen ist diese Frage leider immer noch offen, oder muss ich wirklich die Werte in Variablen reinschreiben?
du meinst sowas:
$name = $_POST['name'];
$query = "INSERT [...] VALUES('.mysql_escape_string($name).',[...])";
statt:
$query = "INSERT [...] VALUES('.mysql_escape_string($_POST['name']).',[...])";
btw: die in [pref:t=58014&m=325287] genannte Fehlermeldung ist inzwischen weg, oder?
Grüße aus Nürnberg
Tobias
Hallo Tobias,
so, nun ist mein 1-Tag-WE auch vorbei und es kann weitergehn *g*.
eben so aussehen:
"INSERT [...] VALUES
('".mysql_escape_string($_POST['nick'])."',[...])"
OK, Du hast mich überedet, das wird dann ja bei 100 Feldern ewig lang *g*.
Ich habe nun ein Iclude gemacht, in dem ich die Daten in eine Variable packe und überprüfe und immer aufrufe, wenn ich diese brauche (z.B. brauch ich das ja nicht nur beim Insert, sondern auch beim Update):
data.inc.php:
$id = mysql_escape_string($_POST["id"]);
$nick = mysql_escape_string($_POST["nick"]);
$name = mysql_escape_string($_POST["name"]);
...
Das emty ist eine gute Idee, klappt aber dann nicht zur Überprüfung des PW und der Wiederholung.
hää? was hindert dich an[...]
!empty($_POST['pass']) &&
!empty($_POST['passcheck']) &&
$_POST['pass']==$_POST['passcheck']
[...]statt
[...]
$_POST['pass']!=="" &&
$_POST['passcheck']!=="" &&
$_POST['pass']==$_POST['passcheck'] &&
[...]
?
Da haben wir wohl aneinander vorbeigeredet *g*.
Klar, so hab ich es jetzt auch fast gemacht. Ich meinte nur, dass der Vergleich nicht per empty gemacht werden kann.
Aber warum hast Du da !empty stehen und nich nur empty?
du meinst sowas:
$name = $_POST['name'];
$query = "INSERT [...] VALUES('.mysql_escape_string($name).',[...])";
OK, das mysql_escape_string und $_POST... hat sich ja durch die Varablen hoffentlich geändert.
$_POST»»
btw: die in [pref:t=58014&m=325287] genannte Fehlermeldung ist inzwischen weg, oder?
Ja, mittlerweile kommt die Meldung nicht mehr, aber der Insert klappt nicht. Es schaut nun so aus:
include("data.inc.php");
if ($_POST['submit'])
{
if ($nick!="" &&
$pass!="" &&
$passcheck!="" &&
$pass==$passcheck &&
$name!="" &&
$bdate!="")
{
echo $nick;
echo $name;
echo $pass;
include("connect.inc.php");
$insert = "insert into members (nick,name,place,bdate,bplace,pass)
values ('$nick','$name','$place','$bdate','$bplace','$pass')"
or die(mysql_error());
mysql_close($connect);
?>
... ---> Hier kommt eine Bestätigung.
<?php
exit;
}
}
?>
Die Variablen sind alle gefüllt und zum Server connected er.
Ich verstehe es einfach nicht :-(.
Bis denn
Stanload
hi,
Ja, mittlerweile kommt die Meldung nicht mehr, aber der Insert klappt nicht. [...]
Die Variablen sind alle gefüllt und zum Server connected er.
Ich verstehe es einfach nicht :-(.
kein wunder, weil ...
$insert = "insert into members (nick,name,place,bdate,bplace,pass)
values ('$nick','$name','$place','$bdate','$bplace','$pass')"
or die(mysql_error());
mysql_close($connect);
du definierst dir hier lediglich einen query-string in der variablen $insert.
was hältst du davon, diese query dann auch an die DB anzuschicken ...?
mach es also folgendermaßen:
$insert = "...";
mysql_query($insert) or die(mysql_error());
mysql_query setzt die von dir in der variablen $insert definierte query an die DB ab. das or die gehört natürlich dort dahinter und nicht hinter die wertzuweisung für $insert (denn diese geht in den seltensten fällen schief).
gruss,
wahsaga
Moin!
was hältst du davon, diese query dann auch an die DB anzuschicken ...?
mach es also folgendermaßen:
$insert = "...";
mysql_query($insert) or die(mysql_error());
Gute Idee *g*, wo war ich blos wieder mit meinem Gedanken?
Ich hab da aber jetzt folgendes draus gemacht, funktioniert ja auch:
$insert = mysql_query("insert into members (nick,name,place,bdate,bplace,pass)
values ('$nick','$name','$place','$bdate','$bplace','$pass')")
or die(mysql_error());
Vielen Dank und mal schauen, was demnächst noch so an Fragen auftauchen wird.
Axo, da hab ich doch noch was:
Ich gebe, wenn ein Mussfeld nicht gefüllt ist, eine Meldung, von wegen aus:
if ( empty ($nick) )
{ echo "<p>Bitte gib deinen Nick ein!</p>"; }
elseif ( empty ($pass) )
{ echo "<p>Bitte gib dein Passwort ein!</p>"; }
...
Im Moment macht er es dann immer nur für einen Fall, quasi wenn der Nick und das PW nicht gefüllt sind, kommt ersteinmal nur die Meldung für den Nick.
Kann ich die Infos nicht in eine Variable schreiben und dann alle nicht gefüllten Sachen auf einmal ausgeben?
Wie würde das dann funkionieren von wegen zum Wert hier "Bitte gib deinen Nick ein!" den nächsten dahinter zu schreiben?
Bis denn
Stanload
hi,
Ich gebe, wenn ein Mussfeld nicht gefüllt ist, eine Meldung, von wegen aus:
if ( empty ($nick) )
{ echo "<p>Bitte gib deinen Nick ein!</p>"; }
elseif ( empty ($pass) )
{ echo "<p>Bitte gib dein Passwort ein!</p>"; }
...Im Moment macht er es dann immer nur für einen Fall, quasi wenn der Nick und das PW nicht gefüllt sind, kommt ersteinmal nur die Meldung für den Nick.
das liegt daran, wie dudie abfrage gestaltet hast - du arbeitest hier mit einer "elseif"-bedingung. diese wird aber überhaupt nur dann abgefragt, wenn die erste bedingung falsch ergeben hat.
d.h., wenn $nick _nicht_ leer ist, dann wird $pass gar nicht mehr geprüft.
wenn du beide prüfen willst, dann mache zwei einzelne if-abfragen, so dass die abarbeitung der zweiten nicht vom ergebnis der ersten abhängt.
gruss,
wahsaga
hi,
d.h., wenn $nick _nicht_ leer ist, dann wird $pass gar nicht mehr geprüft.
sorry, das war jetzt bullsh*t meinerseits.
richtig formuliert heisst es (andersherum):
wenn $nick leer ist, wird die abfrage auf $pass überhaupt aktiv.
gruss,
wahsaga
Huhu!
wenn $nick leer ist, wird die abfrage auf $pass überhaupt aktiv.
Schon verstanden *g*, aber kann ich eine Variable $error auch mit mehreren Sätzen füllen, also irgendwie mit AND oder &&? Ich möchte, dass die MSG dann immer erweitert wird.
Bis denn
Stanload
hi,
aber kann ich eine Variable $error auch mit mehreren Sätzen füllen, also irgendwie mit AND oder &&? Ich möchte, dass die MSG dann immer erweitert wird.
mit den stringoperatioren in php bist du doch wohl vertraut, oder?
und mal ein bisschen selber die grauen zellen anzustrengen, kann doch eigentlich auch nicht zu viel verlangt sein ...
eine möglichkeit wäre z.b.
$error = "";
if( -fehler1- ) $error .= "fehler1 ist aufgetreten!<br>";
if( -fehler2- ) $error .= "fehler2 ist aufgetreten!<br>";
if( -fehler3- ) $error .= "fehler3 ist aufgetreten!<br>";
// usw. usv.
echo $error;
gruss,
wahsaga
Moin!
mit den stringoperatioren in php bist du doch wohl vertraut, oder?
Mein Gott, ich komme derzeit noch nicht einmal auf die leichtesten Sachen, Danke!
Bis denn
Stanload
Hallo Stanload,
so, nun ist mein 1-Tag-WE auch vorbei und es kann weitergehn *g*.
tja, nur habe ich im Moment unter der Woche nicht allzuviel Zeit :-)
"INSERT [...] VALUES
('".mysql_escape_string($_POST['nick'])."',[...])"
OK, Du hast mich überedet, das wird dann ja bei 100 Feldern ewig lang *g*.
100 Felder?!? was trägst du da alles ein? :-)
Klar, so hab ich es jetzt auch fast gemacht. Ich meinte nur, dass der Vergleich nicht per empty gemacht werden kann.
nö, natürlich nicht :-)
Aber warum hast Du da !empty stehen und nich nur empty?
weil du doch willst, dass die Daten nur eingetragen werden, wenn die Felder ausgefüllt sind - wenn du aber auf empty($...) prüfst, wird dein if bei leeren Feldern true, und die Daten werden eingefügt (bzw. es wird in dem Fall ein leerer Datensatz angelegt) - deshalb das !. Damit negierst du das was empty zurückliefert, und !empty liefert somit nur bei nicht leeren Variablen true und der Query wird nur ausgeführt wenn alles gefüllt ist.
Hier wird connected
include("connect.inc.php");
müsste das nicht schon nach
if($_POST['submit']){
kommen?
$insert = "insert into [...]" or die(mysql_error());
mysql_close($connect);
das ein mysql_query() nicht schlecht wäre, hat dir wahsaga ja schon gesagt :-)
Grüße aus Nürnberg
Tobias
hi,
u.U. kann es passieren, das dir einer ein "DELETE FROM tabellenname" mitreinschmuggelt und dir damit eben die Tabelle löscht (was aber idR nicht funktionieren wird, da du INSERT schon fest angegeben hast, und mysql_query() keine zwei Querys ausführen kann).
selbst wenn dieser fall zugegebenermaßen relativ unwahrscheinlich ist - es gibt andere fiese fallen.
mal angenommen, du machst einen SELECT, in dem du prüfen wilst, ob das angebene passwort zum usernamen passt, also hast du eine WHERE-bedingung in der art "... WHERE passwort = '$passwort'".
wenn du jetzt das vom user eingegebene passwort ungeprüft in deine query übernimmst, dann gebe ich z.b. >blah ' OR 1 OR 'x< als passwort ein, und schon sieht deine query so aus:
... WHERE passwort = 'blah' OR 1 OR 'x'"
OR 1 sorgt dafür, dass die bedingung _immer_ wahr ist, d.h. ich brauche das passwort gar nicht mehr kennen, um mich einloggen zu können ...
gruss,
wahsaga
Huhu,
mal angenommen, du machst einen SELECT, in dem du prüfen wilst, ob das angebene passwort zum usernamen passt, also hast du eine WHERE-bedingung in der art "... WHERE passwort = '$passwort'".
wenn du jetzt das vom user eingegebene passwort ungeprüft in deine query übernimmst, dann gebe ich z.b. >blah ' OR 1 OR 'x< als passwort ein, und schon sieht deine query so aus:
... WHERE passwort = 'blah' OR 1 OR 'x'"
OR 1 sorgt dafür, dass die bedingung _immer_ wahr ist, d.h. ich brauche das passwort gar nicht mehr kennen, um mich einloggen zu können ...
OK, überzeugt und eingebaut (siehe auch andere Nachricht *g*.)
Bis denn
Stanload