Ankündigung

Einklappen
Keine Ankündigung bisher.

Dynamische SQL-Abfrage mit Requestwert

Einklappen
X

Dynamische SQL-Abfrage mit Requestwert

Einklappen
  • Filter
  • Zeit
Alles löschen
neue Beiträge

  • Dynamische SQL-Abfrage mit Requestwert

    Hallo,
    auf einer Eingabeseite habe ich ein Eingabefeld, eine Ansichtstabelle und eine VTL Include, die mit einem Velocity-Script versehen ist.
    Das Eingabefeld heißt ProjektNr und sollte veränderbar sein, allerdings :
    Die Abfrage findet nur dann fehlerfrei statt, wenn ich das Eingabefeld nicht mit einbeziehe, sondern eine feste Zahl als PNr im Script definiere.

    #set($PNr = 5129)
    #set($abfrage = $PreparedQuery.prepare($DbConnection,"SELECT count(*), STR_TRAD FROM XDATAGROUPE28928E212
    WHERE L_PROJEKTNUMMER=$PNr GROUP BY STR_TRAD"))

    sobald ich allerdings die PNr aus einem Request versuche zu übernehmen, kommt es ständig zu einer Fehlermeldung

    #set($PNr=$Request.get("textcontrol9430AA63"))
    oder
    #set($PNr = $DC.getValueHolder("textcontrol9430AA63").Value)
    oder auch
    #set($PNr=$Request.get("rq_ProjektNr"))

    in Verbindung mit

    #set($abfrage = $PreparedQuery.prepare($DbConnection,"SELECT count(*), STR_TRAD FROM XDATAGROUPE28928E212
    WHERE L_PROJEKTNUMMER=$PNr GROUP BY STR_TRAD"))

    funktionieren nicht, obwohl ich den Requestwert vorher definiert hatte:

    rq_ProjektNr $drRecord.getValueHolder('textcontrol9430AA63').ge tValue()

    was mach ich falsch, oder ist es nicht möglich die Request-Werte in VTL zu übernehmen?

  • #2
    Also Werte aus Eingabefeldern oder gar einem Request sollten nie nie nie nie nie nie nie nicht direkt in SQL-Statements eingebunden werden.
    Das öffnet Angreifern(Hackern) Tür und Tor.

    Richtig ist die Verwendung von Platzhaltern (?)
    Bspw. so:
    Code:
    #set($abfrage = $PreparedQuery.prepare($DbConnection,"SELECT count(*), STR_TRAD FROM XDATAGROUPE28928E212
    WHERE L_PROJEKTNUMMER=? GROUP BY STR_TRAD"))
    $abfrage.setInt(1, $PNr)
    Die andere Frage ist jetzt wie man sicherstellt, dass $PNr auch eine Zahl ist.
    Ein Request kennt ja keine Datentypen wie Integer, Float oder Date.
    Dafür gibt es unser Kontextobjekt $TextUtil http://docs.intrexx.com/intrexx/vers.../TextUtil.html

    Code:
    #set($PNr = $TextUtil.parseLong($Request.get("rq_ProjektNr"))
    oder
    Code:
    #set($PNr = $TextUtil.parseLong($DC.getValueHolder("textcontrol9430AA63").getValue())
    Komplett also so:
    Code:
    #set($PNr = $TextUtil.parseLong($Request.get("rq_ProjektNr"))
    #set($abfrage = $PreparedQuery.prepare($DbConnection,"SELECT count(*), STR_TRAD FROM XDATAGROUPE28928E212
    WHERE L_PROJEKTNUMMER=? GROUP BY STR_TRAD"))
    $abfrage.setInt(1, $PNr)
    Nun kann es sein, dass der Requestwert keine gültige Zahl ist und es zu einem Fehler kommt, aber immerhin ist die Datenbank vor Angriffen geschützt ;-)

    Kommentar


    • #3
      Hallo Martin,
      danke Martin für deine Antwort. Das mit den Hackerangriffen ist mir bewusst. Da ich zur Zeit aber im Testportal arbeite, das keine Internetanbindung besitzt, experimentiere ich ein wenig mit allem Möglichen, vor allem dann, wenn ich keinen banalen Request nicht übermittelt bekomme.

      Dein Vorschlag bringt mich leider nicht weiter, außer dass ich keine Fehlermeldung kriege.
      Das Eingabefeld ProjektNr hat bereits beim Aufbau der Seite eine feste Vorgabe und liefert trotzdem über die Expert-Eigenschaften

      -> (ATTRIBUT:rq_ProjektNr WERT: $DC.getValueHolder('textcontrol9430AA63').getValue () oder $drRecord.getValueHolder('textcontrol9430AA63').ge tValue() )

      kein Wert an die VTL, egal was ich für ein Lösungsvorschlag von dir verwende.

      #set($PNr = $TextUtil.parseLong($Request.get("rq_ProjektNr"))
      bzw.
      #set($PNr = $TextUtil.parseLong($DC.getValueHolder("textcontro l9430AA63").getValue())

      Kommentar


      • #4
        Also evtl. verstehe ich das jetzt richtig.
        Du hast eine EIngabeseite mit einem Eingabefeld "ProjektNr". Der Wert der ProjektNr wird vorgegeben.
        Wenn der User auf Speichern klickt, wird der Wert aus dem Eingabefeld per Request-Wert + $DC... an die Zielseite übertragen und dort weiterverarbeitet.
        Leider kommt aber nicht der Wert im Ziel an, sondern "$DC..."

        Das ist nicht weiter verwunderlich. $DC... ist Velocity und wird beim Laden der Seite serverseitig ausgeführt. $DC beinhaltet die Werte der Eingabe-/Ansichtsfelder die zum Zeitpunkt des Ladens in der Datenbank stehen. Bei einem neuen Datensatz ist da natürlich noch nichts drin.
        Bei einem bestehenden Datensatz ist das dann aber was anderes.

        Hast du mal geprüft, ob der Wert tatsächlich im Request vorhanden ist? Im Browser kannst du mit F12 die Entwicklerkonsole öffnen und dort u.a. im Reiter Netzwerk/Netzwerkanalyse die abgesendeten Requests samt Parameter betrachten.

        Kommentar

        Lädt...
        X