Passwortabfrage
Ralf Rummert
- asp.net
Hi,
ich habe ein Problem bei einer Passwortabfrage, vielleicht könnt Ihr mir da ja mal weiterhelfen!
Der Code sieht so aus :
In der Datenbank gibt es die Spalte "user" und die Spalte "pass". In jeder Spalte ist ein Wert vorhanden. Aus einen Formular wird ein User übergeben z.b. "tschneider"
<% set db=Server.CreateObject("ADODB.Recordset")
db.open "SELECT * FROM tblpass WHERE user=" & Request("user") , Application("db"), 3, 1 %>
<% if Request("passwort") = db("pass") then %>
RICHTIG
<% else %>
FALSCH
<% end if %>
Ich bekomme immer folgende Fehlermeldung:
Kompilierungsfehler in Microsoft VBScript- Fehler '800a03ea'
Syntaxfehler
/iisHelp/common/500-100.asp, line 160
elseIf (objASPError.Description > "") Then
^
Microsoft OLE DB Provider for ODBC Drivers- Fehler '80040e10'
[Microsoft][ODBC Microsoft Access Driver] 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.
/neu.asp, line 67
Hallo Ralf,
vermutlich liegt es an Deinem SQL-String
db.open "SELECT * FROM tblpass WHERE user=" & Request("user") , Application("db"), 3, 1 %>
der nicht wirklich so zusammengebaut ist, wie man sich das von einem String vorstellt. Das ist die Zeile 67, stimmts ? Ich würde empfehlen, vor dem db.open, den String als Stringvariable zu definieren und ihn mit Response.Write auszugeben. Dann bekommst Du zwar immer noch die Fehlermeldung, aber vorher wird die Wurzel des Übels ausgegeben. Nur so kannst Du sichergehen, wie der SQL-String wirklich aussieht.
Was bitte soll eigentlich bei: Request("user") passieren ?
Ciao
Hans-Peter
Hallo Hans-Peter,
Das mit dem user ist so:
In einem Formular wird der user ausgewählt und an hierhin übergeben. Dannach soll er alle Felder aus der Datenbabank auswählen wo der user z.b. Hans-Peter ist. (Das ist der Sinn des Strings)Dannach wird geprüft ob das vorher zum user eingegebene Passwort aus dem Formular mit dem Passwort aus der DB übereinstimmt. Du hast schon Recht, dass ist die Zeile 67, ich kann jeddoch keinen Fehler im String finden. Und der user wird auch richtig übergeben (habe ich mit Response.Write überprüft.)
Hmmm...vielleicht nen Vorschlag wie ichs besser machen kann so dass es funzt?
Danke für deinen Beitrag!
Gruss
Ralf
Hi, hallo
ich würde nicht unbedingt das Recordset (welches sich mit 'rs' besser abkürzen lässt als mit 'db') als 'db' verwenden, wenn du schon Application("db") verwendest, das könnte zu Verwirrungen führen. Aber das ist deine Sache mit dem Programmierstil.
wenn "user" ein Textfeld ist, sollte das SQL besser lauten:
SELECT User, Pass FROM tblPass WHERE user='" & Request("user") & "'"
ein SELECT * FROM bringt nichts, wenn du nur das Feld 'Pass' brauchst, außer weniger Performance, weil mehr Daten zu schaufeln sind..
nach dem Fehler zu urteilen ist Request("user") NULL und dein SQL sieht so aus
"SELECT * FROM tblPass WHERE user="
es könnte auch sein, dass deine Tabelle kein Feld namens user enthält
du solltest statt Request("user") immer die Request-Collection mit angeben, es sei denn bestimmte Einrichtungen verhindern dies
der Übersicht halber, sollten SQL-Statements immer erst in einem String zusammengebaut werden, bevor sie verwendet werden. Aber das ist deine Sache mit dem Programmierstil.
Für solch eine Abfrage empfiehlt sich auch die Verwendung einer Stored Procedure bzw. parameterisierten Abfrage, damit gehst du auch gekonnt dem Thema SQL-Injection aus dem Weg.
Bzw. die Zuweisung set rs = Application("db").execute(sql_statement)
das erzeugt das schnellste Datensatzobjekt, dass man bekommen kann, forwardOnly und ReadOnly
wenn du allerdings beim Überprüfen in der selben Tabelle gleichzeitig noch etwas ändern möchtest, z.b. das Last_Login oder so, kommst du mit sql,db-connection,3,3
3 = adOpenStatic bzw. adLockOptimistic besser
dein Fehler ist nicht besonders kompliziert, du wirst ihn sicherlich schnell herausfinden und dir dann sprichwörtlich in den Hintern beissen
HTH
Tschau, tschüß,
Frank
Hallo Ralf,
ich habe zwar seit Jahren nicht mehr mit ASP gearbeitet, aber ich denke mal, dass das bei ASP genauso sein wird wie bei Visual Basic. Dort musst du nämlich bei einer Funktion, der du mehr als einen Parameter übergibst, die Parameter in eine Klammer dahinter setzen. Also sprich aus deinem
db.open "SELECT * FROM tblpass WHERE user=" & Request("user") , Application("db"), 3, 1
mach ein
db.open ("SELECT * FROM tblpass WHERE user=" & Request("user") , Application("db"), 3, 1)
Das könnte der Grund sein, bin mir aber nicht sicher. Mal ausprobieren ;-)
MfG,
Mirko Hansen