![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Corvin Gröning Registriert seit: 19.03.2005 Ort: S-H | Flensburg
Beiträge: 459
|
Wenn ich ein Formular habe, mit welchem ich einen Eintrag aus einer Datenbank bearbeite gibt es zwei Möglichkeiten, die ID des Eintrags an das Skript, das den Eintrag wieder speichert, zu übergeben. Zum einen über das action-Attribut: HTML-Code: <form name="edit_entry" method="post" action="save.php?id=$id"> ... </form> HTML-Code: <input type="hidden" name="id" value="$id" /> Daher meine Frage: Welcher Möglichkeit sollte ich den Vorzug geben? Wenn ich die ID in das action-Attribut mit reinschreibe, erspart mir das natürlich etwas Tipparbeit, aber spricht evt. etwas dagegen?
__________________ |
| | |
| | Nach oben #2 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 687
|
Ich denke, dass es Geschmackssache ist. Ich für meinen Teil habe jedenfalls die zweite Variante gewählt, obwohl ich dabei auch etwas anders verfahre: Alle relevanten, vom Benutzer nicht zu ändernden Daten, speichere ich in der Session in einem Array, der als Key einen MD5-Hash eines microtime() nutzt. Diesen Key schreibe ich dann in das Hidden-Feld und somit bin ich etwas sicherer vor Manipulationen von Außen und der User weiß nicht, welche Informationen ich alles in der Session zurückhalte, die für die Anfrage notwendig sind. Vielleicht ist das ja auch ein Lösungsansatz für dich!?
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #3 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.374
|
Auch wenn durch deinen Ansatz nicht mehr Sicherheit gewonnen sein sollte, so ist es zumindest nicht auf Anhieb erkennbar und leicht den Wert zu manipulieren.
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |
| | Nach oben #4 |
| Benutzer Registriert seit: 15.07.2008 Ort: MD
Beiträge: 37
|
Der an das Actipn angehängte Wert wird doch als GET ausgewertet, oder? Wenn dein Formular nun per POST übermittelt wird, hast du ein Gemisch beider Methoden. Nimst du ein Hidden Feld, wird dein Wert jeweils passend in den Request eingebaut.
__________________ <Shadda> Explaining the concept of referential integrity to a mysql user is like explaining condoms to a catholic European PostgreSQL User Group |
| | |
| | Nach oben #5 | ||
| Corvin Gröning Registriert seit: 19.03.2005 Ort: S-H | Flensburg
Beiträge: 459
| Zitat:
Es ist mir egal, ob der Benutzer dann sehen kann, welche Daten ich vor ihm "verstecke", denn ich will ja garnichts verstecken, sondern nur bestimmte Daten, die für den Benutzer nicht relevant sind, im Browser nicht anzeigen. Zitat:
Mir ist soeben noch eingefallen, dass es auch mal sein kann, dass ich mehr Werte als nur eine ID versteckt übergeben will und dann wäre es ja nicht sinnvoll, das alles ins action-Attribut mit einzubauen, da dann die Übersichtlichkeit des Quellcodes leiden würde. Ich habe mich daher dazu entschieden, die ID immer über ein verstecktes Input-Feld zu übergeben. Danke für die Antworten.
__________________ | ||
| | |
| | Nach oben #6 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.374
|
Aber gerade, wenn da noch mehr Daten übergeben werden sollen finde ich den Lösungsansatz von MrNiceGuy gut. Da hast du nur ein einziges verstecktes Feld - aber die übergebenen Daten sind somit referenzierbar. Außerdem hat es den Vorteil, dass weniger Daten hin- und her geschoben werden müssen.
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |
| | Nach oben #7 |
| Corvin Gröning Registriert seit: 19.03.2005 Ort: S-H | Flensburg
Beiträge: 459
|
Nunja.. also im Moment greife ich so auf der Werte zu: PHP-Code: Aber wie gesagt, im Moment ist es sowieso überall nur die ID, die übergeben wird. Wenn es dann mal mehr sein wird, werde ich mir nochmal genauer Gedanken dazu machen. Bis dahin verwende ich ein versteckes Input-Feld.
__________________ |
| | |
| | Nach oben #8 | |
| Benutzer Registriert seit: 15.07.2008 Ort: MD
Beiträge: 37
| Zitat:
Wenn man die Daten jeweils durch alle Formulare mit hindurchreicht, muss man alle (wichtigen) Daten bei jedem Zugriff erneut überprüfen. Nur viele Leute vergessen das gern ... ist halt Aufwand.
__________________ <Shadda> Explaining the concept of referential integrity to a mysql user is like explaining condoms to a catholic European PostgreSQL User Group | |
| | |
| | Nach oben #9 |
| Corvin Gröning Registriert seit: 19.03.2005 Ort: S-H | Flensburg
Beiträge: 459
| Das ist bei mir ja nicht der Fall. Ich habe zwar mehrere Formulare, aber die haben miteinander nichts zu tun. Daher denke ich, dass ein verstecktes Input-Feld zur Zeit ausreicht.
__________________ |
| | |
| | Nach oben #12 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 687
|
OK, ich versuche das "mal eben" etwas näher zu erläutern: Einem PHP-Script wird zum Beispiel die ID eines Beitrags übermittelt, der editiert werden soll. Was das für ein Beitrag ist spielt erstmal keine Rolle. Damit es nicht zu kompliziert wird nehme ich jetzt einfach an, dass die ID im GET-Parameter "integerUid" steckt (z.B. http://www.domain.tld/script.php?integerUid=123). Das Script "versteckt" diese ID nun in der Session mittels eines zufallsgenerierten Schlüssels: PHP-Code: Code: <form method="post" action="script.php"> <input type="hidden" name="stringValidationKey" value="<?php echo $stringKey;?>"/> <!-- Hier die weiteren Formular-Felder, die editiert werden sollen (in einem Forum z.B. "Thema" und "Text") --> <input type="submit" name="buttonSend" value="Speichern"/> </form> Nun ist es so, dass nur die Daten, die geändert werden dürfen auch übergeben werden und halt der Key, der auf das Array zeigt, welches die nicht zu ändernden Variablen enthält (im Beispiel nur die Uid). Das Script, das jetzt aufgerufen wird greift dann wie folgt darauf zurück: PHP-Code: Falls du noch fragen hast: Frag
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #13 |
| neugieriger PHP-Anfäger Registriert seit: 16.08.2008 Ort: Mecklenburg-Vorpommern
Beiträge: 45
|
Hallo, danke für deine ausführliche Antwort! Doch ein paar Fragen habe ich dennoch. IntergerUID - ist das eine Funktion oder hast du das jetzt einfach so genannt? Normalerweise nenne ich meine IDs nur "ID", darum frage ich. Deine While-Schleife im ersten Codeschnipsel ergibt für mich keinen Sinn, was soll denn da so lange getan werden? Mir ist schon klar: So lange diese Daten existieren, ist diese Schleife wahr, ... ja und? Was passiert als nächstes? Zu der Zeile wo steht //Setzen der Variablen: mit => weißt du einem bestimmten Arraykästchen einen bestimmten Wert zu? (Anfängerfrage! DAnke! |
| | |
| | Nach oben #14 |
| Lutz Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 687
|
Ich nenne meine Variablen immer erst mit der Art des Inhaltes, den die Variable haben soll ("string", "integer", "boolean", etc.). Es ist also einfach nur ein Integer, der in "integerUid" enthalten sein soll Die While-Schleife wird im Idealfall nur ein Mal durchlaufen, aber sollte es - aus welchen Gründen auch immer - den Key bereits geben, wird die Schleife noch ein zweites, drittes, x-tes Mal durchlaufen, bis ein Key generiert wurde, den es noch nicht gibt. Die Wahrscheinlichkeit, dass es mehr als ein Mal durchlaufen werden muss ist sehr gering, aber für diesen 1 zu 10 Milliarden-Fall ist es denke ich nicht verkehrt ihn einzubauen. Kostet ja nun nicht so wirklich viel Rechenleistung Falls dir einfach das do { ... } while (); nur kein Begriff ist, dann solltest du dir das mal im PHP-Manual anschauen! Ich bin zwar nicht mehr 100%ig sicher, ob die Bezeichnung "Fußgesteuerte Schleife" richtig ist, aber dieses Konstrukt ist in manchen Fällen ganz sinnvoll, wie in dem Beispiel oben halt Mit der Funktion array() erstellst du eine Variable mit einem Array als Inhalt. Du hast die Möglichkeit einfach Werte mit Komma getrennt zu übergeben, dann hast du hinterher ein Array mit numerischen Schlüsseln von 0 bis x (x = Anzahl der Elemente im Array - 1). Du kannst aber auch assoziative Arrays erstellen, bei denen du mit einem String-Schlüssel auf einen Wert zugreifst, was in den meisten Fällen deutlich einfacher ist. In diesem Fall erfolgt dann die Übergabe in array() mittels " 'key' => 'wert' ", statt einfach nur " 'wert' ". Zugreifen kannst du darauf dann über $arrayDiesIstDeinArray['key'].
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| | |
| | Nach oben #15 |
| Neuer Benutzer Registriert seit: 03.05.2008
Beiträge: 12
|
@MrNiceGuy, kannst du mir erklären, warum du das ganze nicht einfach in eine Session-Variable speicherst? Dann kann man sich doch die ganze Übergabe per Formular sparen, oder habe ich da jetzt einen Denkfehler? Gruß Chrunchy
__________________ Gruß Chrunchy |
| | |
| | Nach oben #16 | |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 853
| Zitat:
Beispiel: Du setzt sowas um, um einen Suchagenten einzurichten. Der benutzer ist gerade dabei und hat damit implizit das Feld $_SESSION['search'] gesetzt. Jetzt will er nochmal was nachschauen und offnet deine Site nochmal im neuen Tab und dort wird das Standard-Suchfeld angezeigt, dass dir $_SESSION['search'] vielleicht wieder durch einen leeren String überschreibt. Geschickter ist es, für sowas z.B. ein Wizard-Objekt zu erzeugen, das die entsprechenden Daten, sowie einen Status sammelt und dann eben unter einer bestimmten ID in die Session gelegt wird. So wird auch deutlicher, dass es sich um eine Einheit unterschiedlicher Daten (Benutzereingaben) handelt. Wichtig ist hier (wie natürlich auch generell), zu gewährleisten, mögliche CSRF-Angriffe zu verhindern. so könnte z.B. ein Benutzer ohne die entsprechenden Rechte eine solche Session mit den entsprechenden Daten fällen und dem Admin einen Link unterjubeln, auf diese Session aufzuspringen und dann, ohne es zu merken den Mist auszuführen, der ihm da untergejubelt wurde. Also immer gucken, wie die daten in die Session kommen und natürlich beim ersten Request keine vorgefertigten SIDs übernehmen, sowie beim Statuswechsel (z.B. Log-In) eine neue Session mit neuer SID starten und nur (wenn überhaupt) die relevanten Daten rüberkopieren. Bastian | |
| | |
| | Nach oben #18 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 853
|
Schlingel? Sollte mir mal passieren, dass ich morgens ins Büro komme und der ganze Mist schon runtergeschrieben wäre! (Äh nein, ich steh grad auf meine Arbeit – gibt ja auch Zeiten, in denen es mal nicht so Spaß macht…-) Bastian |
| | |
| | Nach oben #19 | |
| neugieriger PHP-Anfäger Registriert seit: 16.08.2008 Ort: Mecklenburg-Vorpommern
Beiträge: 45
|
@ Mr.Niceguy, ich glaube ich hab das Script soweit erst mal verstanden. Bastis Posting hat mein Verständnis dann aber schon wieder völlig über den Haufen geschmissen Zitat:
Was sind Wizardobjekte? Extrascriptsprachen oder eine bestimmte PHP Technik? Danke euch beiden! | |
| | |
| | Nach oben #20 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 853
|
Diese Technik setzt man ja dann ein, wenn man mehrere Formulare hintereinander an den Benutzer schickt. Das kann ein Wizard sein oder z.B. ein Quiz, eine Befragung etc. In dem Fall macht es ja Sinn, dieses „Etwas“ als Obekt abzubilden, das man dann eben in die Session legt. Bastian |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |