Varför raderas allt även om tidsintervallen ligger under 120 minuter?
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR svar = 3
19 svar · 857 visningar · startad av Inferis
Varför raderas allt även om tidsintervallen ligger under 120 minuter?
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR svar = 3
Du saknar parenteser kring det första 'svar' och '3', alternativt
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)
Det har att göra med hur det logiska uttrycket evalueras. I det här fallet sitter det implicita parenteser kring (Last < ... and svar = 2), så en rad i 'mess' raderas om
Vad gjorde min kod då? Det var så jag trodde att jag gjorde.
Nu börjar vi om ;) En rad i 'mess' skall raderas om...?
Den är äldre än 120 minuter och fältet svar är antingen 2 eller 3..
Då är ditt första försök felaktigt p.g.a. vad som står i inlägg #4. Vi kan vända på det: en rad i 'mess' raderas om:
Och vad som händer är att den tar bort alla poster som är äldre än 120 minuter och har svar = 2 ELLER alla poster vars svar är lika med tre (utan andra vilkor) detta för att eller väger tyngre än och. om man ska lösa det på ditt sätt blir det:
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND (svar = 2 OR svar = 3)
Fast Peter S lösning är snyggare.
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR svar = 3
är egentligen lika med:
DELETE FROM mess WHERE (Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2) OR svar = 3
Skulle detta funka? Bara undrar.
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 3
colione skrev:
Och vad som händer är att den tar bort alla poster som är äldre än 120 minuter och har svar = 2 ELLER alla poster vars svar är lika med tre (utan andra vilkor) detta för att eller väger tyngre än och.
Det stämmer inte. Den tog bort poster som hade svar = 2 och var en minut gamla.
Följdfråga. Hur lägger man in tex att för varje mess som raderas så ska det kollas ifall fältet Img innehåller data. Om så är fallet, radera bilden med det namnet?
Inferis skrev:
Skulle detta funka? Bara undrar.
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 3
Ja, det fungerar, eftersom AND binder starkare än OR.
Inferis skrev:
Följdfråga. Hur lägger man in tex att för varje mess som raderas så ska det kollas ifall fältet Img innehåller data. Om så är fallet, radera bilden med det namnet?
Om bilden ligger i en annan tabell bör du ha satt upp något slags referensvillkor som säger "om raden x i 'mess' raderas, så skall raden y i bildtabellen raderas". Gör en sökning på exempelvis ON DELETE CASCADE och REFERENCES.
Bildens namn finns bara i den tabellen.
Hur är en optimal lösning på denna koden?
'Kolla om ett meddelande har bild med sig
SQL = "SELECT mess,img,Last,svar FROM mess where Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)"
Set RS = Connection.Execute(SQL)
Do While NOT RS.EOF
If RS("img") <> "" Then 'Det finns en bild! Radera den
Set fso = Server.CreateObject("Scripting.FileSystemObject")
fso.DeleteFile(Server.MapPath("..\..\messbilder\public_html\meddelanden") & "\" & RS("img"))
Set Fso = nothing
else 'Finns ingen bild
End if
RS.MoveNext
Loop
RS.Close : Set RS = Nothing
'Radera meddelanden
connection.execute("DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)")
Jag kan tänka mig följande:
'Kolla om ett meddelande har bild med sig
SQL = "SELECT img FROM mess where Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3) AND img is not null"
Set RS = Connection.Execute(SQL)
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Do While NOT RS.EOF
fso.DeleteFile(Server.MapPath("..\..\messbilder\public_html\meddelanden") & "\" & RS("img"))
RS.MoveNext
Loop
Set Fso = nothing
RS.Close : Set RS = Nothing
'Radera meddelanden
connection.execute("DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)")
Detta förutsätter att om en bild inte existerar så sparas NULL i stället. Om inte NULL sparas utan en tom sträng, kan du ändra AND img is not null till AND img <> ''. Det förstnämnda förfarandet är att föredra.
Nu är det NULL som sparas. Men är din kod mycket mindre prestandakrävande? Verkar ju nästan som samma princip.
Detta är tänkt att köras som en .vbs med Schemaläggaren i Windows.
Ska man ta bort Server.CreateObject och byta mot bara CreateObject? Funkar fso i .vbs?
Ja och ja, på dina frågor. :)
Förlåt. Denna
Ska man ta bort Server.CreateObject och byta mot bara CreateObject? Funkar fso i .vbs?
Ok. Tack!