Hallo, Jean,
Ich bin davon ausgegangen, dass es für dich bequemer sei,
sie direkt per Email zu senden, damit du nicht jedes Mal
nach meinem alten Thread suchen musst.
Nee, macht mir nicht aus, ich lese auch und vor allem in alten Threads und Antworten auf meine Beiträge lese und beantworte ich sofort (Suche mit Strg+F oder F3 - da muss ich nicht lange manuell suchen).
Die Variante mit 2 Inputs, die du persönlich noch besser findest,
halte ich eher für unübersichtlich. Darüber hinaus wird es dann
ständig vorkommen, dass jemand beide Inputs ausfüllt, was
meine vorgegebene Datenbank leider nicht unterstützt.
Damit müsstest du rechnen; das Script muss, wie gesagt, die jeweils zweite überflüssige Eingabe verwerfen und/oder eine Warnung anzeigen, dass nur ein Feld ausfüllbar ist. So funktioniert es bei meinen Formularen recht gut - wenn man die Sucheingaben zeitweilig loggt, kann man das Benutzerverhalten gut analysieren und gegen häufige Fehler vorgehen.
Es ist übrigens tatsächlich so, dass sich die Datei "abfrage.csv"
ich selben Verzeichnis befindet. Ich kann jedoch nicht nach-
vollziehen, inwiefern das ein Sicherheitsproblem darstellt
Ganz einfach: ich weiß nicht, welche Daten deine Datenbank enthält. Wenn sie beispielsweise halböffentliche Telefonnummern, Email-Adressen oder Postadressen etc. enthält, welche besser nur eingeschränkt über eine Suche zugänglich sein dürfen (man findet nur etwas, wenn man sowieso schon weiß, nach was man suchen muss), würde ich sie keinesfalls zum Download freigeben beziehungsweise ungesichert im selben Verzeichnis speichern, sodass sie *komplett* heruntergeladen werden kann, um möglicherweise die Daten zu missbrauchen. So gesehen ist es eher ein Problem des Datenschutzes/der Privatshäre als der Sicherheit, wobei das eine das andere einschließt.
was du mit "im Skript hartkodieren" meinst.
Du übergibst den Namen der Datenbankdatei über das Formular, daraus schließe ich, dass dieser Dateiname variabel ist, das heißt, durch einen anderen Parameter würde das Script eine andere Datei einlesen und durchsuchen. »Im Skript hartkodieren« bedeutet, dass du diesen Dateinamen als Konstante (oder Variable, welche nicht durch GET-, POST-, Cookie-, Umgebung- oder sonstige Parameter geändert wird/werden kann) fest in dem Script definierst, sodass der Parameter unnötig ist (und das Script nur mit dieser einen Datenbank funktioniert).
Zumindest ist es unklug, dass du a) den Dateinamen im Klartext und voll lesbar als verstecktes Eingabefeld definierst und b) die Datenbankdatei im selben Verzeichnis liegt und c) die Datenbank öffentlich über den HTTP ohne Zugangsbeschränkung lesbar ist - aus den oben genannten Gründen.
Generell solltest du einem möglichen Angreifer so wenig wie möglich über die Funktionsweise deiner Serveranwendung verraten, um Missbrauch im Keim zu ersticken.
Im Skript fragst du einfach ab, welchen Wert der Parameter
»suchmethode« hat und behandelst entsprechend - natürlich
nach vorheriger Prüfung - den Parameter »suchabfrage«
entweder als Ortsnamen oder Datum....Stopp! Das habe ich jetzt doch nicht ganz verstanden.
Es wäre nett, wenn du mir da noch auf Sprünge helfen
könntest.
Noch einmal zur Verdeutlichung die beiden Radiobuttons, verkürzt:
<input type="radio" name="suchmethode" value="datum" ... /> ...
<input type="radio" name="suchmethode" value="ort" ... /> ...
Beim Absenden des Formulars wird über die HTTP-Anfrage ein Parameter namens »suchmethode« übergeben. Da du in deinem HTML-Code im Ursprungsposting die POST-Methode angegeben hattest, gehe ich von der Übermittelungsmethode POST aus. Bei der GET-Methode kann man die Parameter in der URL sehen, bei POSR befinden sich die Parameter ähnlich aufgeteilt im Körper der Abfrage, hier aber zur Veranschaulichung die in der Adresse übermittelten GET-Parameter nach dem Ausfüllen und Absenden des Formulars:
/cgi-bin/db.pl?db=abfrage.csv&suchmethode=datum&suchabfrage=abfragetext
Im Beispiel wurde über die Radio-Auswahl die Suchmethode Datum angegeben, weshalb der Parameter »suchmethode« auf »datum« gesetzt ist (dieser Wert findet sich im value-Attribut des zugehörigen input-Elements wieder, siehe oben). Als Abfragetext wurde in das Texteingabefeld »abfragetext« eingegeben. Aufgrund des versteckten Eingabefelds »db« wurde für diesen Parameter der Wert »abfrage.csv« übermittelt.
Wie du den Abfragetext in deinem Script über das CGI in Erfahrung bringst und ihn verwertest, dürftest du schon wissen, das geht meines Wissens über das Perlmodul CGI (reine Mutmaßung - siehe http://selfhtml.teamone.de/cgiperl/module/cgi.htm), mit Perl kenne ich mich aber nicht aus. Im Grunde genommen musst du genauso mit dem Parameter »suchmethode« verfahren, nämlich diesen aus den POST-Parametern entnehmen. Naheliegend ist natürlich, dass du mit checked="checked" eine Option vorauswählst, damit der Parameter in jedem Fall gesetzt wurde. Der Parameter sollte, damit du ihn weiterverwenden kannst, entweder den Wert »datum« oder den Wert »ort« besitzen, falls dies nicht der Fall ist, muss das Script abbrechen und eine Fehlermeldung ausgeben beziehungsweise das Formular erneut anzeigen.
Der Ablauf (eines Teils) des Programms sähe verkürzt ungefähr folgendermaßen aus:
Bedingte Anweisung mit der Bedingung:
Wurden die Parameter »db«, »suchmethode« und »abfragetext« übermittelt und sind alle drei nicht leer?
Falls Nein: Breche die Suche ab und zeige das Formular, denn es wurden das Script wurde ohne Parameter aufgerufen.
Falls Ja:
[Hier spare ich mir die Überprüfung der Existenz von der in »db« angegebenen Datei.]
Bedingte Anweisung mit der Bedingung:
Hat der Parameter »suchmethode« den Wert »datum«?
Falls Ja: Speichere, dass die Suchmethode »datum« ist
Falls Nein:
Bedingte Anweisung mit der Bedingung:
Hat der Parameter »suchmethode« den Wert »ort«?
Falls Ja: Speichere, dass die Suchmethode »ort« ist.
Falls Nein: Breche die Suche ab, zeige eine Fehlermeldung, dass die Parameter fehlerhaft waren und zeige erneut das Formular.
(Natürlich sind die Verschachtelungen suboptimal, aber es soll auch nur ein theoretisches Flussdiagramm sein.)
Die Syntax des Abfragetexts solltest du natürlich auch überprüfen (falls suchmethode=datum, dann musst du überprüfen, ob der Abfragetext ein gültiges Datum ist), aber hier geht es vorerst um die Radiobuttons. Nachdem du anhand des Parameters »suchmethode« bestimmt hast, welche Suchmethode der Benutzer gewählt hat, kannst du anhand dessen die Datenbankabfrage führen - wie du das realisierst, ist mir unbekannt, weshalb ich dazu nichts sagen kann. Falls »suchmethode« gleich »ort« ist, musst du natürlich alle Orts-Felder durchsuchen und falls »suchmethode« gleich »datum« ist, alle Datums-Felder... das dürfte klar sein.
Ich könnte noch weiter ausholen, aber das wird dann zu generell, dshalb frage besser noch einmal punktuell nach, anstatt »erkläre mir das alles mal«. ;) Ich weiß ja nicht, was du schon weißt und wo es noch hapert.
Im besten Fall sollte dein Script auf alle Eventualitäten und Fehleingaben eine »passende Antwort« haben, das heißt eine hilfreiche Fehlermeldung oder ähnliches. Dies erreichst du meist durch haarkleines Überprüfen aller an das Script von außen übergebenen Daten.
Bei der Abfrage meines Formulars passiert nämlich momentan
garnichts. Ich vermute, dass hängt damit zusammen, dass es
garnicht weiss, nach welchen Kriterium der Radio-Buttons es
nun suchen soll.
Wie bitte...? Moment mal. Dass du das Script erst auf das neue Formular und die Parameterbehandlung anpassen musst, dürfte klar sein. Aber was meinst du mit »nach welchen Kriterium der Radio-Buttons es nun suchen soll«? Die Radio-Eingabefelder sind nur insofern interessant für das Script, da sie dafür verantwortlich sind, dass beim Absenden des Formulars ein Parameter »suchmethode« mit dem Wert »ort« oder »datum« übergeben wird. Die gilt es aus den POST-Parameter auszulesen und im Script weiterzuverwenden.
Ich kann nämlich keinen direkten Zusammen hang zwischen den Radiobuttons und dem Input erkennen.
Da besteht auch kein Zusammenhang (wie ich dich verstehe), es werden einfach anstatt zwei Parameter generiert, zum einen für die mehreren Radiobuttons mit gleichem name-Attribut (»suchmethode«) und zum anderen für das Texteingabefeld (<input type="text" name="suchabfrage" ... />).
Den Zusammenhang musst du im Script herstellen: Falls die eine Suchmethode gewählt wurde, musst du den Abfragetext als Datum interpretieren, für den anderen Fall als Ortsname. Ohne zu prüfen, welche Suchmethode verwendet werden soll, kannst du bei *einem* Eingabefeld nicht entscheiden, ob du den Suchstring als Datum oder Ortsnamen behandeln musst...
Wie man diese Verbindung herstellen kann, wolltest du mir
vermutlich in deinem Absatz erklären, oder?
Ja... so ungefähr, sofern wir vom selben reden.
Vielleicht kannst du das mal anhand der Angaben "Ort" und
"Datum" machen?
Siehe oben... Im Grunde genommen ist es recht einfach, da du nur auf zwei verschiedene Eingaben reagieren muss und dementsprechend der Verlauf des Scripts zwei unterschiedliche Wege nehmen muss (Suche nach Ort *oder* Datum).
Grüße,
Mathias
Mein Leben, ein Leben ist es kaum, / Ich gehe dahin als wie im Traum.
Wie Schatten huschen die Mensch hin, / Ein Schatten dazwischen ich selber bin.
Und im Herzen tiefe Müdigkeit - / Alles sagt mir: Es ist Zeit ...
(Theodor Fontane, Mein Leben)