Tobi: Verbesserungsvorschlaege DB Query

Hallo,

ich habe gerade eine Datenbankanbindung (Access) mit ASP/VBScript programmiert (mit zu Hilfenahme von Ultradev)...klappt alles einwandfrei (an dieser Stelle Dank ans Forum), allerdings glaube ich, das man da noch was verbessern kann:

1. Die Query wird dynamisch erzeugt. Dafuer kommen mehrere Variablen aus einem HTML Form mit GET...Was sind die Nachteile von GET gegenueber POST? (Sicherheit, Zeichenmenge etc.)

2. Das SQL Statement setze ich wie folgt zusammen: Zuerst definiere ich die Variablen, setze einen Default:

Dim DBRecordset__VarKeywordFrenchTitle
DBRecordset__VarKeywordFrenchTitle = ""
Dim DBRecordset__VarKeywordFrenchTitleTrue
DBRecordset__VarKeywordFrenchTitleTrue = 0
if (Request.QueryString("keyword_french_title") <> "") then DBRecordset__VarKeywordFrenchTitleTrue = 1
if DBRecordset__VarKeywordFrenchTitleTrue = 1 then DBRecordset__VarKeywordFrenchTitle = "AND FRENCH_TITLE LIKE '%" + Replace(Request.QueryString("keyword_french_title"), "'", "''") + "%'"

und wenn aus dem Form etwas kommt, dann wird das SQL Statement um die Variablen erweitert:

SELECT *  FROM Table  WHERE STANAG_NUMBER LIKE '%" + Replace(DBRecordset__VarStanagNumber, "'", "'") + "%' " + Replace(DBRecordset__VarKeywordFrenchTitle, "", "") + " ORDER BY STANAG_NUMBER ASC
Geht das auch einfacher?

3. Und schliesslich ist die Ausgabe der Results in eine IF ... ELSE Bedignung gesetzt:
<% If NOT DBRecordset.EOF Then %>
...
<% Else %>
...
<% End If ' end DBRecordset.EOF %>

um eine "No Results"-Page anzuzeigen, falls keine Records vorhanden
wobei ich aufgrund der bei der Ausgabe genutzten Daten die komplette HTML Ausgabe-Tabelle nochmal unter der ELSE Bedingung auffuehre (nicht nur den TR-Bereich)....Kann man das besser machen?

Das ist das erste mal, dass ich etwas mit ASP und VBScript mache - bin ein n00b - also Bitte um Nachsicht...

Gruss und Danke,
Tobi

  1. Hi,

    Was sind die Nachteile von GET gegenueber POST? (Sicherheit, Zeichenmenge etc.)

    ja, genau: Sicherheit und Zeichenmenge. Wobei zu ersterem gesagt werden muss, dass die Daten trotzdem weiterhin im Klartext durch das Netz geschickt werden müssen.

    Der Unterschied zwischen POST und GET ist, dass bei GET die Daten in der URL transportiert werden, bei POST jedoch im Request-Body stehen. Mehr nicht.

    [...] "AND FRENCH_TITLE LIKE '%" + [...]

    Die ist bewusst, dass ein "LIKE '%xyz%'" so ziemlich das unperformanteste ist, das man einer Datenbank antun kann? Eine solche Anforderung kann sie nicht optimieren; sie muss jeden einzelnen in Frage kommenden Datensatz separat analysieren.

    SELECT *  FROM Table  WHERE STANAG_NUMBER LIKE '%" + Replace(DBRecordset__VarStanagNumber, "'", "'") + "%' " + Replace(DBRecordset__VarKeywordFrenchTitle, "", "") + " ORDER BY STANAG_NUMBER ASC
    Geht das auch einfacher?

    Hm. Wieso meinst Du, dass sei _nicht_ einfach? Ich würde die Replaces weglassen, aber ich kenne mich mit ASP auch nicht aus. Vielleicht hat es seinen Sinn.

    um eine "No Results"-Page anzuzeigen, falls keine Records vorhanden
    wobei ich aufgrund der bei der Ausgabe genutzten Daten die komplette HTML Ausgabe-Tabelle nochmal unter der ELSE Bedingung auffuehre (nicht nur den TR-Bereich)....Kann man das besser machen?

    Ja, logisch. Entweder das IF in den Bereich setzen, welcher individuell ist; oder Platzhalter/Templates/etc. benutzen, XSL einsetzen... der Möglichkeiten gibt es viele.

    Das ist das erste mal, dass ich etwas mit ASP und VBScript mache - bin ein n00b

    Ersteres mag sein, letzteres kaufe ich Dir nicht ab. Du stellst spezifische Fragen, denkst also strukturiert und analysierend, bist ergo lernfähig.

    Cheatah

    --
    X-Will-Answer-Email: No
    1. Hallo Cheatah,

      Hm. Wieso meinst Du, dass sei _nicht_ einfach? Ich würde die Replaces weglassen, aber ich kenne mich mit ASP auch nicht aus. Vielleicht hat es seinen Sinn.

      mir ist es auch erst komisch ins Auge gefallen, macht aber durchaus einen Sinn:

      • beugt SQL Injection vor ... nicht die idealste Art aber dennoch wirkungsvoll.

      thema n00b:

      Ersteres mag sein, letzteres kaufe ich Dir nicht ab. Du stellst spezifische Fragen, denkst also strukturiert und analysierend, bist ergo lernfähig.

      n00bs sind nicht lernfähig? Oh Gott!!!!!

      Viele Grüße aus dem Süden, Frank

      1. Hallo Cheatah und Frank,

        danke fuer eure Tipps. Habe gestern und heute auch was ueber Stored Procedures gelesen, koennte auch sinnvoll sein...

        Hallo Cheatah,

        Hm. Wieso meinst Du, dass sei _nicht_ einfach? Ich würde die Replaces weglassen, aber ich kenne mich mit ASP auch nicht aus. Vielleicht hat es seinen Sinn.

        mir ist es auch erst komisch ins Auge gefallen, macht aber durchaus einen Sinn:

        • beugt SQL Injection vor ... nicht die idealste Art aber dennoch wirkungsvoll.

        Was waere eine idealere Art?

        thema n00b:

        Ersteres mag sein, letzteres kaufe ich Dir nicht ab. Du stellst spezifische Fragen, denkst also strukturiert und analysierend, bist ergo lernfähig.

        Danke...ich sehe das als Kompliment... :)) Habe mich bisher nur mit HTML beschaeftigt, seit Montag erst mit ASP/VBScript...also ist es ein "neues" Gebiet fuer mich (daher meine Bezeichnung n00b - rein von der Abstammung des Wortes und ohne implementierte Wertung), was aber nicht heisst, dass ich dumm bin, nicht logisch denken kann oder nicht lernfaehig bin...;)

        n00bs sind nicht lernfähig? Oh Gott!!!!!

        In meiner Definition des Wortes n00b sind solche Leute lernfaehig!

        Viele Grüße aus dem Süden, Frank

        Gruss aus USA,
        Tobi

        1. Hallo miteinander,

          Stored Procedures (unter MSSQL) ist wahrscheinlich das beste Feature an dem System überhaupt

          1. sicher, weil SPs ausführungsrechte haben können und weil es SQL Injection quasi unmöglich macht

          2. performanter, wesentlich performanter

          3. flexibel über Argumente/Parameter, Daten-Logik bleibt beim DB-Server

          n00bs: nach meiner def eigentlich auch

          n tipp von mir noch: evt. solltest du dich gleich mit .net auseinandersetzen, ASP/VBS wird irgendwann (bald) aussterben, von .net ersetzt werden (ganz im Willen von Bill Gates)

          Viele Grüße aus dem Süden, Frank

          1. Hallo Frank,

            danke fuer diese weiteren Tips...Habe mir gestern schon ein VB .NET Buch besorgt....

            Tobi

            Stored Procedures (unter MSSQL) ist wahrscheinlich das beste Feature an dem System überhaupt

            n00bs: nach meiner def eigentlich auch

            n tipp von mir noch: evt. solltest du dich gleich mit .net auseinandersetzen, ASP/VBS wird irgendwann (bald) aussterben, von .net ersetzt werden (ganz im Willen von Bill Gates)

    1. Das SQL Statement setze ich wie folgt zusammen: Zuerst definiere ich die Variablen, setze einen Default:

    Dim DBRecordset__VarKeywordFrenchTitle
    DBRecordset__VarKeywordFrenchTitle = ""
    Dim DBRecordset__VarKeywordFrenchTitleTrue
    DBRecordset__VarKeywordFrenchTitleTrue = 0
    if (Request.QueryString("keyword_french_title") <> "") then DBRecordset__VarKeywordFrenchTitleTrue = 1
    if DBRecordset__VarKeywordFrenchTitleTrue = 1 then DBRecordset__VarKeywordFrenchTitle = "AND FRENCH_TITLE LIKE '%" + Replace(Request.QueryString("keyword_french_title"), "'", "''") + "%'"

    Ich finde das ausgesprochen unübersichtlich. Ich würde zuerst
    das Ergebnis des Replace(..) in eine Varialbe schreiben und dann das Select ausführen. Ist aber nur eine Stilfrage. Nur glaube ich da blickst Du in einem halben Jahr selber nicht mehr durch!

    und wenn aus dem Form etwas kommt, dann wird das SQL Statement um die Variablen erweitert:

    SELECT *  FROM Table  WHERE STANAG_NUMBER LIKE '%" + Replace(DBRecordset__VarStanagNumber, "'", "'") + "%' " + Replace(DBRecordset__VarKeywordFrenchTitle, "", "") + " ORDER BY STANAG_NUMBER ASC
    Geht das auch einfacher?

    Siehe oben! Dann ist das tatsächlich einfach!

    1. Und schliesslich ist die Ausgabe der Results in eine IF ... ELSE Bedignung gesetzt:
      <% If NOT DBRecordset.EOF Then %>
      ...
      <% Else %>
      ...
      <% End If ' end DBRecordset.EOF %>

    Ich würde eher schreiben:
    <% If DBRecordset.BOF and DBRecordset.BOF Then %>
     ' das heisst nichts gefunden!
    ....

    um eine "No Results"-Page anzuzeigen, falls keine Records vorhanden
    wobei ich aufgrund der bei der Ausgabe genutzten Daten die komplette HTML Ausgabe-Tabelle nochmal unter der ELSE Bedingung auffuehre (nicht nur den TR-Bereich)....Kann man das besser machen?

    Was ist der TR-Bereich?
    Ich verstehe nicht ganz, was Du willst und wo Du eine Ausgabe 2x brauchst.
    Wenn das aber nicht zu umgehen ist, dann schreibe die HTML-Seite in eine Funktion!

    Das ist das erste mal, dass ich etwas mit ASP und VBScript mache - bin ein n00b - also Bitte um Nachsicht...

    Immerhin benutzt Du kein Frontpage :-)

    Gruss und Danke,
    Tobi

    Gruß
    Susanne

    1. Hallo Susanne,

      Ich finde das ausgesprochen unübersichtlich.

      Jep, deshalb hatte ich gefragt...allerdings hatte ich versucht, das replace zu umgehen, aber dummerweise kommt dann der Recordcounter nicht mehr damit zurecht....uebergibt dann einen Wert '%wert, wert%' statt '%wert%'....

      1. Und schliesslich ist die Ausgabe der Results in eine IF ... ELSE Bedignung gesetzt:
        <% If NOT DBRecordset.EOF Then %>
        ...
        <% Else %>
        ...
        <% End If ' end DBRecordset.EOF %>

      Ich würde eher schreiben:
      <% If DBRecordset.BOF and DBRecordset.BOF Then %>
       ' das heisst nichts gefunden!
      ....

      Okay, das ist sinnvoll....

      Was ist der TR-Bereich?

      TR-Bereich - damit meinte ich die Zeile der HTML-Tabelle, in der die Ergebnisse ausgegeben werden (<tr> Tag)...

      Das Problem ist, das die Repeat Region und der Record Counter einen Fehler ausgeben, wenn DBRecordset.EOF = True.... normalerweise wuerde man dann nur die Zeile in die if ...else Bedignung setzen, so muss ich aber die gesamte Table mit der if ...else Bedignung  umschliessen...

      Ich verstehe nicht ganz, was Du willst und wo Du eine Ausgabe 2x brauchst.
      Wenn das aber nicht zu umgehen ist, dann schreibe die HTML-Seite in eine Funktion!

      Das hoert sich gut an...

      Das ist das erste mal, dass ich etwas mit ASP und VBScript mache - bin ein n00b - also Bitte um Nachsicht...

      Immerhin benutzt Du kein Frontpage :-)

      Ich muss zugeben, ich habs versucht, aber ich mag es net, wenn ich den Code nicht sehen kann und nur diesen Microsoft Schrott....wie soll man da etwas verstehen und Aenderungen durchfuehren?!?

      Gruss und Danke,
      Tobi
      Gruß
      Susanne

      Gruss

      Tobi