22. februar 2005 - 23:45Der er
8 kommentarer og 1 løsning
Annonceagent - j.mail sender via inner join på database
Hej!
Kan nogen hjælpe med min problemstillingen, som er følgende:
Nedenstående script, skal sende mails til række brugere, som har indtastet et til flere søge ord i et felt kaldet KEYWORD i databasen, når der er intastet en nye annonce (som det handler om!)
Jeg har førsøgt mig længe, men er gået helt i står - jeg får fejl i linie 75 (End If???)
Kan nogen venligst være behjælpelig? På forhånd tak!
Kode:
<!--#include file="Connections/conn.asp" --> <!--#include file="includes/authorizedUsers.asp" --> <% Dim rsProfile__MMColParam rsProfile__MMColParam = "1" If (Session("MM_KSBUsername") <> "") Then rsProfile__MMColParam = Session("MM_KSBUsername") End If %> <% Dim rsProfile Dim rsProfile_numRows
Set rsProfile = Server.CreateObject("ADODB.Recordset") rsProfile.ActiveConnection = MM_connDUclassified_STRING rsProfile.Source = "SELECT * FROM USERS WHERE U_ID = '" + Replace(rsProfile__MMColParam, "'", "''") + "'" rsProfile.CursorType = 0 rsProfile.CursorLocation = 2 rsProfile.LockType = 1 rsProfile.Open() rsProfile_numRows = 0 %> <% If NOT rsprofile.EOF And NOT rsprofile.BOF Then %> <% '## EMAIL ALERT START Dim rsAlert__MMColParam rsAlert__MMColParam = "1" if (Request.QueryString("id") <> "") then rsAlert__MMColParam = Request.QueryString("id") Dim vSplit, addEmail, emailComp vSplit = "," If (emailComp = 1) OR (emailComp = 6) Then vSplit = ";"
set rsAlert = Server.CreateObject("ADODB.Recordset") rsAlert.ActiveConnection = MM_conn_STRING rsAlert.Source = "SELECT * FROM ADS, ALERT INNER JOIN USERS on ALERT.USER = USERS.U_ID WHERE AD_ID = " + Replace(rsAlert__MMColParam, "'", "''") + " AND U_LUKKET = 1 ORDER BY AD_ID DESC" rsAlert.CursorType = 0 rsAlert.CursorLocation = 2 rsAlert.LockType = 3 rsAlert.Open() rsAlert_numRows = 0
Dim rsAlert_numRows rsAlert_numRows = 0 Dim Repeat1__numRows Repeat1__numRows = -1 Dim Repeat1__index Repeat1__index = 0 rsAlert_numRows = rsAlert_numRows + Repeat1__numRows %>
<% While ((Repeat1__numRows <> 0) AND (NOT rsAlert.EOF)) %>
If rsAlert("BOTH")="y" Then If (InStr(1,AD_TITLE,MyArray(I),1) = 0) AND (InStr(1,AD_DESCRIPTION,MyArray(I),1) = 0) Then Exit For If I = Ubound(MyArray) Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit ElseIf rsAlert("BOTH")<>"y" Then If (InStr(1,AD_TITLE,MyArray(I),1) = 0) Then Exit For If I = Ubound(MyArray) Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit End If End If
End if %> <% Repeat1__index=Repeat1__index+1 Repeat1__numRows=Repeat1__numRows-1 rsAlert.MoveNext() Wend %> <% 'indeholder alle mails If addEmail <> "" Then addEmail = Left(addEmail, Len(addEmail) - 1)
Dim msgTo, msgBcc, msgSubject, msgBody msgTo = "noreply_KSB@mitdomæne.dk" msgBcc = addEmail msgSubject = "Annonce Alarm " msgBody = "Der er kommet en ny annonce der opfinde de kriterier du har opsat i din annonce agent.<br>klik på linket nedest, for at se annoncen" & vbCrLf & vbCrLf msgBody = msgBody & URL HER&"details.asp?type="&Request.QueryString("type")"&id="&Request.QueryString("id") & vbCrLf & vbCrLf msgBody = msgBody &webName & vbCrLf %> <!--#include file="mail.asp" --> <% Call SendMail(emailComp) End If rsAlert.close set rsAlert = nothing %>
If rsAlert("BOTH")="y" Then If (InStr(1,AD_TITLE,MyArray(I),1) = 0) AND (InStr(1,AD_DESCRIPTION,MyArray(I),1) = 0) Then Exit For If I = Ubound(MyArray) Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit ElseIf rsAlert("BOTH")<>"y" Then If (InStr(1,AD_TITLE,MyArray(I),1) = 0) Then Exit For If I = Ubound(MyArray) Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit End If End If
If ovenstående kodesektion synes der at mangle en "Next I" instruktion.
Hmm... Lidt kryptisk kommentar. Det hjalp dig ikke af med fejlen, eller...? Det ku' ellers godt lyde som om det var, fordi du ikke havde den next med, at du fik en fejl, når den nåede ned til den efterfølgende End If.
Eller var det ikke fejlen, men funktionen generelt, du ønsker hjælp til?
Beklager - det var ikke ment sådan. Det er faktisk funktionen genrelt jeg gerne vil have hjælp til!
Beklager, hvis jeg har udtrykt mig forkert!!!
Anyway, nu har jeg tilføjet "next - kode" til ovenstånde, men nusynes min inner join af være den der fejler - eller hele connection til database?
Foregående fejl er i hvert fald ikke længere eksisterende!
Fejlen er nu: Microsoft JET Database Engine error '80040e10' No value given for one or more required parameters. /ksb/done.asp, line 54
Ny kode:
<!--#include file="Connections/conn.asp" --> <!--#include file="includes/authorizedUsers.asp" --> <% Dim webName Dim website Dim weburl Dim emailComp Dim msgFrom Dim emailhost
webName = "mit domæne" website = "min webadresse" weburl = "direkte url" emailComp = 5 msgFrom = "email@domæne.dk" emailhost = "mail.xx.dk" %> <% Dim rsProfile__MMColParam rsProfile__MMColParam = "1" If (Session("MM_KSBUsername") <> "") Then rsProfile__MMColParam = Session("MM_KSBUsername") End If %> <% Dim rsProfile Dim rsProfile_numRows
Set rsProfile = Server.CreateObject("ADODB.Recordset") rsProfile.ActiveConnection = MM_conn_STRING rsProfile.Source = "SELECT * FROM USERS WHERE U_ID = '" + Replace(rsProfile__MMColParam, "'", "''") + "'" rsProfile.CursorType = 0 rsProfile.CursorLocation = 2 rsProfile.LockType = 1 rsProfile.Open() rsProfile_numRows = 0 %> <% If NOT rsprofile.EOF And NOT rsprofile.BOF Then %> <% '## EMAIL ALERT START Dim rsAlert__MMColParam rsAlert__MMColParam = "1" if (Request.QueryString("id") <> "") then rsAlert__MMColParam = Request.QueryString("id") Dim vSplit, addEmail vSplit = "," If (emailComp = 1) OR (emailComp = 6) Then vSplit = ";"
set rsAlert = Server.CreateObject("ADODB.Recordset") rsAlert.ActiveConnection = MM_conn_STRING rsAlert.Source = "SELECT * FROM ADS, ALERT INNER JOIN USERS on ALERT.USERS = USERS.U_ID WHERE AD_ID = " + Replace(rsAlert__MMColParam, "'", "''") + " AND U_LUKKET = 1 ORDER BY AD_ID DESC" rsAlert.CursorType = 0 rsAlert.CursorLocation = 2 rsAlert.LockType = 3 rsAlert.Open() rsAlert_numRows = 0
Dim rsAlert_numRows rsAlert_numRows = 0 Dim Repeat1__numRows Repeat1__numRows = -1 Dim Repeat1__index Repeat1__index = 0 rsAlert_numRows = rsAlert_numRows + Repeat1__numRows %>
<% While ((Repeat1__numRows <> 0) AND (NOT rsAlert.EOF))
'-If no keywords add email to email message If rsAlert("KEYWORD")="" Then
If NOT InStr(1,AD_TITLE,MyArray(I),1) = 0 Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit Exit For ElseIf (rsAlert("BOTH")="y") AND (NOT InStr(1,AD_DESCRIPTION,MyArray(I),1) = 0) Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit Exit For End If
If rsAlert("BOTH")="y" Then If (InStr(1,AD_TITLE,MyArray(I),1) = 0) AND (InStr(1,AD_DESCRIPTION,MyArray(I),1) = 0) Then Exit For If I = Ubound(MyArray) Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit ElseIf rsAlert("BOTH")<>"y" Then If (InStr(1,AD_TITLE,MyArray(I),1) = 0) Then Exit For If I = Ubound(MyArray) Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit End If
Next
ElseIf rsAlert("TYPE")="3" Then
If NOT InStr(1,AD_TITLE,rsAlert("U_EMAIL"),1) = 0 Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit ElseIf (rsAlert("BOTH")="y") AND (NOT InStr(1,AD_DESCRIPTION,rsAlert("KEYWORD"),1) = 0) Then addEmail = addEmail & rsAlert("U_EMAIL")&vSplit End If
End If
End If %> <% Repeat1__index=Repeat1__index+1 Repeat1__numRows=Repeat1__numRows-1 rsAlert.MoveNext() Wend %> <% 'indeholder alle mails If addEmail <> "" Then addEmail = Left(addEmail, Len(addEmail) - 1)
Dim msgTo, msgBcc, msgSubject, msgBody msgTo = "noreply_KSB@mitdomæne.dk" msgBcc = addEmail msgSubject = "Annonce Alarm " msgBody = "Der er kommet en ny annonce der opfylder de kriterier du har opsat i din annonce agent.<br>Klik på linket nedest, for at se annoncen" & vbCrLf & vbCrLf msgBody = msgBody & weburl&"Annonce.asp?type="&(Request.QueryString("type"))&"&id="&(Request.QueryString("id")) & vbCrLf & vbCrLf msgBody = msgBody &webName & vbCrLf
%> <!--#include file="mail.asp" --> <% Call SendMail(emailComp) End If rsAlert.close set rsAlert = nothing %>
rsAlert.Source = "SELECT * FROM ADS, ALERT INNER JOIN USERS on ALERT.USERS = USERS.U_ID WHERE AD_ID = " + Replace(rsAlert__MMColParam, "'", "''") + " AND U_LUKKET = 1 ORDER BY AD_ID DESC"
Ser lidt mærkeligt ud. Du bør ikke mixe formaterne. Enten bør du skrive alle filerne med komma imellem, og specificere tilknytningskriterierne i where delen, eller også bør du specificere alle filerne med INNER JOIN ... ON ... Her har du specificeret tabellerne ADS og ALERT med komma, for efterfølgende at skrive INNER JOIN til USERS.
Skriv hellere enten:
rsAlert.Source = "SELECT * FROM ADS, ALERT, USERS WHERE ALERT.USERS = USERS.U_ID AND AD_ID = " + Replace(rsAlert__MMColParam, "'", "''") + " AND U_LUKKET = 1 ORDER BY AD_ID DESC"
eller.. - men her opdager jeg, at du slet ikke har noget sammenknytningskriterie mellem tabellerne ADS og ALERT. Er det ikke en fejl?
Desuden, hvis du specificerer *, hvor du bruger flere joinede tabeller, bør du specificere hvilken tabel du mener, f.eks. SELECT ADS.*, ALERT.*, USERS.* FROM ADS, ALERT, USERS... hvis du vil have alle felter med fra alle tabellerne.
Okay, aner ikke om det hjælper dig, men det er da forsøget værd... Sengen kalder; jeg er begyndt at se dobbelt, så jeg er vist ikke til megen hjælp for øjeblikket.
meningen med denne string, er at ADS kun skal referer til den aktuelle annonce, som specificeres via (Request.QueryString("id"). Der skal så søges efter de keywords, brugeren har indtastet i ALERT (KEYWORD).
Efterfølgende skal ALERT, hvor søgeord matcher med de 2 felter i ADS (AD_TITLE og AD_DESCRIPTION) sende en mail til brugeren, hvor id (USER) i tabellen ALERT er = med email adresse i tyballen USERS felt, U_USERS..
Jeg får ikke længere nogen fejl side, men noget tyder på at det ikke spiller som det skal, da ikke sendes nogen mails.
Jeg har nu forsøgt forskellige SELECT løsninger, men den eneste, som syne at gå igennem er nedenstående - bortset fra det vigtige element, at den ikke sender den forbistrede mails :O(
STRING: rsAlert.Source = "SELECT * FROM ADS, ALERT INNER JOIN USERS on ALERT.USER = USERS.U_ID WHERE AD_ID = " + Replace(rsAlert__MMColParam, "'", "''") + " AND U_LUKKET = 1 ORDER BY AD_ID DESC"
rsAlert.Source = "SELECT * FROM ADS, ALERT, USERS WHERE ALERT.USERS = USERS.U_ID AND AD_ID = " + Replace(rsAlert__MMColParam, "'", "''") + " AND U_LUKKET = 1 ORDER BY AD_ID DESC"
Gav i øvrigt samme reusltat som ovenstående... Den går fint igennem, men ingen mail...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.