Rolf B: ASP MSAccess - input type file - wert in DB nicht ändern, wenn nichts verändert

Beitrag lesen

Hallo supernewb,

was tut man nicht alles für SelfHTML - sogar ASP lernen 😂

Ich schreibe jetzt ein paar Sachen mehr auf, um Dir etwas mehr Verständnis zu verschaffen.

Aaalso - Request.Form("...") liefert ein sogenanntes IStringList Objekt. Dieses Objekt kann im Prinzip drei Dinge: (1) Sagen, wieviele Einträge drin sind, (2) den i-ten Eintrag liefern und (3) einen Enumerator liefern.

Um herauszufinden, ob ein <input name="foo"> gepostet wurde, verwendest Du die erste Eigenschaft - sie heißt Count

IF Request.Form("foo").Count > 0 THEN
   ist da
ELSE
   ist nicht da
ENDIF

Um auf beispielsweise den ersten Eintrag zuzugreifen, verwendest Du - um ganz korrekt zu sein - die zweite Eigenschaft:

fooWert = Request.Form("foo")(1)

Nun ist es aber auch noch so, dass VBScript zwei Arten der Zuweisung unterscheidet: Wertezuweisung und Objektzuweisung. Wertezuweisung passiert immer, wenn Du nichts anderes sagst, das letzte Beispiel macht also eine Wertezuweisung.

Und wenn man ein Objekt per Wertezuweisung bewegt, können interessante Dinge passieren. Im Fall einer IStringList wird sie in einen String konvertiert! Deswegen funktioniert es problemlos, wenn man das (1) weglässt und schreibt:

fooWert = Request.Form("foo")
Response.Write(Typename(fooWert))   ' String

Würde es das Feld foo zweimal im Form geben, würde diese Konvertierung beide Feldinhalte zusammenkleben. Angenommen, im einen Feld steht "A" und im anderen steht "B", dann wäre nachher der String "A, B" in fooWert.

Um die IStringList in eine Variable zu bekommen, muss man die Objektzuweisung verwenden. Die bekommt man mit dem SET Befehl:

SET fooWert = Request.Form("foo")
Response.Write(Typename(fooWert))   ' IStringList

Wenn Request.Form("foo").Count den Wert 0 liefert, kann das verschiedene Gründe haben.

  1. Die Seite wurde als GET-Request abgerufen und nicht durch Absenden des Form gepostet. In diesem Fall gibt es keinen POST-Body und logischerweise sind alle Form-Werte leer. Diesen Fall erkennst Du aber besser über Request.ServerVariables("REQUEST_METHOD") = "GET"
  2. Es gibt kein Eingabefeld mit name="foo" im Form
  3. Es gibt einen Button dieses Namens und der Button wurde nicht zum Senden des Forms verwendet
  4. Es gibt Checkboxen oder einen Radiobuttons dieses Namens, aber nichts davon war checked.

Was heißt das jetzt für Dich?

  • Um zu erkennen, ob jemand beim POST eine Datei ausgewählt hat, ist die Prüfung auf einen Leerstring richtig.
  • Deine MM_IIF Funktion könntest Du in eine MM_NichtLeer Funktion umbenennen und so aufbauen:
FUNCTION MM_NichtLeer(a, b)
   IF IsNull(a) OR a = "" THEN MM_NichtLeer = b ELSE MM_NichtLeer = a
END FUNCTION

Du musst dann den ersten Parameter nicht immer doppelt übergeben (was ich derzeit ständig bei Dir sehe).

  • Deinen Werteretter für den Dateinamen könntest Du über
    MM_NichtLeer(Request.Form("Rechnungspfad"), RequestForm("RechnungspfadALT"))
    realisieren

Was allerdings nicht dauerhaft funktionieren wird, ist das Speichern des vollständigen Pfades. Das ist eine Eigenschaft des Internet-Explorers, und der ist tot, tot, tot. Es ist nicht sinnvoll, eine Anwendung zu erstellen, die bestimmte Eigenschaften des IE voraussetzt. Und das Übermitteln des Pfades bei einem Upload gehört dazu. Das ist ein schweres Sicherheitsloch im IE und alle anderen Browser geben sich größte Mühe, den Pfad zur Datei vor der Webanwendung zu verstecken!

Quellen (alles englisch)

Rolf

--
sumpsi - posui - clusi