21. juli 2006 - 09:43Der er
9 kommentarer og 1 løsning
Send kun en mail til hver modtager
Jeg har lavet et nyt modul til nyhedsbreve, men er rendt ind i et problem som jeg ikke rigtig kan se hvordan jeg løser.
Når man tilmelder sig nyhedsbrevet, kan man sætte vinge i nogle checkbokse ud fra ens interessepunkter.
Når jeg så udsender nyhedsbrev, så vinger jeg de interessepunkter (groupID) af som skal modtage nyhedsbrevet og sender nyhedsbrevet.
Til hver modtager i databasen, er der så tilknyttet et tekstfelt der indeholder id-numre på de grupper vedkommende er tilmeldt i formen: ,2,5,3, osv., altså et komma, et ID-nummer og et komma.
Jeg sender så på følgende måde:
arrModtager = Split(Request.form("groupID"), ", ") For t = 0 to UBound(arrModtager)
SQLsend = "SELECT * FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'"
set send = conn.execute(SQLsend)
.... og her sker selve opbygning og afsendelsen
send.movenext loop objMailer.close set objMailer = nothing send.close set send = nothing next
Problemet er jo blot, at da jeg lopper igennem hver groupID, og modtageren er tilknyttet flere grupper, ja så får vedkommende en mail for hver gruppe han står. Dette er ikke meningen.
Hvordan ændrer jeg så der kun udsendes én mail til hver modtager selvom vedkommende står opført i flere grupper?
Du skal opbygge SQL'en dynamisk: arrModtager = Split(Request.form("groupID"), ", ") For t = 0 to UBound(arrModtager) if t=0 then SQLsend = "SELECT distinct name, email FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'" else SQLsend = SQLsend & "union SELECT distinct name, email FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'" end if next set send = conn.execute(SQLsend) while not send.eof ... wend
Ja, fennec har naturligvis ret i at SQL-sætningen skal sammensættes inden du kalder databasen (det giver med stor sandsynlighed også en bedre performance).
Men bort set fra det, så ville det være mere relationelt korrekt at lave en relation (altså en særskilt tabel) mellem brugeren og nyhedsbrevet, da dette ville gøre din forspørgsel lidt mere naturlig (med hjælp fra en join), men sådan skal det nok ikke være... :)
Vil være enig med softspot om en ændring af databasen. Kommasepereret lister har INTET at gør i en DB. De skal udskiftes med en mellem-tabel. Noget i denne stil:
Jeg ved sg* ikke lige hvad der går galt, men hvis jeg bruger det fennec skriver, så ser min SQLsend således ud:
SELECT distinct modtager, user, customeratt FROM TBL_nyhedsbrev_modtagere where groupID like'%,5,%'union SELECT distinct modtager, user, customeratt FROM TBL_nyhedsbrev_modtagere where groupID like'%,6,%'
Nu aner jeg ikke hvad union gør/betyder, men det der sker er, at den tager den første modtager, og så pumper den bare mails afsted til den pågældende i et væk, som om den kommer ind i en uendelig løkke?
Selve afsendelsen ser nu således ud:
arrModtager = Split(Request.form("groupID"), ", ") For t = 0 to UBound(arrModtager) if t=0 then SQLsend = "SELECT distinct modtager, user, customeratt FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'" else SQLsend = SQLsend & "union SELECT distinct modtager, user, customeratt FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'" end if next
response.write(SQLsend)
set send = conn.execute(SQLsend)
while not send.eof
response.write send("modtager") & "<br>" Response.Flush wend send.close set send = nothing conn.close set conn = nothing
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.