Avatar billede steen_hansen Forsker
23. august 2022 - 00:25 Der er 20 kommentarer og
2 løsninger

UPDATE virker ikke

Hvorfor virker dette ikke? Jeg kan godt udskrive værdien på skærmen, men ikke UPDATE tabellen users

<html>
<%
    If UCase(Request.ServerVariables("REQUEST_METHOD")) = "POST" Then
        Dim vUser, ActiveChoise, SQL
        vUser = Request.Form("chooseuser")
        ActiveChoise = Request.Form("ActiveChoise")

        SQL = Conn.Execute("UPDATE users SET status = " & ActiveChoise & " WHERE username = '" & vUser & "'")
    End If
%>

<body>

<form>
<div class="col-md-12 mb-3">
    <select name="chooseuser" id="chooseuser" class="form-select">
    <%
    If Not RSusers.EOF Then
        Do Until RSusers.EOF
    %>

        <option value="<%=RSusers("username")%>"<% If RSusers("username") = SQLEncode(Session("username")) Then %> selected<% End If %>><%=RSusers("username")%></option>
    <%
        RSusers.MoveNext
        Loop
    End If
    %>
    </select>
</div>

<div class="d-flex justify-content-between align-items-center flex-column flex-lg-row">
    <div class="form-group row">
        <div class="col-md-4 mb-1">
            <button type="submit" name="ActiveChoise" value="200" class="btn btn-primary btn-block btn-lg" onclick="this.form.submit();">12:00</button>
        </div>
        <div class="col-md-4">
            <button type="submit" name="ActiveChoise" value="300" class="btn btn-primary btn-block btn-lg" onclick="this.form.submit();">12:30</button>
        </div>
        <div class="col-md-4">
            <button type="submit" name="ActiveChoise" value="400" class="btn btn-primary btn-block btn-lg" onclick="this.form.submit();">13:00</button>
        </div>
    </div>
</div>
</form>

</body>
</html>
Avatar billede steen_hansen Forsker
23. august 2022 - 00:50 #1
Det er "ActiveChoise" i dette

SQL = Conn.Execute("UPDATE users SET status = " & ActiveChoise & " WHERE username = '" & vUser & "'")

- der ikke bliver opdateret
Avatar billede erikjacobsen Ekspert
23. august 2022 - 09:22 #2
Når du skriver  <form>  bliver default method="GET". Vi det gøre en forskel at skrive

  <form method="POST">

?
Avatar billede steen_hansen Forsker
23. august 2022 - 10:01 #3
Hej erikjacobsen. Jeg skrev bare <form>, men jeg har anført method="post"

<form name="choose" action="[URL]" method="post">

Når der bliver submitted, tjekkes der tjekket på request method

If UCase(Request.ServerVariables("REQUEST_METHOD")) = "POST" Then

Det skulle jeg nok have uddybet, sorry
Avatar billede erikjacobsen Ekspert
23. august 2022 - 10:41 #4
Det er fint du fjerner den konkrete URL, men lige i dette tilfælde fik du for meget med :)

Hvad om du lige udskriver denne for at se om det giver mening:

"UPDATE users SET status = " & ActiveChoise & " WHERE username = '" & vUser & "'"

Du har sikkert hørt det før: din kode er piv-åben for SQL-injection. Det skal forhåbentlig ikke bruges til noget alvorligt.
Avatar billede steen_hansen Forsker
23. august 2022 - 11:52 #5
Hvad ville du foreslå i stedet?
Avatar billede erikjacobsen Ekspert
23. august 2022 - 12:42 #6
Det første forslag er at undlade at bruge teknologi fra det sidste årtusinde. Classic ASP er noget hø. Hvadsomhelstandet er sikkert bedre.

Når det er sagt så må man aldrig sammensætte SQL-strenge med &, altså streng-konkatering.

Jeg tror nok at en måde at lave parametriserede SQL-queries på er sådan her - ikke lige dit eksempel

DB.Execute "insert into foo values (?, ?, ?)", Array(1, "two", "three")

Oversat til din anvendelse, formentlig:

SQL = Conn.Execute "UPDATE users SET status = ? WHERE username =?", Array(ActiveChoise,vUser)

Og jeg nægter at støve en Windows-computer af for at prøve det ;)

Men det er næppe derfor det ikke virker - hvad med udskriften?

(Og så er der også problemer med HTML-injection)
Avatar billede arne_v Ekspert
23. august 2022 - 19:42 #7
ASP ADO parameters syntaxen er en anelse anderledes.

http://www.vajhoej.dk/arne/articles/prepparam.html#right_ex har nogle ASP ADO eksempler.
Avatar billede steen_hansen Forsker
23. august 2022 - 19:59 #8
@erikjacobsen "(Og så er der også problemer med HTML-injection)"

Nu er jeg vist ude i noget jeg slet ikke er vant til :)  Og dette:

Oversat til din anvendelse, formentlig:

SQL = Conn.Execute "UPDATE users SET status = ? WHERE username =?", Array(ActiveChoise,vUser)

"SET status = ?" - Her skal jeg udskifte ? med noget andet? Jeg er ude, hvor jeg aldrig har været ude i før :)


@arne_v Takker mange gange. Jeg synes bare ikke jeg kan udlede særligt brugbart. Og det er fordi jeg slet ikke ved hvordan jeg skal gribe det an, jeg har ingen erfaring med det:



CREATE TABLE tt (
    id INTEGER PRIMARY KEY,
    name VARCHAR(50)
);

CREATE TABLE myusers (
    un VARCHAR(32) PRIMARY KEY,
    pw VARCHAR(32)
);

INSERT INTO myusers VALUES('arne', 'hemmeligt');

CREATE TABLE dtest (
    i INTEGER PRIMARY KEY,
    d DATETIME
);

På min side er det min hensigt, at brugerne bare skal vælge deres user i

<select name="chooseuser" id="chooseuser" class="form-select">
    <option></option>
</select>

Og derefter trykke på den <button type="submit"> de ønsker

@erikjacobsen - @arne_v
Jeg får fint udskrevet 100, 200, 300 og 400, når jeg forsøger mig med de første fire buttons. Ingen problemer der. Men jeg kan af en eller anden årsag ikke UPDATE users tabellen
Avatar billede erikjacobsen Ekspert
23. august 2022 - 20:17 #9
Ikke bruge mit eksempel. Kig på ArneVs link.

Men det er ikke derfor din kode ikke virker - det skal vi have opklaret.

Den udskriver 100 osv. men det er sql-strengen der er interessant. Hvis du udskriver den, hvad sker der så.

HTML-injection kan vi vente med - det er nok heller ikke derfor det ikke virker.

Og så: er det helt fint at man bare kan vælge en anden bruger og ændre hans status?
Avatar billede arne_v Ekspert
23. august 2022 - 20:33 #10
SQL = Conn.Execute("UPDATE users SET status = " & ActiveChoise & " WHERE username = '" & vUser & "'")

->
sqlstr = "UPDATE users SET status = " & ActiveChoise & " WHERE username = '" & vUser & "'"
Response.Write "sqlstr=" & sqlstr
SQL = Conn.Execute(sqlstr)
Avatar billede steen_hansen Forsker
24. august 2022 - 01:17 #11
@erikjacobsen & @arne_v

Jamen, det ser ud til at koden knækker ved vUser

Når Arne's SQL streng ser således ud:

sqlstr=UPDATE users SET status = 100 WHERE username = ''

For at få username fra formen, har jeg gjort dette:

<%
    If UCase(Request.ServerVariables("REQUEST_METHOD")) = "POST" Then
        Dim vUser, ActiveChoise
        vUser = Request.Form("chooseuser")
        ActiveChoise = Request.Form("ActiveChoise")
...............................................
%>

<% Set RSusers = Conn.Execute("SELECT * FROM users ORDER BY category, username ASC") %>

                        <select name="chooseuser" id="chooseuser" class="form-select">
                        <%
                        If Not RSusers.EOF Then
                            Do Until RSusers.EOF
                        %>

                            <option value="<%=RSusers("username")%>"<% If RSusers("username") = SQLEncode(Session("username")) Then %> selected<% End If %>><%=RSusers("username")%></option>
                        <%
                            RSusers.MoveNext
                            Loop
                        End If
                        %>
                        </select>
Avatar billede steen_hansen Forsker
24. august 2022 - 01:24 #12
Jeg kan ikke lige se hvad jeg har gjort galt i det ovenstående.

Og ja, det er meningen, at de andre usere skal kunne vælge alle usere og angive en værdi. Som udgangspunkt bliver den option <option value="XXXXX">XXXXX</option> valgt, som er ens egen Session("username"). Men man kan vælge en anden bruger, hvis det skulle være nødvendigt, og angive en værdi/vælge en option. Men der bliver tilsyneladende ikke valgt noget af en eller anden årsag:

vUser = Request.Form("chooseuser") ser ud til at være tom
Avatar billede arne_v Ekspert
24. august 2022 - 02:15 #13
Hvordan ser den genererede HTML ud inden form submit?
Avatar billede erikjacobsen Ekspert
25. august 2022 - 15:24 #14
Jeg tror vi er løbet tør for ideer. Har du fået det til at virke?

Ellers skal vi se systemet køre - jeg kan formentlig tilbyde dig et virtuelt møde, hvor du kan vise mig det.
Avatar billede steen_hansen Forsker
26. august 2022 - 00:14 #15
Jeg har dælme fået det til at virke :) Også https://www.computerworld.dk/eksperten/spm/1040272 - Problemet med den var, at hvis RS1200 var = "", så forsvandt alt mellem <tr> og </tr>.

Jeg udskiftede

If Not RS1200.EOF OR RS1230.EOF OR RS1300.EOF Then

med

If Not RS1200.EOF OR RS1200.EOF OR RS1230.EOF OR RS1300.EOF Then
    Do Until RS1200.EOF AND RS1230.EOF AND RS1300.EOF

Den syntes jeg ikke lå lige til højrebenet. Men det virker altså :)

Jeg har dog stadig et lille issue: Jeg vil af hensyn til brugervenligheden gerne have val Session("username") som standard, når man kommer ind på siden. Og her vil den button være af class "info" som standard. Dvs baseret på det valg jeg har foretaget.

Hvis jeg vælger en anden bruger, kan jeg trykke på en knap, og value fra denne knap vil blive UPDATET fint, hvor username = Request.Form("chooseuser"). Men jeg skal have trukket den pågældende brugers forrige valg ud (<button class="info">RS1200</button>). Men det er mit eget valg (f.eks. 200), som fremgår af knapperne, og ikke den bruger jeg vælger fra min select.

Jeg vælger brugeren fra selectboksen, og trykker på en knap, og status ændres korrekt. Men idéen er, at det er bruger XXXXX's valg som ses, når man trykker på hans navn i select. Kan dette virker?

<div class="col-md-12 mb-3">
    <select name="chooseuser" id="chooseuser" onchange="location.href=this.options[this.selectedIndex].value;" class="form-select">
    <%
    If Not RSusers.EOF Then
        Do Until RSusers.EOF
    %>

        <option value="<%=RSusers("username")%>"<% If RSusers("username") = SQLEncode(Session("username")) Then %> selected<% End If %>><%=RSusers("username")%></option>
    <%
        RSusers.MoveNext
        Loop
    End If
    %>
    </select>
</div>

Jeg ved godt mit spørgsmål måske kan være kryptisk. Hvis I ikke forstår hvad jeg mener, så råb endelig højt
Avatar billede steen_hansen Forsker
26. august 2022 - 00:26 #16
Her er (næsten) hele siden, som sådan fungerer fint. Men jeg får ikke markeret buttons med class="info" for den enkelte user. Kun hvad jeg har foretaget af valg, og det er valget af den user, man vælger i selectboksen, som skal vises:

<!-- #include virtual="/includes/lb_data.asp" -->
<!-- #include virtual="/includes/lb_functions.asp" -->
<!-- #include virtual="/includes/lb_protect.asp" -->

<html lang="da" dir="ltr" class="no-js controlpanel loggedin">

<%
    Dim pageID, bugURL, SessionUser
    pageID = 100
    bugURL = "https://www.frokosttavlen.clientside.dk/dk/"

    Dim RS1200, RSusers

    Set RS1200 = Conn.Execute("SELECT * FROM users WHERE status = 200 ORDER BY category, username ASC")
    Set RSusers = Conn.Execute("SELECT * FROM users ORDER BY category, username ASC")

    If UCase(Request.ServerVariables("REQUEST_METHOD")) = "POST" Then
        Dim vUser, ActiveChoise, SQL
        vUser = Request.Form("chooseuser")
        ActiveChoise = Request.Form("ActiveChoise")

        SQL = Conn.Execute("UPDATE users SET status =" & ActiveChoise & " WHERE username = '" & vUser & "'")

    Response.Redirect("/dk/")

    End If
%>

<head>
<!-- #include virtual="/includes/header.asp" -->
    <title></title>
</head>
<body>

<div class="grid-container contain">
    <div class="grid-header">
<!-- #include virtual="/includes/banner.asp" -->
    </div>
    <div class="container mb-4">
        <div class="row">
            <div class="col-md-3 d-print-none">
                <div id="controlpanel-menu" class="mt-3">
<!-- #include virtual="/includes/lb_menu.asp" -->
                </div>
            </div>
            <div class="col-md-6">
                <div id="controlpanel-content" class="mt-3">
                    <h1>Frokosttavlen</h1>
                    <p class="lead">V&aelig;lg din pause ved at trykke p&aring; knapperne til h&oslash;jre.</p>
                    <div class="row mb-4">
                        <div class="col-lg-12 d-none d-md-block">
                            <div class="container">
                                <div class="row">
                                    <div class="table-responsive-lg">
                                        <table class="table table-striped table-hover table-bordered-columns" id="ownevents">
                                            <thead>
                                                <tr class="border-0">
                                                    <span class="lead"><strong>RETAIL</strong></span>
                                                </tr>
                                                <tr class="border-0">
                                                    <th class="text-center"><span id="1200" class="lead"></span><br>12:00 - 12:30</th>
                                                    <th class="text-center"><span id="1230" class="lead"></span><br>12:30 - 13:00</th>
                                                    <th class="text-center"><span id="1300" class="lead"></span><br>13:00 - 13:30</th>
                                                </tr>
                                            </thead>
                                            <tbody class="list align-items-center">
                                                <%
                                                If RS1200.EOF AND RS1230.EOF AND RS1300.EOF Then
                                                %>
                                                <tr>
                                                    <td class="reference text-nowrap">
                                                        -
                                                    </td>
                                                    <td class="reference text-nowrap">
                                                        -
                                                    </td>
                                                    <td class="reference text-nowrap">
                                                        -
                                                    </td>
                                                </tr>
                                                <%
                                                End If

                                                If Not RS1200.EOF OR RS1200.EOF OR RS1230.EOF OR RS1300.EOF Then
                                                    Do Until RS1200.EOF AND RS1230.EOF AND RS1300.EOF
                                                %>
                                                <tr>
                                                <%
                                                If RS1200.EOF Then
                                                %>
                                                    <td class="reference text-nowrap">
                                                        -
                                                    </td>
                                                <%
                                                ElseIf Not RS1200.EOF Then
                                                %>
                                                    <td name="1200" class="reference text-nowrap">
                                                        <svg height="14" width="14"><circle cx="7" cy="7" r="7" stroke="black" stroke-width="1" fill="<% If RS1200("category") = 1 Then %>green<% ElseIf RS1200("category") = 2 Then %>yellow<% Else %>red<% End If %>"></svg> <span class="mt-2"><%=RS1200("username")%></span>
                                                    </td>
                                                <%
                                                End If

                                                If RS1230.EOF Then
                                                %>
                                                    <td class="reference text-nowrap">
                                                        -
                                                    </td>
                                                <%
                                                Else
                                                %>
                                                    <td class="reference text-nowrap">
                                                        <svg height="14" width="14"><circle cx="7" cy="7" r="7" stroke="black" stroke-width="1" fill="<% If RS1230("category") = 1 Then %>green<% ElseIf RS1230("category") = 2 Then %>yellow<% Else %>red<% End If %>"></svg> <%=RS1230("username")%>
                                                    </td>
                                                <%
                                                End If

                                                If RS1300.EOF Then
                                                %>
                                                    <td class="reference text-nowrap">
                                                        -
                                                    </td>
                                                <%
                                                Else
                                                %>
                                                    <td class="reference text-nowrap">
                                                        <svg height="14" width="14"><circle cx="7" cy="7" r="7" stroke="black" stroke-width="1" fill="<% If RS1300("category") = 1 Then %>green<% ElseIf RS1300("category") = 2 Then %>yellow<% Else %>red<% End If %>"></svg> <%=RS1300("username")%>
                                                    </td>
                                                <%
                                                End If
                                                %>
                                                </tr>
                                                <%
                                                If Not RS1200.EOF Then
                                                    RS1200.MoveNext
                                                End If
                                                If Not RS1230.EOF Then
                                                    RS1230.MoveNext
                                                End If
                                                If Not RS1300.EOF Then
                                                    RS1300.MoveNext
                                                End If
                                                Loop
                                            End If
                                            %>
                                            </tbody>
                                        </table>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-md-3 card bg-light mt-4">
                <div class="card-body col-md-12">
                <form name="choosepause" action="/dk/" method="post">
                    <div class="col-md-12 mb-3">
                        <select name="chooseuser" id="chooseuser" class="form-select">
                        <%'<select name="chooseuser" id="chooseuser" onchange="location.href=this.options[this.selectedIndex].value;" class="form-select">%>
                        <%
                        If Not RSusers.EOF Then
                            Do Until RSusers.EOF
                        %>

                            <option value="<%=RSusers("username")%>"<% If RSusers("username") = SQLEncode(Session("username")) Then %> selected<% End If %>><%=RSusers("username")%></option>
                        <%
                            RSusers.MoveNext
                            Loop
                        End If
                        %>
                        </select>
                    </div><%=ActiveChoise%>
                            <div class="d-flex justify-content-between align-items-center flex-column flex-lg-row mb-3">
                                <div class="col-md-12">
                                    <button type="submit" name="ActiveChoise" value="100" class="btn btn-primary btn-block btn-lg" onclick="this.form.submit();">JEG HAR FRI</button>
                                </div>
                            </div>
                            <div class="d-flex justify-content-between align-items-center flex-column flex-lg-row">
                                <div class="form-group row">
                                    <div class="col-md-4 mb-1">
                                        <button type="submit" name="ActiveChoise" value="200" class="btn btn-<% If RS1200currentuser("status") = 200 Then %>info<% Else %>primary<% End If %> btn-block btn-lg" onclick="this.form.submit();">12:00</button>
                                    </div>
                                    <div class="col-md-4">
                                        <button type="submit" name="ActiveChoise" value="300" class="btn btn-<% If RS1230currentuser("status") = 300 Then %>info<% Else %>primary<% End If %> btn-block btn-lg" onclick="this.form.submit();">12:30</button>
                                    </div>
                                    <div class="col-md-4">
                                        <button type="submit" name="ActiveChoise" value="400" class="btn btn-<% If RS1300currentuser("status") = 400 Then %>info<% Else %>primary<% End If %> btn-block btn-lg" onclick="this.form.submit();">13:00</button>
                                    </div>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    <div class="push"></div>
</div>
<!-- #include virtual="/includes/footer.asp" -->
</body>
</html>
Avatar billede erikjacobsen Ekspert
26. august 2022 - 16:12 #17
Det er en mærkelig måde at tænke på med alle de RecordSets.

Jeg forstår ikke din problemstilling ud fra din beskrivelse, og slet ikke ud fra din kode. Min vurdering er at du griber det helt forkert an - den slags spagettikode passer ikke til nogen kendt metode.
Avatar billede steen_hansen Forsker
26. august 2022 - 23:53 #18
Jeg er helt enig, det er noget spaghettikode udført af en weekendcowboy. Jeg har aldrig påstået andet. Men jeg har forsøgt mig med en dulens masse forsøg.

Idéen er, at der er et "board" med dit valg på, når man logger sig ind. Men at man også kan vælge en bruger med vedkommenes valg på.

Der er 21 <button style="submit"> på. 21 valgmuligheder.

Har bruger XXXXX valgt 1200 (status = 200), så er knappens class="info"
Hvis IKKE den knap er valgt, er knappens class="primary"

Der er 21 knapper i alt. 21 <button type="submit"></button> at vælge imellem.

Én af de 21 buttons vil have class="info", altså den button der er valgt.
De resterende 20 buttons vil have class="primary"

Som udgangspunkt vil ens eget brugernavn være valgt i selectboksen, når man kommer ind på siden. Og her vil den button (det valg man har foretaget) være markeret med class="info" (bootstrap)

De andre brugeres valg kan ikke ses, kun ens eget.

Men her er det så meningen, at når man vælger bruger YYYYY fra selectboksen, at vedkommendes valg vil være at finde. Og det kan man vel reelt gøre med

<div class="col-md-12 mb-3">
    <select name="chooseuser" id="chooseuser" onchange="location.href=this.options[this.selectedIndex].value;" class="form-select">
    <%
    If Not RSusers.EOF Then
        Do Until RSusers.EOF
    %>

        <option value="<%=RSusers("username")%>"<% If RSusers("username") = SQLEncode(Session("username")) Then %> selected<% End If %>><%=RSusers("username")%></option>
    <%
        RSusers.MoveNext
        Loop
    End If
    %>
    </select>
</div>

Mit ønske er, at når man vælger en anden bruger, at man så kan se hvad den brugers valg har været ,så har man mulighed for at ændre det, og man skal ikke gætte sig frem til hvad valget var. Det skal man kunne se på class="info"

Hvis det er for kringlet formuleret, eller det er for lavt at gå i kast med, forstår jeg dig godt. Og så skal du i givet fald have mange tak for dine inputs.

Har du derimod lyst til at hjælpe, og gerne vil komme med nogle konstruktive og hensigtsmæssige forslag, vil jeg værsætte det meget. Jeg ved du er en haj til classic asp
Avatar billede steen_hansen Forsker
27. august 2022 - 00:03 #19
Jeg skal lige tilføje, at det virker perfekt, men kun for mit eget vedkommende. Min bruger er selected i selectboksen, når jeg logger på, og skal blot trykke på en button én gang. Så ændres mit valg både i HTML-tabellen, og den ændres på det "board" med 21 buttons. Nemmere kan det ikke blive.

Men problemet er som nævnt, når jeg vælger en kollega. Så skal den pågældende kollegas valg fremgå af de buttons på "boardet", så man kan se hvad der er af valgmuligheder.

Selve funktionen er perfekt, scriptet virker. Tryk én gang på knappen, og du har ændret valget for dig selv eller en kollega. Man kan bare ikke se deres valg på "boardet" med alle buttons på. Det er valget fra Session("username"), der vises.
Avatar billede erikjacobsen Ekspert
27. august 2022 - 10:16 #20
Igen: jeg forstår ikke din beskrivelse af det ønskede resultat (*), men det virker simpelt nok.

Der skal ikke repareres videre på din løsning med 3-4 recordsets - alle alarmklokker ringer.

Hvad kan du så bruge mig til?

(*) Du skal ikke bruge kræfter på at skrive mere - jeg skal have data og tegninger.
Avatar billede steen_hansen Forsker
30. august 2022 - 23:30 #21
Jeg har ikke glemt dig, Erik. Jeg forsøger mig lige med PIVOT TABLE. Vender tilbage snarest
Avatar billede steen_hansen Forsker
04. november 2022 - 22:49 #22
Jeg gik helt bort fra det her og byggede det op fra bunden, og det lykkedes mig at få det på plads.

I skal have ta begge to. Jeg tog Erik's råd til mig, og holdt det meget simpelt, jeg nemytter kun ét recordset.

Tak for hjælpen, begge
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