Jag har ett antal checkboxar som jag loopar ut, sen vill jag spara de olika alternativen som man kryssar i för just den användaren i en tabell som heter User_File Välkommen hackers? Du bör läsa artikeln om SQL inject först. Tack för hjälpen men jag får ett felmeddelande när jag testkör frågan i Access "Syntaxfel i JOIN-operation", någon idé om vad det kan vara? vet inte om det hjälper men försök specificera tabell till fältnamn Skall vara: Nu får jag ett annat felmmedelande: "Det angivna fältet 'FileID' kan referera till fler än en av de tabeller som är uppräknade i SQL-uttryckets FROM-instruktion." Blir inte riktigt klok på detta... Testade att skriva Testade detta: 22, 45, 67 är exempel id'n du skall ersätta dessa med de idn till filer du vill lägga till. Jag körde föjlande: Det är bara ett exempel helge.... Litet fel. Skall vara File.FileID istället för User_File.FileID i where satsen: Nu fungerar följande:Checkboxar
User_FileID | UserID | FileID
---------------------------
1 | 2 | 17
2 | 2 | 18
3 | 2 | 22
Hur gör jag för att endast spara de alternativ (FileID) som inte redan är sparade för den användaren, dvs endast de nya kryssrutorna som man kryssat i.
Följande kod ta inte hänsyn till om om den användaren redan har det FileID:t
<code>
for each item in request.form
SQL = "INSERT INTO User_File (UserID, FileID) VALUES("& userid &", "& item &")"
Conn.Execute(SQL)
Next
</code>Sv: Checkboxar
Varför köra en fråga för varje post? Vi börjar med denna frågeställning.
Det är möjligt att infoga flera poster med en fråga om man har en tabell med informationen. Vilket jag antar stämmer i ditt fall.
För att infoga alla filer till en användare skriver du:
INSERT INTO User_File (UserID, FileID)
SELECT 1, FileID
FROM Files
Vi vill ju begränsa detta:
INSERT INTO User_File (UserID, FileID)
SELECT 1, FileID
FROM Files
WHERE FileID IN (12, 45, 67)
Vilket infogar bara tre av filerna.
Nu vill vi ju inte infoga filer som redan finns hos användaren:
INSERT INTO User_File (UserID, FileID)
SELECT 1, FileID
FROM Files LEFT JOIN Files ON ((Files.FileID = User_File.FileID) AND (User_File.FileID = 1))
WHERE FileID IN (12, 45, 67) AND User_File.User_FileID
Eftersom du inte uppgivit databas. Chansar på att du använder Access, MySQL eller MS SQL Server.
Syntaxen bör funka i Access och MS SQL Server. Kan krävas lite anpassning för MySQL.
Sv:Checkboxar
Sv: Checkboxar
INSERT INTO User_File (UserID, FileID)
SELECT 1, FileID
FROM Files LEFT JOIN Files ON ((Files.FileID = User_File.FileID) AND (User_File.FileID = 1))
WHERE FileID IN (12, 45, 67) AND User_File.User_FileID
"FROM Files LEFT JOIN Files ON"
hm, joina sig själv?Sv:Checkboxar
INSERT INTO User_File (UserID, FileID)
SELECT 1, FileID
FROM Files LEFT JOIN User_File ON ((Files.FileID = User_File.FileID) AND (User_File.FileID = 1))
WHERE FileID IN (12, 45, 67) AND User_File.User_FileID IS Null
Sv: Checkboxar
<code>
WHERE User_File.FileID IN...
</code>
men får samma fel.Sv: Checkboxar
<code>
INSERT INTO User_File (UserID, FileID)
SELECT 1, User_File.FileID
FROM Files LEFT JOIN User_File ON ((Files.FileID = User_File.FileID) AND (User_File.FileID = 1))
WHERE User_File.FileID IN (12, 45, 67) AND User_File.User_FileID IS Null
</code>
Får inget felmeddelande med det lades inte till några poster heller...Sv:Checkboxar
1 är ett exempel på user id som bör ersättas med idet till användaren du vill lägga till filerna. Sv: Checkboxar
<code>
INSERT INTO User_File (UserID, FileID)
SELECT 1, User_File.FileID
FROM Files LEFT JOIN User_File ON ((Files.FileID = User_File.FileID) AND (User_File.FileID = 3))
WHERE User_File.FileID IN (2, 3) AND User_File.User_FileID IS Null
</code>
Det finns filer med id:t 2 och 3 i tabellen files och en användare med id:t 3 i tabellen Users men ändå läggs inga poster till. Förstår inte riktigt var "AND (User_File.FileID = 3))" gör.Sv:Checkboxar
Du får applicera med det som gäller för just dina checkboxar.Sv: Checkboxar
INSERT INTO User_File (UserID, FileID)
SELECT @UserId, File.FileID
FROM Files LEFT JOIN User_File ON ((Files.FileID = User_File.FileID) AND (User_File.UserID = @UserId))
WHERE File.FileID IN (2, 3) AND User_File.User_FileID IS Null
Eller:
INSERT INTO User_File (UserID, FileID)
SELECT @UserId, File.FileID
FROM Files
WHERE File.FileID IN (2, 3) AND NOT File.FileID IN (SELECT User_File.FileID
LEFT JOIN User_File
WHERE User_File.UserID = @UserId)
Den sista frågan kanske har lite mer tydlig syntax.
Sv:Checkboxar
<code>
INSERT INTO User_File (UserID, FileID)
SELECT 3, File.FileID
FROM Files LEFT JOIN User_File ON ((Files.FileID = User_File.FileID) AND (User_File.UserID = 3))
WHERE File.FileID IN (2, 3) AND User_File.User_FileID IS Null
</code>
Fråga 2 fick jag inte att fungera. Problemet är bara att om jag kör frågan två gånger så lägger den till FileID 2 och 3 båda gångerna till användaren med id:t 3 . Den tar alltså inte hänsyn till om användaren redan har filen.