Unchecked Checkboxen nicht im $_POST-Array
Viennamade
- php
0 Tom0 Viennamade0 Tom
0 MudGuard0 Chrischaaan0 Andreas Korthaus0 Viennamade
Hallo liebes Forum!
Ich hab eine Seite gemacht, dort wählt der Anwender eine Tabelle einer My-SQL-Datenbank, dann baut php ein Formular zum editieren, die Felder der Datentabelle werden mit textareas, etc. und eben mit checkboxen dargestellt. Nachdem der Anwender auf "speichern" klickt gehts auf die "Action"-Seite, das steht drinnen:
INSERT INTO db (fld1, fld2) VALUES (val1, val2)
==========
Den unterstrichenen Ausdruck beziehe ich aus den Formularfeldern, wenn eine Checkbox ohne Häckchen dabei ist, dann hab ich einen Wert zu wenig im Ausdruck.
Wie geht man da vor? - Ich weiß ja nicht wieviele Checkboxen vorhanden sind und an welcher Stelle sie stehen. Kann mir vorstellen, den "INSERT INTO"-Befehl schon korrekt auf der Formularseite aufzubauen und in einem hidden-Feld zu übergeben, hoffe aber auf etwas gescheiteres von Euch :-).
Danke
Viennamade
Hello,
zu diesem thema hatte ich die letzten Tage schon mal was ausführliches gepostet (incl. kommentiertem Musterscript). Da musst Du vielleicht mal die Suche anschmeißen.
Liebe Grüße aus http://www.braunschweig.de
Tom
zu diesem thema hatte ich die letzten Tage schon mal was ausführliches gepostet (incl. kommentiertem Musterscript). Da musst Du vielleicht mal die Suche anschmeißen.
Hallo Tom,
wenn ich im Archiv in Sachen PHP/Datenbank suche, dann ist meist eines der Suchewörter "Braunschweig"... ich habe aber eine falsche Antwort gesucht, daher Dein "altes" Posting bald verworfen und dann diesen Thread begonnen. Alles klar jetzt.
Danke
Viennamade
Hello,
zu diesem thema hatte ich die letzten Tage schon mal was ausführliches gepostet (incl. kommentiertem Musterscript). Da musst Du vielleicht mal die Suche anschmeißen.
Hier nochmal die Threadnummer: http://forum.de.selfhtml.org/archiv/2004/1/68958/#m396490
musste doch tatsächluch nur "Tom Checkbox Radio" suchen und habe genau ein Ergebnis bekommen *gg*
Hallo Tom,
wenn ich im Archiv in Sachen PHP/Datenbank suche, dann ist meist eines der Suchewörter "Braunschweig"... ich habe aber eine falsche Antwort gesucht, daher Dein "altes" Posting bald verworfen und dann diesen Thread begonnen. Alles klar jetzt.
Na, da freut mich doch, dass ich inzwischen soviel gelernt habe, dass es Anderen auch was nützt ;-)
Das Umbauen der beschriebenen Abfrage zu einem INSERT ist ja auch nicht sooo schwer. Du solltest bei formularbasierten Daten aber von der Schreibweise
insert into $table ($fields) values ($values)
Abstand nehmen zu Gunsten der Schreibweise
insert into $table set
$_spalte[1][name] = 'mysql_escape_string($_wert[$_spalte[1][name]])',
$_spalte[2][name] = 'mysql_escape_string($_wert[$_spalte[2][name]])',
...
Habs gleich mal etwas komplizierter geschrieben, damit es Diskussionsstoff gibt *g* und man trotzdem sieht, was in der ersten Version vergessen wurde:
Natürlich muss man auch hier prüfen, ob die Spalten auf 'String', 'Num' oder NULL gesetzt werden sollen und deshalb sollte man sich für die rechte Seite der set-Zuweisung eine Funktion schreiben, die den Operanden analog zum anderen Thread (Abfrage) bestimmt. Dann bleibt das Ganze auch noch übersichtlich.
Und bei Datenherkunft FORMULAR und "Schleifenbearbeitung" immer an die Liste der zu manipulierenden Daten denken. Es könnte nämlich sonst leicht passieren, dass man z.B. in einem Datensatz nur ein Feld bearbeiten lassen wollte, der User aber <cite>den Editor seiner Wahl</cite> benutzt hat, um die Felder SEINER Wahl zu manipulieren.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi!
Das Umbauen der beschriebenen Abfrage zu einem INSERT ist ja auch nicht sooo schwer. Du solltest bei formularbasierten Daten aber von der Schreibweise
insert into $table ($fields) values ($values)
Abstand nehmen zu Gunsten der Schreibweise
insert into $table set
$_spalte[1][name] = 'mysql_escape_string($_wert[$_spalte[1][name]])',
$_spalte[2][name] = 'mysql_escape_string($_wert[$_spalte[2][name]])',
Bedenke dabei aber, dass das nicht jede DB versteht. IMHO sollte man sich besser die erste Variante angewöhnen.
btw., wie man solche Sachen noch ganz nett machen kann (PEAR::DB): http://pear.php.net/manual/en/package.database.db.intro-auto.php#AEN10611
z.B. so:
<?php
require_once 'DB.php';
$user = 'foo';
$pass = 'bar';
$host = 'localhost';
$db_name = 'clients_db';
$dsn = "mysql://$user:$pass@$host/$db_name";
$db = DB::connect($dsn);
$fields_values = array(
$_spalte[1][name] => $db->quote($_wert[$_spalte[1][name]]),
$_spalte[2][name] => $db->quote($_wert[$_spalte[2][name]])
);
$table_name = 'user';
$db->autoExecute($table_name, $fields_values, DB_AUTOQUERY_INSERT);
?>
Vielleicht kann man den "$fields_values"-Array auch noch einfacher/direkter erzeugen.
Grüße
Andreas
PS: Ab PHP 4.3 wird die Verwendung von mysql_real_escape_string() empfohlen oder eben $db->quote() bei PEAR::DB.
Hi,
INSERT INTO db (fld1, fld2) VALUES (val1, val2)
==========
Den unterstrichenen Ausdruck beziehe ich aus den Formularfeldern, wenn eine Checkbox ohne Häckchen dabei ist, dann hab ich einen Wert zu wenig im Ausdruck.
Du mußt schlicht und einfach auch die Liste der zu setzenden Spalten anhand der gesetzten Checkboxen aufbauen.
cu,
Andreas
tach
ich hab ja von php keine ahnung.
aber ich würde einfach immer alle checkboxen mitschicken und nur die anzeigen die der user will. die andre machste input type="hidden" und schickst nen standartwert mit.<leer> oder sowas.
wär das was??
bye,christian.
Hi!
INSERT INTO db (fld1, fld2) VALUES (val1, val2)
==========Den unterstrichenen Ausdruck beziehe ich aus den Formularfeldern, wenn eine Checkbox ohne Häckchen dabei ist, dann hab ich einen Wert zu wenig im Ausdruck.
Wieso? Du wirst doch hoffentlich nicht irgendsowas wie implode(',',$_POST) verwenden, oder?
Sowas sollte man nicht dynamisch machen, da die POST-Variablen sich Deiner Kontrolle entziehen.
Zunächst validiere die Formulardaten (so exakt wie möglich kontrollieren ob darin das stehst was Du erwartest), und dann mache das etwas so:
$sql = "INSERT INTO db (fld1, fld2) VALUES ('".$_POST['val1']."', '".$_POST['val2']."')";
Wie geht man da vor? - Ich weiß ja nicht wieviele Checkboxen vorhanden sind und an welcher Stelle sie stehen.
Das ist ja auch vollkommen egal. Du wirst doch wohl wissen wie die Checkboxen heißen, entsprechend fomulierst Du Deine Validierungen und das Insert-Statement. Das mag Dir umständlich erscheinen, verhindert aber ne Menge potentieller Fehler und Sicherheitslücken.
Kann mir vorstellen, den "INSERT INTO"-Befehl schon korrekt auf der Formularseite aufzubauen und in einem hidden-Feld zu übergeben, hoffe aber auf etwas gescheiteres von Euch :-).
Das ist so ziemlich das dümmste was Du machen kannst. Angenommen Du schreibst in ein hidden-field "sql" Dein INSERT-Statement, und führst dann im Script direkt $_POST['sql'] aus, na dann nehme ich den editor meiner Wahl, änder das hidden field in ein Textfeld, udn gebe da mal zum Spaß "DELETE FROM tabelle", "DROP DATABASE db", "UPDATE tabelle SET fld1 = 'LUSTIGER SCHERZ'"... und man kann je nach Rchten noch viel miesere Dinge treiben.
Betrachte alles das was vom USER kommt, also alles was in GET, POST und COOKIE steht als "böse", und reduziere das was vom User kommen muss auf ein Minimum. Validiere diese Daten.
Lies mal: http://www.dclp-faq.de/q/q-formular-verarbeitung.html
Viele Grüße
Andreas
Hallo,
Wie geht man da vor? - Ich weiß ja nicht wieviele Checkboxen vorhanden sind und an welcher Stelle sie stehen. Kann mir vorstellen, den "INSERT INTO"-Befehl schon korrekt auf der Formularseite aufzubauen und in einem hidden-Feld zu übergeben, hoffe aber auf etwas gescheiteres von Euch :-).
Danke für alle Antworten, funktioniert ...
Viennamade