Avatar billede steen_hansen Forsker
28. august 2016 - 22:15 Der er 12 kommentarer

UPDATE med WHERE IN?

Jeg laver et udtræk på nogle brugere, som jeg kører gennem en løkke som vist nedenfor.

For at give formularfelterne unikke names og IDs, sætter jeg brugernes initialer ind bagved "name" og "id".

For ikke at skulle lave 200+ (9 formularfelter for hver bruger)

xxx='" & Request.Form("yyy") & "', ..............

i hånden, spekulerer jeg på, om man kan løse dette nemmere v.hj.a. WHERE IN?

Jeg håber du kan se hvordan jeg trækker alle brugere ud gennem én løkke. Det fungerer fint den vej. Tricket må være at kunne UPDAT nemmest muligt. Håber det kan lade sig gøre.

Og jeg håber mit spørgsmål og problemstillingen er til at forstå. Ellers spørg :)

<%

Set RSEast = Conn.Execute("SELECT * FROM [TABEL] ORDER BY initials ASC")

If Request.Form("mode") = "updatenow" Then
    Dim allowdp
    If LCase(Request.Form("allow") = "on" Then
        allowdp = 1
    Else
        allowdp = 0
    End If

    SQL = "UPDATE [TABEL] SET [kolonne]='" & Request.Form("activity1<%=initEast%>") & "', allow=" & allowdp & " WHERE userID =" & Request.Form("foid") & ""

Response.Redirect("/............")

End If

%>

<html>

<body>

<%
    If Not RSEast.EOF Then
        Do Until RSEast.EOF

            Dim initEast
            initEast = LCase(RSEast("initials"))

%>

            <form name="xxx" action="yyy" method="post">
                <div><%=UCase(initEast)%></div>
                <div><input type="hidden" name="foid" id="foid"></div>
                <div>
                    <select size="1" name="activity1<%=initEast%>" id="activity1<%=initEast%>" class="selbox">
                        <option value="xxxx">.....</option>
                    </select>
                </div>
                <div><input type="text" name="act<%=<%=initEast%>" id="act<%=<%=initEast%>"></div>
                <div><input type="checkbox" name="allow<%=initEast%>" id="allow<%=initEast%>" checked>
                <div><input type="submit" name="xxx" value="yyy"></div>
            <form>

<%

        RSEast.MoveNext
        Loop

    End If

    RSEast.Close
    Set RSEast = Nothing

%>

</body>
Avatar billede arne_v Ekspert
29. august 2016 - 02:05 #1
Hmmm - jeg kan ihvertfald ikke gennemskue hvad det er du vil.
Avatar billede steen_hansen Forsker
29. august 2016 - 06:47 #2
Alle de her formular felter bliver rullet ud på én gang gennem løkken. Det fungerer fint.

Når så de felter, som skal udfyldes på brugerne, er udfyldt, håber jeg man kan opdatere tabellen på en enkel måde med WHERE in.
Avatar billede steen_hansen Forsker
29. august 2016 - 06:47 #3
Jeg ved ikke om det giver mening
Avatar billede Slater Ekspert
29. august 2016 - 08:51 #4
Du kan kun opdatere med WHERE IN hvis alle rækkerne skal have samme værdier.

Det sagt, så må der næsten være noget helt galt med din struktur, hvis alternativet er at sidde og skrive 200 opdateringslinjer i koden. Du må kunne gøre det, så det kan køre i en løkke.
Avatar billede softspot Forsker
29. august 2016 - 09:14 #5
Hvis du gerne vil kunne rettet alle brugeres informationer inden du opdaterer, skal du ikke lave en form for hver bruger. Derimod skal du lave en form med alle felterne, dvs. form-elementet skal laves udenfor løkken (startes før do until og sluttes efter loop). Din gem/opdater-knap skal ligeledes ligge etfer loop (men før det lukkende form-element)

I din postback-kode skal du så finde de felter i formularen, som hører til hver bruger. Til dette har du behov for en liste af initialer, da det er disse du anvender til at identificere hver bruger med. Listen skal så gennemløbes i en løkken og for hver sæt initialer skal alle felter i forms-collection gennemsøges, som du selv er inde på med Request.Form("feltnavn" & initialer). Du skal blot hente de relevante felter og opdatere brugeren for hvert sæt initialer.

Du kan altså ikke opdatere alle på én gang med WHERE IN, da det er forskellige data for hver bruger.

P.S. Din kode til at generere formularen har syntaksfejl.
Avatar billede steen_hansen Forsker
29. august 2016 - 22:06 #6
Slater: Som jeg umiddelbart ser det, er jeg næsten nødt til at gå den hårde vej: Nemlig at lave en Request.Form("xxxs") på hvert enkelt formularfelt. Jeg har så et spinkelt håb om, at der er en herfra, der ligger inde med de vises sten :o)

softspot: Det kan jeg ikke lige gennemskue:

Administrator indtaster data i formularfelt

name="[FORMULARFELT]1XXXXX"
name="[FORMULARFELT]2XXXXX"

osv

Den samme administrator indtaster data i formularfeltet for brugeren med initialerne YYYYY:

name="[FORMULARFELT]1YYYYY"
name="[FORMULARFELT]2YYYYY"

Dermed kan jeg kave formularfelterne unikke, selvom de bliver kørt gennem løkken.

Jeg tror ikke der er nogen syntaksfejl i udrulningsløkken. Der kommer ikke fejl, og de data jeg forsøgsvis har indtastet i databasen via PHPMyAdmin, bliver trukket fint ud i formularfelterne med

value="<%=RS("ditten%>"

og

value="<%=RS("datten")%>

når alle brugerne med deres respektive data køres gennem løkken. Alle de unikke data er placeret korrekt i de tilhørende formularfelter.

Her er det så jeg havde håbet, at man kan lave et eller andet á la:

UPDATE [TABEL] SET ditten='" & Request.Form("ditten"" & initials & "") & "', datten='" & Request.Form("datten"" & initials & """) & "' WHERE userID = foid .........

Jeg ved godt UPDATE er helt i hegnet. Det er bare for at indikere hvor det er jeg vil hen ad.

Ligesom jeg ruller formularfelterne med deres unikke værdier på de respektive brugere ud gennem en løkke, håber jeg at recordsets kan opdateres den anden vej på samme måde. Måske gennem en løkke også. Men jeg kan ikke gennemskue hvad det er du mener. Hvis du har mulighed for at lave et lille, hurtigt eksempel, ville det være fint.

<input type="hidden" name="foid" id="foid"> skulle gerne indeholde det unikke userID (Auto Increment, PRIMARY). Min tanke var, at det kunne bruges til et eller andet.
Avatar billede softspot Forsker
29. august 2016 - 22:38 #7
Hvis du nu laver et felt til hver brugers initialer og kalder dette felt usrInitials for ALLE brugerne, vil initialerne blive sendt til serveren som en kommasepareret liste (hvilket så forudsætter, at du ikke anvender komma i dine initialer). Dermed kan du hente dette felt fra Request.Form("usrInitials") og omdanne indholdet til et array med split-funktionen (det er muligt du lige skal slå den faktiske syntaks for split op på nettet).

initialsArray = Split(Request.Form("usrInitials"), ",")


Array'et indeholder nu alle de initialer du skal bruge til at hente feltdata ud af forms-collection med, hvilket kunne se nogenlunde således ud:

for each initials in initialsArray
    felt1 = Request.Form("ditten" & initials) & ""
    felt2 = Request.Form("datten" & initials) & ""

    sql = "UPDATE table SET ditten = '" & ditten & "', " & _
          "datten = '" & felt2 & "' " & _
          "WHERE initials = '" & initials & "'"

    ' Logikken til at udføre din update mod
    ' databasen laves her....
next


Bemærk at jeg anvender initialerne som nøgle til at opdatere brugeren med. Det betyder samtidig, at du ikke har behov for at oprette et id-felt i formularen til hver bruger.

NB: Jeg vil helt klart fraråde dig at anvende denne kode i et produktionsmiljø, da den er sårbar overfor SQL-injection. Jeg anvender metoden her, fordi du selv har anvendt den og dermed forventes at forstå hvad der sker. Du bør til hver en tid anvende Command og parameteriserede kald til databasen for at undgå denne SQL-injection sårbarhed
Avatar billede steen_hansen Forsker
30. august 2016 - 00:03 #8
Det ser spændende ud!

"Hvis du nu laver et felt til hver brugers initialer......"

Det skal vel være

<input type="hidden" name="init" id="init" value="<%=RS("initials")%>">

Initialerne bliver udskrevet ud for hver bruger:

<div><%=Ucase("initials")%></div>

Men det er der kun for at administrator kan se initialerne. De skal jo ikke kunne rettes, da de er unikke og faste.
Avatar billede steen_hansen Forsker
30. august 2016 - 00:15 #9
Rettelse:

<input type="hidden" name="usrInitials" id="usrInitials" value="<%=RS("initials")%>">
Avatar billede arne_v Ekspert
30. august 2016 - 03:25 #10
Hvorfor bruger du ikke en traditionel simpel loesning:

visalle.asp som viser en liste/tabel med alle og har et edit link med id

retenkelt.asp som kaldes med id og har en enkelt form til at rette felter i
Avatar billede softspot Forsker
30. august 2016 - 09:18 #11
Ja, initialerne er vel egentlig den rigtige primære nøgle til en bruger, idet de er entydige på tværs af alle brugere. Id er en teknisk primærnøgle, som i dette tilfælde (i princippet) er unødvendig.

Det er korrekt, at initialerne skal lægges ind i formularen som et skjult felt - selvom du også bare kunne bruge input-feltet til at vise initialerne og så gøre feltet readonly. Såvidt jeg husker, skal du blot tilføje readonly-attributten på input-feltet for at låse det for redigering.
Avatar billede steen_hansen Forsker
11. september 2016 - 09:28 #12
Jeg har været optaget af andet arbejde, sorry. Jeg vender tilbage indenfor et par dage.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester