Avatar billede simonadrian Nybegynder
23. maj 2008 - 09:51 Der er 14 kommentarer og
1 løsning

Hvordan opdaterer jeg db ved tryk på link

Jeg har fundet et lille filesystemobject-script der linker til mapper på serveren. Jeg har brug for at navnet på den mappe, som man klikker på, samtidig opdaterer et felt, der hedder folder_path, i en mssql database.

Altså hvis mappen - og linket - hedder Mappe1, så opdateres feltet i db med Mappe1. Hvis Mappe2 så opdateres feltet til at indeholde navnet Mappe2. etc

Set fso = Server.CreateObject("Scripting.FileSystemObject")

Dim rootFolder   
Set rootFolder = fso.GetFolder(Server.MapPath("\topfolder\graphics\common))

hrefFolder="graphics/common"
Dim subFolders   
Set subFolders = rootFolder.SubFolders

For Each folder in subFolders
    select case folder.name
    Case else
                  Response.Write "<tr><td class='dataTD'>"
                  Response.Write "<A href=" & hrefFolder & "/" & folder.Name & ">"
                    Response.Write "</td></tr>"   
End select
Next
end function
Avatar billede w13 Novice
23. maj 2008 - 10:03 #1
Indsæt dette på din side:
<img id="hiddenimg" style="display:none">

Og så skal:
Response.Write "<A href=" & hrefFolder & "/" & folder.Name & ">"
være:
Response.Write "<a href=""" & hrefFolder & "/" & folder.Name & """ onclick=""document.getElementById('hiddenimg').setAttribute('src','updatedb.asp?folder="&folder.Name&"')"">"

Så vil et klik på mappe1 resultere i, at siden updatedb.asp?folder=mappe1 bliver kaldt. Og et klik på mappe2 vil gøre, at updatedb.asp?folder=mappe2 bliver kaldt.
Avatar billede w13 Novice
23. maj 2008 - 10:04 #2
Medmindre linket simpelthen springer videre til næste side, inden det når at ske? I så fald burde du måske åbne siden i et nyt vindue i stedet eller lave det sådan, at når man klikkede på linket, gik den i virkeligheden til siden updatedb.asp?folder=mappensnavn som opdaterede databasen og derefter sprang over og viste mappen. Det ville faktisk være meget bedre.
Avatar billede simonadrian Nybegynder
23. maj 2008 - 14:28 #3
Jeg forstår ikke helt hvad det er du gør i ovenstående eksempel. Hvordan bliver databasen opdateret med navnet på linket. Jeg antager at der skaL være et script i updatedb.asp, som updater databasen, men hvordan skal det så være hvis det ikke sker med en submit-form.

Undskyld min uvidenhed, men måske skal jeg lige forklare hvad der sker i øjeblikket.
Det der sker når jeg trykker på linket er at en index-fil i mappen redirecter til en tredje side.
Denne tredje side skal bruge navnet på det igangværende link, som del af en sti til en xml-fil, der ligger i for eksempel Mappe1 eller Mappe2.
Afhængig af hvilken mappe man vælger, viser den tredje side indholdet af forskellige xml-filer. Rettere: det er det der er mit mål.

En anden løsning kunne også være at updatere en include fil, men der er jeg også lost.
Avatar billede w13 Novice
23. maj 2008 - 14:37 #4
Jeg synes, du skulle skrive linksene sådan her:

Response.Write "<a href=""updatedb.asp?folder=" & hrefFolder & "/" & folder.Name & """ onclick=""document.getElementById('hiddenimg').setAttribute('src','updatedb.asp?folder="&folder.Name&"')"">"

Og så på updatedb.asp lave den funktion, som opdaterer databasen med stien, som du kan hente med Request.Querystring("folder")
Og sidst på updatedb.asp kan du så indsætte:

response.redirect Request.Querystring("folder")

som så vil gå videre og gøre det, der bliver gjort nu.
Avatar billede w13 Novice
23. maj 2008 - 14:42 #5
Sig endelig til, hvis du stadig ikke er med. =)
Avatar billede simonadrian Nybegynder
27. maj 2008 - 10:17 #6
Jeg forstår logikken, men det kniber med den praktiske udførelse.
Jeg har ændret dit forslag til

Response.Write "<a href=""updatedb.asp?folder=" & folder.Name & """
istedet for
Response.Write "<a href=""updatedb.asp?folder=" & hrefFolder & "/" & folder.Name & """

på den måde er det kun selve mappenavnet og ikke hele stien, der bliver registreret.


Bortset fra at der ikke sker andet end at jeg får en tom side frem med den korrekte adresse:
updatedb.asp?folder=Mappe1

Jeg har prøvet at bruge applikationens user-update-script som updatedb.asp. Det involverer sessions og user_id etc..., så jeg rører alting med forsigtighed.

<%
folder_path=Request.Querystring("folder")

%>

<form id="updating_folder_path" name="updating_folder_path" action="" method="post" >
       
        <input type=hidden name="folder_path" value="<% =folder_path %>">

<tr>
    <td class=labelTD align=right>&nbsp;
    </td>
<input type=hidden name="action" value="<% if user_id <> "" then %>update<% else %>insert<%end if %>_register"></tr>
</form>
</table>
<%
response.redirect Request.Querystring("folder")
end if
%>


<% end if %>

men skal der overhovedet en form til når jeg ikke skal submitte med en knap, eller hva..?
Avatar billede w13 Novice
27. maj 2008 - 10:32 #7
Nej, der skal ikke en form til.

Siden updatedb.asp kan udformes således (uden at kende din databases navn/password, tabellernes navne og felterne i tabellerne):
********************************************
<%Set Conn=Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("/db/database.mdb")

If Request.Querystring("folder")<>"" Then
  Conn.Execute("UPDATE table1 SET folder='"&Request.Querystring("folder")&"' WHERE id=ETELLERANDET")
  Response.Redirect Request.Querystring("folder")
Else
  Response.Write """Folder"" indeholder ikke en gyldig sti!"
End If

Conn.Close
set Conn=nothing%>
Avatar billede w13 Novice
27. maj 2008 - 10:33 #8
Conn.Execute("UPDATE table1 SET folder='"&Request.Querystring("folder")&"' WHERE id=ETELLERANDET")

skulle nok være:

Conn.Execute("UPDATE table1 SET noget=noget WHERE folder='"&Request.Querystring("folder")&"'")
Avatar billede simonadrian Nybegynder
27. maj 2008 - 16:14 #9
Min forstand på sql er for lille til at jeg kan få det integreret i mit script, så databasen bliver opdateret. Din løsning virker fint i forhold til at brugeren bliver redirected til den rette side, men folder_path i databasen bliver ikke opdateret.
folder_path er en column i tabellen Users.

<%
If Request.Querystring("folder")<>"" Then
set rs=cn.Execute("UPDATE Users SET folder_path='"&Request.Querystring("folder")&"' WHERE Users.user_id=" & to_sql(user_id,"number"))

  Response.redirect Request.Querystring("folder")
Else
  Response.Write """Folder"" indeholder ikke en gyldig sti!"
End If
%>

Nedenfor kan du se en forkortet udgave af det registreringsscript jeg tidligere forsøgte at bruge til opdateringen. Hvis det ikke er for meget et bede om kan du måske regne ud hvad der skal til for at opdatere folder_path. Jeg har ladet en masse ligegy

connection-strengen ligger i en include-fil, bare så du ikke tror at det er den der mangler.


sub validate_register
''' request and validate data entered from this form
    reg_code = trim(request("reg_code"))
    user_id = trim(request("user_id"))
    user_name = trim(request("user_name"))
    f_name = trim(request("f_name"))
    l_name = trim(request("l_name"))
    password = trim(request("password"))
    if password = "" then
        error_list.add "661647","" &get_label("lbl_form_password") & " is required."
        b_error = true
    end if
    mailing_list = trim(request("mailing_list"))
    folder_path = Request.Querystring("folder")
end sub


sub db_select_register
    sql = "SELECT " & _
    "dtInserted, " & _
    "accesslevel, " & _
    "user_id, " & _
    "user_name, " & _
    "f_name, " & _
    "l_name, " & _
    "email, " & _
    "password, " & _
    "folder_path, " & _
    "notes FROM Users" & _
    " WHERE " & _
    "Users.user_id = " & to_sql(user_id,"number") & ""
    on error resume next
    set rs = cn.Execute(sql)
    if err.number <> 0 then
        b_error = true
        error_list.add "select_data_register", "The data selection failed. " & err.description
    elseif rs.EOF then
        b_results = false
        msg_list.add "select_data_register", "The record was removed from the database."
    else
        reg_code = rs("reg_code")
        dtInserted = rs("dtInserted")
        accesslevel = rs("accesslevel")
        user_id = rs("user_id")
        user_name = rs("user_name")
        f_name = rs("f_name")
        l_name = rs("l_name")
        email = rs("email")
        password = rs("password")
        folder_path = rs("folder_path")
        notes = rs("notes")
    end if
    rs.Close
    on error goto 0
end sub
sub db_insert_register
    sql = "INSERT INTO Users" & _
    "(" & _
    "folder_path," & _
    "mailing_list" & _
    ") VALUES (" & _
    ""Request.Querystring("folder")"," & _
    "" & to_sql(mailing_list,"number") & ")"
    'response.write sql
    on error resume next
    cn.Execute(sql)
    if err.Number <> 0 then
        b_error = true
        error_list.add "db_insert_register" & err.Number ,"The database insert failed. " & err.Description
    else
        set rs = cn.Execute("SELECT @@IDENTITY")
        user_id = rs(0)
        rs.Close
        msg_list.add "db_insert_register","The database insert was successful."    end if
    on error goto 0
end sub

do_search = request("do_search")
sortby = request("sortby")
''' request form keys and inputs
user_id = request("user_id")

':: request action
action = lcase(request("action"))

':: handle the action
select case action

case "select_register"
'  select the requested key record from database
if user_id <> "" then
    db_select_register
else
    b_error = true
    error_list.add "edit_register", "Specify record to select."
end if

case "insert_register"
'  request form data and insert a new record into database

case "update_register"
'  request form data and update an existing database record
validate_register
if not b_error then
if user_id <> "" then
    db_update_register
else
    b_error = true
    error_list.add "update_register", "Specify record to update."
end if
end if
end select

':: handle the default case(s) (ignores value of action parameter)

%>


<%
display_errs
display_msg
%>



<%

':: check if hide form var was set
if not b_hide_register then
%>

<table class='HeaderTable'>
<tr>
<td class='HeaderTitle'>
<% =get_label("lbl_register") %>
</td>
<td class='HeaderTd'> </td>
</tr>
</table>
<table  >
<form id="updating_folder" name="updating_folder" action="" method="post" >
       
        <input type=hidden name="folder_path" value="<% =folder_path %>">
       
     
           

<tr>
    <td class=labelTD align=right>&nbsp;
    </td>
<input type=hidden name="action" value="<% if user_id <> "" then %>update<% else %>insert<%end if %>_register"></tr>
</form>
</table>
<%
response.redirect Request.Querystring("folder")
':: end hide form if
end if
%>
Avatar billede w13 Novice
27. maj 2008 - 16:22 #10
I linjen:

set rs=cn.Execute("UPDATE Users SET folder_path='"&Request.Querystring("folder")&"' WHERE Users.user_id=" & to_sql(user_id,"number"))

hvor får du så user_id fra?? Kunne det ikke være derfor, det ikke virker - altså fordi user_id mangler?
Avatar billede simonadrian Nybegynder
27. maj 2008 - 18:25 #11
Well, user_id er jo en column i Users-tabellen og jeg antog at det kom ind i kraft af connection til databasen.
Avatar billede w13 Novice
27. maj 2008 - 18:38 #12
Ikke helt på den måde.

Det giver jo heller ikke mening, at du opdaterer, der hvor user_id = user_id, for det vil jo sige alle. Det bliver dog ikke engang kørt på den måde pga. din to_sql()-funktion.
Avatar billede simonadrian Nybegynder
27. maj 2008 - 19:09 #13
Kan du så give mig en ide om hvad jeg skal lede efter - eller gøre.
Avatar billede simonadrian Nybegynder
28. maj 2008 - 13:20 #14
Jeg valgte en anden metode, nemlig at bruge din løsning til at opdatere en xml-fil, hvorfra jeg så inkluderer stien.
Det fungerer upåklageligt, så send mig hurtigst et svar, så du kan få nogle velfortjente point.
Avatar billede w13 Novice
30. maj 2008 - 09:09 #15
Okidoke! :)
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
Kategori
Kurser inden for grundlæggende programmering

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