ASP Zugriff auf eine Access DB
Markus
- asp.net
Hi Leute!
Möchte folgendes realisieren was zum Teil schon funktioniert!
Hab ein Eintragungsformular (form.htm) dass nach dem ausfüllen an eine Bestätigungsseite (best.asp) gesendet wird. (funktioniert soweit)
auf der Bestätigungsseite werden die Daten in eine Access DB geschrieben und gleichzeitig wird ein Mail mit den Daten an den User geschickt (funktioniert auch) Hier der Code für das Eintragen der Daten:
<%
Dim myConnString
Dim myConnection
Dim mySQL
myConnString = Application("Immo_ConnectionString")
Set myConnection = Server.CreateObject("ADODB.Connection")
myConnection.Open myConnString
mySQL= "INSERT INTO Immo "
mySQL= mySQL & "(Passwort,Zimmer,Ort,Preis,Telefon,Grundflaeche) "
mySQL= mySQL & "VALUES ('" & Request.Form("Passwort") & "','"
mySQL= mySQL & Request.Form("Zimmer") & "'"
mySQL= mySQL & ",'" & Request.Form("Ort") & "'"
mySQL= mySQL & ",'" & Request.Form("Preis") & "','"
mySQL= mySQL & Request.Form("Telefon") & "','"
mySQL= mySQL & Request.Form("Grundflaeche") & "')"
myConnection.Execute mySQL
myConnection.Close
Set myConnection = Nothing
Der oben genannte Code erzeugt den Eintrag in meiner DB..
nun wird mittels JMail ein Mail mit dem selben Eintrag geschickt:
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "meinserver.xxx"
JMail.Sender = "meinemail.xxx"
JMail.Subject = "TEST"
JMail.AddRecipient Request.Form("EMail")
JMail.HTMLBody = "<html><body>...." & Request.Form("Passort") & ...
JMail.Logging = true
JMail.Silent = true
JMail.Execute
funktioniert auch sehr gut!
Nun aber mein Problem:
Möchte dem User auch seine ID zuschicken die automatisch bei dem Eintrag erzeugt wird damit er später auch evtl. auf seinen Eintrag in Zusammenhang mit dem Passwort + ID zugreifen kann.
Wie greife ich jetzt bei der Mail auf die Datenbank zu bzw wie und wo muß ich da noch was einbauen bin leider beim Programmieren ein Leihe (aber müßte irgendwie mit rs.ID gehen od so)
Wer kann mir da bitte weiterhelfen?
Danke
MFG
Markus
Hi!
Nun aber mein Problem:
Möchte dem User auch seine ID zuschicken die automatisch bei dem Eintrag erzeugt wird damit er später auch evtl. auf seinen Eintrag in Zusammenhang mit dem Passwort + ID zugreifen kann.
Wie greife ich jetzt bei der Mail auf die Datenbank zu bzw wie und wo muß ich da noch was einbauen bin leider beim Programmieren ein Leihe (aber müßte irgendwie mit rs.ID gehen od so)
Wer kann mir da bitte weiterhelfen?
Ich hoffe ich... :-)
Zuerst mal darfst du myConnection nicht schließen nach den Einträgen. Wenn man davon ausgeht, dass die ID als AutoWert erstellt wird, dann müsste es so gehen, dass du vor dem JMail-Aufruf ein Recordset öffnest:
myRecordset = Server.CreateObject("ADODB.Recordset")
Dann holst du dir den Eintrag mit der höchsten ID; das müsste der eben eingetragene sein, deswegen ist das mit dem AutoWert auch richtig:
myRecordset.open "SELECT id FROM [Tabellenname] ORDER BY id DESC", myConnection
Das DESC ordnet die EInträge absteigend, also mit der höchsten ID (und damit dem letzten EIntrag) als erstem Record. Die Zeile JMail.HTMLBody muss entsprechend ergänzt werden:
JMail.JTMLBody = "<html>" ....... & myRecordset("id") .......
Hoffe, das ist richtig und vor allem verständlich! :-)
Gruß,
der Juve
Hi
Danke für deine rasche Antwort
werde es gleich mal testen..
Dann holst du dir den Eintrag mit der höchsten ID; das müsste der eben eingetragene sein, deswegen ist das mit dem AutoWert auch richtig:
Ist das auch wirklich sicher? mit der höchsten ID?
Was ist wenn mehrere gleichzeitig eintragen? Hatte mal so ein ähnliches Problem war allerdings damals mit der Funktion "Last" ausgestattet u da kamm es zu konfliktion ist es hier sicher?
myRecordset.open "SELECT id FROM [Tabellenname] ORDER BY id DESC", myConnection
Das DESC ordnet die EInträge absteigend, also mit der höchsten ID (und damit dem letzten EIntrag) als erstem Record. Die Zeile JMail.HTMLBody muss entsprechend ergänzt werden:
Danke MFG
Markus
Hallo,
Dann holst du dir den Eintrag mit der höchsten ID; das müsste der eben eingetragene sein, deswegen ist das mit dem AutoWert auch richtig:
Ist das auch wirklich sicher? mit der höchsten ID?
Was ist wenn mehrere gleichzeitig eintragen? Hatte mal so ein ähnliches Problem war allerdings damals mit der Funktion "Last" ausgestattet u da kamm es zu konfliktion ist es hier sicher?
100%ig nicht, aber ich hab´s bis jetzt immer so gemacht, und in der Praxis bekam - meines Wissens - immer jeder genau das, was er brauchte. Wenn natürlich 1000 Leute sich pro Sekunde da irgendwie eintragen, kann das schon durcheinander kommen, da weiß ich dann so aus dem Kopf auch keine Lösung.
Gruß,
der Juve
Danke Juve die Lösung funktioniert mal in der Testphase super!
in der Praxis muß man es halt testen!
Weil derjenige bekommt dann von mir seine ID und sein Passwort zugeschickt und wenn da was durcheinander kommen würde wäre es nicht so gut.
Aber vl würde es zusätzlich eine Möglichkeit geben das mit dem Passwort und letzten Eintrag od so abzusichern...
Nur mit Passwort alleine geht ja auch nicht denn es könnten ja mehrere das gleiche haben(theoretisch)
Ein Anderes Problem wie könnte ich in dem Eintragungsformular (form.htm)
noch ein Bild zum "Upload" anbieten dass dann ebenfalls in die Datenbank kommen würde und später dann wieder von dort abgerufen werden kann.
MFG
Markus
Freut mich wenn´s gefällt! :-)
Um es ein wenig sicherer zu haben, würd ich auf jeden Fall Melanies Idee mit der Variablen beachten.
Weiterhin viel Spaß!
Gruß,
der Juve
Danke nochmals
Wie geht das mit den Variablen hab das nicht gecheckt an meinem Beispiel?
Kannst du mir das genauer erklären?
Hast du auch eine Idee zu der "Upload" Variante?
Um es ein wenig sicherer zu haben, würd ich auf jeden Fall Melanies Idee mit der Variablen beachten.
MFG
Markus
Dann holst du dir den Eintrag mit der höchsten ID; das müsste der eben eingetragene sein, deswegen ist das mit dem AutoWert auch richtig:
Ist das auch wirklich sicher? mit der höchsten ID?
Was ist wenn mehrere gleichzeitig eintragen? Hatte mal so ein ähnliches Problem war allerdings damals mit der Funktion "Last" ausgestattet u da kamm es zu konfliktion ist es hier sicher?
100&ig sicher ist es nicht, allerdings hat bei mir in der praktischen Umsetzung immer jeder genau das bekommen, was er brauchte - meines Wissens nach zumindest. Wenn sich allerdings 1000 Leute auf einmal eintragen, kann es schon zu Verwirrungen kommen, denke ich mal - aber da weiß ich jetzt aus dem Stand auch keine Lösung für.
Gruß,
der Juve
Hallo,
Ist das auch wirklich sicher? mit der höchsten ID?
Es ist nicht wirklich sicher.
Besser ist mit addNew zu arbeiten. Sowas in der Richtung wie:
RS.Open tableName, myConnection, adOpenKeySet, adLockOptimistic, adCmdTable
RS.AddNew
RS("feld1") = wert1
RS("feld2") = wert2
RS.Update
neueID = RS("NameDesIDFelds")
Gruss, Melanie
Hi,
Ist das auch wirklich sicher? mit der höchsten ID?
Es ist nicht wirklich sicher.
Besser ist mit addNew zu arbeiten.
Der Effekt ist doch der selbe, oder nicht? Der einzige - und durchaus sinnvolle! - Unterschied ist, dass bei deiner Lösung die neue ID sofort nach dem Eintrag in eine Variable gespeichert wird - es entstehen keine Verzögerungen, während der ein anderer User einen EIntrag machen und somit die höchste ID bekommen könnte.
Gruß,
der Juve
Hi,
Der Effekt ist doch der selbe, oder nicht? Der einzige - und durchaus sinnvolle! - Unterschied ist, dass bei deiner Lösung die neue ID sofort nach dem Eintrag in eine Variable gespeichert wird - es entstehen keine Verzögerungen, während der ein anderer User einen EIntrag machen und somit die höchste ID bekommen könnte.
Wenn nur eine Person die Datenbank benutzt ist es natuerlich kein Problem, aber in allen einigermassen professionellen Umstaenden ist kann es zu ueblen Problemen kommen - zwar ist die Wahrscheinlichkeit nicht hoch, aber hoch genug. Deswegen wird im allg. davon abgeraten mit max(ID) oder aehnlichem zu arbeiten um die ID zurueckzukriegen.
Durch das AddRow ist die neue ID Teil des Recordsets, und kann so weiter verwurschtet werden, und man kann sicher sein die richtige ID zu bekommen.
Gruss, Melanie
Hi Melanie
Es greifen bei mir mehrere User zu manchmal sogar gleichzeitig..
Wie würde deine Methode in meinem Beispiel aussehen bin leider ein Leihe auf dem Gebiet. Vl könntest du mir bitte bei der Code-Erstellung helfen..
Wenn nur eine Person die Datenbank benutzt ist es natuerlich kein Problem, aber in allen einigermassen professionellen Umstaenden ist kann es zu ueblen Problemen kommen - zwar ist die Wahrscheinlichkeit nicht hoch, aber hoch genug. Deswegen wird im allg. davon abgeraten mit max(ID) oder aehnlichem zu arbeiten um die ID zurueckzukriegen.
Durch das AddRow ist die neue ID Teil des Recordsets, und kann so weiter verwurschtet werden, und man kann sicher sein die richtige ID zu bekommen.
Danke im Voraus...
MFG Markus
Hi Markus,
Erst ein Meeting, dann Computercrash... Jedenfalls, fuer eine etwas naehere Erklaerung siehe 2 Nachrichten weiter oben.
Melanie
Hi Melanie
Ganz hab ich es leider noch nicht verstanden:
Besser ist mit addNew zu arbeiten. Sowas in der Richtung wie:
RS.Open tableName, myConnection, adOpenKeySet, adLockOptimistic, adCmdTable
RS.AddNew
RS("feld1") = wert1
RS("feld2") = wert2
RS.Update
neueID = RS("NameDesIDFelds")
Wo wird jetzt die ID Nummer vergeben?
Soll ich eine neue Spalte einfügen?
Habe bereits ein Feld "ID" mit dem Autowert!
was meinst du mit:
RS.AddNew
RS("feld1") = wert1
RS("feld2") = wert2
RS.Update
neueID = RS("NameDesIDFelds")
MFG
Markus
Hi,
Arg, hatte eine wunderschoene Antwort komponiert, und dann beim Abschicken - bluescreen.
Also nochmal. Der Code ersetzt Dein altes Insert Statement. Das select Statement danach fuer die ID ist nicht mehr noetig.
Wert1, wert2 etc sind einfach die Parameter die Du in Die Datenbank einsetzen willst. feld1, feld2 etc sind entsprechend die Spaltennamen in der Tabelle. RS ist dein Recordset (das natuerlich vorher mit server.createObject geschaffen werden muss). Durch das Verwenden von AddNew ist die autogenerierte ID, die ja von Access kommt, Teil des Recordsets. Und kann somit mit RS("ID") gleich angesprochen werden. Vorteil ist dass es sich dabei mit Sicherheit um die korrekte ID handelt.
RS.Open tableName, myConnection, adOpenKeySet, adLockOptimistic, adCmdTable
RS.AddNew
RS("feld1") = wert1
RS("feld2") = wert2
RS.Update
neueID = RS("NameDesIDFelds")
Ich hoffe es ist jetzt etwas klarer.
Gruss, Melanie
Hi Melanie!
Danke dass du dich damit beschäftigst! Sorry wegen dem Absturz
habs jetzt so gebaut: (Stimmt das?)
<%
Dim myConnString
Dim myConnection
Dim mySQL
Dim rs
myConnString = Application("Immo_ConnectionString")
Set myConnection = Server.CreateObject("ADODB.Connection")
myConnection.Open myConnString
set rs = server.createobject("adodb.recordset")
rS.Open Immo, myConnection, adOpenKeySet, adLockOptimistic, adCmdTable
rs.AddNew
rs("Wohnflaeche") = Request.Form("Wohnflaeche")
rs("Zimmer") = Request.Form("Zimmer")
rs("Ort") = Request.Form("Ort")
rs("Preis") = Request.Form("Preis")
rs("Grundflaeche") = Request.Form("Grundflaeche")
rs.Update
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "xxx.de"
JMail.Sender = "xxx"
JMail.Subject = "Test"
JMail.AddRecipient Request.Form("EMail")
JMail.HTMLBody = "<html><body>" & rs("ID") & "..."
JMail.Logging = true
JMail.Silent = true
Funktioiert es so richtig? und stimmt der zugriff mit rs("ID") im body?
Was bedeudet?:
adOpenKeySet?
adLockOptimistic?
adCmdTable?
Was muß ich noch ändern?
Danke im voraus!
MFG
Markus
Hi,
Funktioiert es so richtig? und stimmt der zugriff mit rs("ID") im body?
Es sieht ok aus. Hast Du's denn mal getestet? First rule of debugging: Bevor Du Test-Emails abschickst, lass Dir erstmal die ID zum Testen (und Vergleichen mit Access) mit response.write ausgeben.
Was bedeudet?:
»
adOpenKeySet?
adLockOptimistic?
adCmdTable?
adOpenKeyset etc sind ADO Konstanten, die im ADOVBS.INC file definiert sind (so Du noch nicht verwendet hast, bei IIS ist es dabei - die Suchfunction Deines OS sollte es finden, es muss in die Root Deines Webprojekts und als include am Anfang Deiner ASPSeiten eingebunden werden. Macht das Leben leichter, da Du sonst werte wie "&H002" im Code verwenden muesstest). Und weil ich heute besonders gut gelaunt bin, hier ein Link mit etwas mehr Info: http://www.aspheute.com/artikel/20000518.htm
Gruss, Melanie
Hi
Habe es getestet funktioniert leider nicht
Bekomm folgende Fehlermeldung:
ADODB.Recordset- Fehler '800a0bb9'
Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar.
Was könnte da falsch sein?
Es sieht ok aus. Hast Du's denn mal getestet? First rule of debugging: Bevor Du Test-Emails abschickst, lass Dir erstmal die ID zum Testen (und Vergleichen mit Access) mit response.write ausgeben.
Schicke die Mails nur an mich selbst*g* aber hast schon recht!
Kannst du mir bitte weiterhelfen?
Danke
MFG
Markus
Hi,
ADODB.Recordset- Fehler '800a0bb9'
Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar.
D.h. im allgemeinen dass die Konstanten sind nicht definiert sind auf der ASP Seite - hast du das ADOVB.INC gefunden, in die richtige Stelle kopiert und eingebunden <!--#include file="adovbs.inc"-->, und wenn ja, enthaelt es die adXXX Konstanten die das Skript anspricht?
Alternative waere, die eigentlichen Werte anstelle der Konstanten zu nehmen.
Statt: RS.Open tableName, myConnection, adOpenKeySet, adLockOptimistic, adCmdTable
schreibe: RS.Open tableName, myConnection, 1, 3, &H0002
Gruss, Melanie
Hi Melanie
Hab jetzt daran gebastelt und habst so gelöst und funktioniert auch: (müßte ja passen oder?):
<%
Dim lngID
Dim conn, rs
Dim strConnection
strConnection = Application("Immo_ConnectionString")
Set conn = CreateObject("ADODB.Connection")
conn.Open strConnection
Set rs = CreateObject("ADODB.Recordset")
rs.CursorLocation = 2 ' adUseServer
rs.CursorType = 1 ' adOpenKeyset
rs.LockType = 3 ' adLockOptimistic
strSQL = "SELECT * FROM Immo WHERE ID = 0"
rs.Open strSQL, conn
rs.AddNew
rs("Wohnflaeche") = Request.Form("Wohnflaeche")
rs("Zimmer") = Request.Form("Zimmer")
rs.Update
lngID = rs("ID")
rs.Close
conn.Close
Response.Write "Die ID ist: "
Response.Write lngID & "<br>" & vbCrLf
Set rs = Nothing
Set conn = Nothing
%>
MFG
Markus
Hi Markus
Hab jetzt daran gebastelt und habst so gelöst und funktioniert auch: (müßte ja passen oder?):
in der Tat ;-). Wenn's funktioniert is gut.
Nur das strSQL statement braucht's meines Erachtens nicht, es sollte ausreichen nur den Table zu oeffnen, mit " rs.Open Immo, conn "
Gruss, Melanie
Hallo,
Ist das auch wirklich sicher? mit der höchsten ID?
Nicht wirklich. Schau dir mal http://www.aspfaq.de/index.asp?FID=43&ELE=3746 an.
Da findest du ein Beispiel mit einer anderen (IMO besseren) Methode.
Tschau, Stefan
Hi Stefan!
Weiß noch nicht ganz wie ich diese Methode in meinem Beispiel einbauen soll?
Habs bis jetzt so:
<%
Dim myConnString
Dim myConnection
Dim mySQL
Dim rs
myConnString = Application("Immo_ConnectionString")
Set myConnection = Server.CreateObject("ADODB.Connection")
myConnection.Open myConnString
mySQL= "INSERT INTO Immo "
mySQL= mySQL & "(Passwort,Zimmer,Ort,Preis,Telefon,Grundflaeche) "
mySQL= mySQL & "VALUES ('" & Request.Form("Passwort") & "','"
mySQL= mySQL & Request.Form("Zimmer") & "'"
mySQL= mySQL & ",'" & Request.Form("Ort") & "'"
mySQL= mySQL & ",'" & Request.Form("Preis") & "','"
mySQL= mySQL & Request.Form("Telefon") & "','"
mySQL= mySQL & Request.Form("Grundflaeche") & "')"
myConnection.Execute mySQL
set rs = server.createobject("adodb.recordset")
rs.open "SELECT ID FROM [Immo] ORDER BY ID DESC", myConnection
Der oben genannte Code erzeugt den Eintrag in meiner DB..
nun wird mittels JMail ein Mail mit dem selben Eintrag geschickt:
Set JMail = Server.CreateObject("JMail.SMTPMail")
JMail.ServerAddress = "meinserver.xxx"
JMail.Sender = "meinemail.xxx"
JMail.Subject = "TEST"
JMail.AddRecipient Request.Form("EMail")
JMail.HTMLBody = "<html><body>...." & rs("ID) & "..."
JMail.Logging = true
JMail.Silent = true
JMail.Execute
myConnection.Close
Set myConnection = Nothing
Wo soll ich das jetzt bzw wie baue ich das bitte in meinen obigen Code ein?
Kannst du mir bitte weiterhelfen
Wie sicher ist diese Methode? (Um Konflikte auszuschließen?)
MFG
Markus
Hallo Markus,
Möchte dem User auch seine ID zuschicken die automatisch bei dem Eintrag erzeugt wird damit er später auch evtl. auf seinen Eintrag in Zusammenhang mit dem Passwort + ID zugreifen kann.
für mysql gibt es eine Funktion namens mysql_insert_id() - vielleicht hat access sowas auch? (php hat eine gleichnamige Funktion die das gleiche bewirkt - ob asp sowas auch hat, weiß ich nicht)
hth & Grüße aus Nürnberg
Tobias
HI Tobias
Mir ist sowas nicht bekannt - leider?
vielleicht hat access sowas auch? (php hat eine gleichnamige
Funktion die das gleiche bewirkt - ob asp sowas auch hat, weiß
ich nicht)hth & Grüße aus Nürnberg
Tobias
Hallo,
wenn Du bei access das Feld als Autowert definierst, wird automatisch ein ID generiert beim Eintrag von Daten.
Meinst Du sowas?
Gruss
Wurzel
Hi
Ja das weiß ich schon aber mein Problem ist auf den genau eingetragenen Datensatzt dann zuzugreifen ohne irgendwelche Verwechslungen..
MFG
Markus
Hallo,
Du solltest auf jeden Fall noch SQL-Injektion vorbeugen.
mySQL= "INSERT INTO Immo "
mySQL= mySQL & "(Passwort,Zimmer,Ort,Preis,Telefon,Grundflaeche) "
mySQL= mySQL & "VALUES ('" & Request.Form("Passwort") & "','"
mySQL= mySQL & Request.Form("Zimmer") & "'"
mySQL= mySQL & ",'" & Request.Form("Ort") & "'"
mySQL= mySQL & ",'" & Request.Form("Preis") & "','"
mySQL= mySQL & Request.Form("Telefon") & "','"
mySQL= mySQL & Request.Form("Grundflaeche") & "')"
Dazu solltest Du vor dem Insert noch die Werte aus dem Form z.B. mit regular expressions überprüfen! Such danach mal auf google...
Gruss
Wurzel
Hi
Was meinst du da genau?
Verstehe das nicht?
Du solltest auf jeden Fall noch SQL-Injektion vorbeugen.
mySQL= "INSERT INTO Immo "
mySQL= mySQL & "(Passwort,Zimmer,Ort,Preis,Telefon,Grundflaeche) "
mySQL= mySQL & "VALUES ('" & Request.Form("Passwort") & "','"
mySQL= mySQL & Request.Form("Zimmer") & "'"
mySQL= mySQL & ",'" & Request.Form("Ort") & "'"
mySQL= mySQL & ",'" & Request.Form("Preis") & "','"
mySQL= mySQL & Request.Form("Telefon") & "','"
mySQL= mySQL & Request.Form("Grundflaeche") & "')"Dazu solltest Du vor dem Insert noch die Werte aus dem Form z.B. mit regular expressions überprüfen! Such danach mal auf google...
Was soll ich da einfügen bzw. was bewirkt es?
MFG
Markus
Moin,
SQL-Injektion meint, dass jemand in HTML-Formulare Code eingeben kann, der diesem im schlimmsten Fall Zugriff auf alle Deine Daten verschaffen kann.
Deshalb erst checken, ob Variable aus Formular übergeben wurde:
Dim zimmer
if Request.Form("Zimmer") <> "" then zimmer = Request.Form("Zimmer")
Dann den Input mit regexp überprüfen auf Sonderzeichen, wie '," etc.
Code weiss ich jetzt nicht auswendig, musst in google unter regexp suchen...
Was soll ich da einfügen bzw. was bewirkt es?
Erst wenn der Input aus einem Formular überprüft ist, solltest Du das SQL Statement ausführen, wegen Sicherheitsaspekten.
Gruss,
Tobi