Avatar billede hinca Nybegynder
26. marts 2004 - 06:44 Der er 24 kommentarer og
1 løsning

menupunkter fra database

Hej alle.

Jeg har tænkt at lave en db hvor mine brugere kan oprette sig selv. I db skal der så være nogle tjek bokse der giver adgang til nogle menupunkter på en asp side. Det er så meningen at jeg skal kunne tjekke en boks af hvis jeg mener at brugeren skal have adgang til menupunktet.
Hvis der ikke er tjekket af i boksen, skal menupunkter ikke kunne ses på asp siden.
databasen skal være access og det hele kører på ISS5

Er der nogle der ved hvordan jeg skal angribe sagen??
Jeg er mere end villig til at give en god portion point til den der kan hjælpe mig med de første sider.

Hilsen Claus
Avatar billede fennec Nybegynder
26. marts 2004 - 08:10 #1
for at gøre det nemt, laver du et felt på brugerdatabasen for hver menupunkt. Hvis du har mange punkter skal der laves en anden løsning, men den tager vi hvis der er.
Bruger:
id, navn, brugernavn, password, menu1, menu2, meun3, menu4......
Du kan selv vælge datatypen på menupunkterne. Jeg bruger her tal (int default 0). Hvis punktet er 1 har brugeren adgang.

brug så denne kode:

<%
set rs = conn.execute("select * from bruger where id="& session("BrugerID"))
if not rs.eof then
  if cstr(rs("menu1")) = "1" then
    response.write "punkt 1"
  end if
  if cstr(rs("menu2")) = "1" then
    response.write "punkt 2"
  end if
  if cstr(rs("menu3")) = "1" then
    response.write "punkt 3"
  end if
  ....
  ....
end if
%>
Avatar billede nute Nybegynder
26. marts 2004 - 08:53 #2
din database:

user
****
id (autonummer)
userName (text)
(flere efter ønske, men disse er krævet)

menuItem
********
id (autonummer)
menuItem (text)
(flere efter ønske, men disse er krævet)

users_menuItem
**************
id (autonummer)
userID (number)
menuItemID (number)

"admin.asp"
***********
<%@ language="VBScript" %>
<% option explicit %>
<%
Dim objConn : Set objConn = Server.CreateObject( "ADODB.Connection" )
Dim strDSN    : strDSN = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath( "db.mdb" )
objConn.Open strDSN
' Bygger SQL'er
Dim strMenuItemSQL     : strMenuItemSQL = "SELECT id, menuItem FROM menuItem"
Dim strUsersSQL        : strUsersSQL = "SELECT id, userName FROM users"

Dim arrUsers, arrMenuItems, i, j
Dim objMenuItemRS    : Set objMenuItemRS = objConn.Execute( strMenuItemSQL )
Dim objUsersRS        : Set objUsersRS     = objConn.Execute( strUsersSQL )

if( not objUsersRS.EOF ) then
    arrUsers = objUsersRS.getRows()
end if
if( not objMenuItemRS.EOF ) then
    arrMenuItems = objMenuItemRS.getRows()
end if

objUsersRS.Close
Set objUsersRS = Nothing
objMenuItemRS.Close

Set objMenuItemRS = Nothing

if( Request( "mode" ) = "save" ) then

    Dim strSelectSQL     : strSelectSQL = "SELECT * FROM users_menuItem WHERE "
    Dim strDeleteSQL    : strDeleteSQL = "DELETE FROM users_menuItem WHERE "
    Dim strInsertSQL    : strInsertSQL = "INSERT INTO users_menuItem ( userID, menuItemID ) VALUES "
    Dim strTmpSQL, strValue, objTmpRS
    for i = 0 To UBound( arrUsers, 2 )
        for j = 0 To UBound( arrMenuItems, 2 )
            strValue = Request( "chkUserMenuItem_" & arrUsers( 0, i ) & "_" & arrMenuItems( 0, j ) )
            if( strValue = "" ) then
                strTmpSQL = strDeleteSQL & "userID = " & arrUsers( 0, i ) & " AND menuItemID = " & arrMenuItems( 0, j )
                objConn.Execute( strTmpSQL )
            else
                strTmpSQL = strSelectSQL & "userID = " & arrUsers( 0, i ) & " AND menuItemID = " & arrMenuItems( 0, j )
                Set objTmpRS = objConn.Execute( strTmpSQL )
                if( objTmpRS.EOF ) then
                    strTmpSQL = strInsertSQL & "(" & arrUsers( 0, i ) & ", " & arrMenuItems( 0, j ) & ")"
                    objConn.Execute( strTmpSQL )
                end if
                objTmpRS.Close
            end if
           
        next
    next
   
end if
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Untitled</title>
</head>

<body>
<form id="frm" name="frm" method="POST">
<table>
    <tr>
        <td></td>
        <%

        for i = 0 To UBound( arrUsers, 2 )
            Response.Write( "<td><b>" & arrUsers( 1, i ) & "</b></td>" )
        next
        %>
    </tr>
    <%
    Dim strUsersMenuItemsSQL : strUsersMenuItemsSQL = "SELECT userID, menuItemID FROM users_menuItem WHERE "
    Dim objUsersMenuItemRS, arrUsersMenuItems, strUsersMenuItems, strChecked
    for i = 0 To UBound( arrMenuItems, 2 )
        Response.Write( "<tr><td><b>" & arrMenuItems(1, i) & "</b></td>" )
        for j = 0 To UBound( arrUsers, 2 )
            strChecked = ""
            Set objUsersMenuItemRS = objConn.Execute( strUsersMenuItemsSQL & "userID = " & arrUsers( 0, j ) & " AND menuItemID = " & arrMenuItems(0, i) )
            if( Not objUsersMenuItemRS.EOF ) then
                strChecked = " checked=""checked"""
            end if
            Response.Write( "<td><input type=""checkbox"" name=""chkUserMenuItem_" & arrUsers( 0, j ) & "_" & arrMenuItems(0, i) & """ value=""" & arrUsers( 0, i ) & "¤" & arrMenuItems(0, i) & """" & strChecked & "></td>" )
        next
        Response.Write( "</tr>" )
    next
    %>
   
</table>
<br>
<input type="hidden" name="mode" value="save">
<input type="submit" value="save">
</form>
<%
objConn.Close
Set objConn = Nothing
%>
</body>
</html>


Derefter kan du hænte ud menupunkter med denne lille kode:

Dim strSQL : strSQL = "SELECT * FROM menuItem INNER JOIN users_menuItem ON menuItem.id = users_menuItem.menuItemID WHERE userID = [USERID]"
Dim objMenuRS : Set objMenuRS = objConn.Execute( strSQL )
while not objMenuRS.eof
    Response.write( objMenuRS( "menuItem" ) & "<br>" )
    objMenuRS.MoveNext
wend

/nute
Avatar billede nute Nybegynder
26. marts 2004 - 08:58 #3
løsningen kan ses i sin helhed her:

http://xperimentum.com/xperten/482121/menuAdmin.asp

/nute
Avatar billede hinca Nybegynder
26. marts 2004 - 17:15 #4
--Nute

Umidlbart ser din løsning ud til at være lige det jeg søger, og dit link overbeviste mig helt klart.
Men istædetfor at der står "punkt1" skal jeg have en billedfil ind og der skal være tilknyttet et hyberlink til billedet.
Er det muligt at du kunne lave en meun side og en admin side samt databasen hvis du får at vide hvilke punkter jeg skal bruge i db.
Jeg ved godt at det er normalt at man får et hint i den rigtige retning, og så selv laver tingene. Men jeg har lidt travlt med andre ting og vil meget gerne have dette til at virke hurtigst muligt.

--fennec
Din løsning er egentligt den samme, måske bare ikke så detaljeret. Men jeg vil gerne have en færdig løsning, så hvis du kan trylle mere ud af ærmet er jeg meget intreseret i at se det.

Hilsen Claus
Avatar billede nute Nybegynder
26. marts 2004 - 17:48 #5
jeg har da også travlt med andre ting ;-)

Dette var jo ment som et kick i den rigtige retning. Selfølgelig er det muligt at lave det du ønsker ... det eneste der skal til, er nogle flere felter i basen. kig på linket igen, så ser du at der er billeder på.

menusiden du efterspørger, handler jo bare om at du tager den kode der ligger nederst i min fil og smider den i en anden fil, så kører det.

jeg har ændret en lille smule i koden, og en lille smule i basen. koden kan du læse her:

http://xperimentum.com/xperten/482121/menuAdmin.txt

og databasen kan du hente her:

http://xperimentum.com/xperten/482121/db.mdb

/nute
Avatar billede hinca Nybegynder
27. marts 2004 - 06:23 #6
--nute
Der er ingen tvivl længere. Det er lige dette jeg skal bruge.
Jeg har lavet admin.asp med hele koden fra din menuAdmin.txt
og så har jeg lavet en user.asp med følgende kode:
<html>

<head>
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>New Page 1</title>
</head>

<body>
Menupunkter for brugere:<br>


<%
Dim strSQL : strSQL = "SELECT * FROM menuItem INNER JOIN users_menuItem ON menuItem.id = users_menuItem.menuItemID WHERE userID = "
Dim strSortBy : strSortBy = " ORDER BY menuItem.sortID ASC"

Dim objMenuRS

for i = 0 To Ubound( arrUsers, 2 )
    Set objMenuRS = objConn.Execute( strSQL  & arrUsers(0, i ) & strSortBy)
    if( not objMenuRS.eof ) then
        Response.Write( "<b>" & arrUsers(1, i ) &  "</b><br>" )
        while not objMenuRS.eof
            Response.write( "<a href=""" & objMenuRS("menuLink") & """ title=""" & objMenuRS("menuText") & """><img src=""" & objMenuRS("menuPic") & """ border=""0""></a><br>" )
            objMenuRS.MoveNext
        wend
        Response.Write( "<br>" )
        objMenuRS.Close
    end if
next

%>

<%
objConn.Close
Set objConn = Nothing
%>

</body>

</html>

Men når jeg loader denne side får jeg følgende fejl:
---------------------------------------------
Tekniske oplysninger (for supportteknikere)

Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A000D)
Typer stemmer ikke overens: 'Ubound'
/test/3/user.asp, line 20


Browsertype:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)

Side:
GET /test/3/user.asp
----------------------------------------
Er det fordi siden ikke ved hvilken user der er på endnu??
Hvordan skal min login side hænge sammen med dette ?
Jeg havde tænkt at min login side skulle læse en cookies, og hente brugernavn"email"
men der er nogle af brugerne der deler computer, så det er vel ikke den bedste løsning?

Ellers er det bare kanon det du har lavet, og jeg glæder mig til at det kommer til at spille..

//Claus
Avatar billede nute Nybegynder
27. marts 2004 - 14:04 #7
ah ... det var vidst ikke bare bare at sætte koden for sig selv, kan jeg se ... den var afhængig af den kode der var skrevet tidligere i scriptet også ... undskyld :-)

anyway ... jeg ville lavet det på en lidt anden måde, ved at bruge sessions. jeg har lavet et lille login system og en side hvor menuen for den påloggede bruger, bliver skrevet ud. bemærk ... alle de sider som du vil beskytte med password, skal have denne stump kode i toppen:

if( Session( "userid" ) = "" ) Then
    Response.Redirect( "login.asp" )
End if

du kan se systemet på

http://xperimentum.com/xperten/482121/default.asp

alle filer jeg bruger, ligger også som .txt filer, så hvis du vil se koden, så er det bare at skifte .asp ud med .txt i filnavnet. db'en ligger der stadig, det samme gør menuadmin.asp.

alle brugere har password '1234' ... hvilke brugere der ligger i basen, kan du jo se fra menuadmin.asp

/nute
Avatar billede hinca Nybegynder
28. marts 2004 - 11:13 #8
--nute
Når jeg prøver at sætte et flueben i menuadmin.asp får jeg følgende fejl:
Tekniske oplysninger (for supportteknikere)

Fejltype:
Microsoft JET Database Engine (0x80004005)
Der kan ikke slettes fra de angivne tabeller.
/test/4/menuadmin.asp, line 39


Browsertype:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)

Side:
POST 191 bytes to /test/4/menuadmin.asp

POST Data:
chkUserMenuItem_2_1=1%A41&chkUserMenuItem_4_1=1%A41&chkUserMenuItem_1_2=2%A42&chkUserMenuItem_2_2=2%A42&chkUserMenuItem_4_2=2%A42&chkUserMenuItem_1_4=4%A44&chkUserMenuItem_2_4=4%A44&mode=save

ved du hvorfor jeg får denne fejl ??

//Claus
Avatar billede hinca Nybegynder
28. marts 2004 - 11:15 #9
Jeg skal lige sige at der fuld rettigheder til stedet hvor filerne ligger.

//Claus
Avatar billede nute Nybegynder
28. marts 2004 - 20:13 #10
du skal give rettigheder på basen. højreklik > properties > security > markér system og set flueben i write.

/nute
Avatar billede hinca Nybegynder
29. marts 2004 - 06:18 #11
ja, det er jo klart.... jeg havde kun givet administrator rettigheder til af skrive til db. Men nu virker det.
Lige et spørgsmål mere. hvis jeg vil udvide databasen med flere menupunkter så får jeg en fejl:
Fejltype:
Der opstod en Microsoft VBScript-kørselsfejl (0x800A0009)
Indekset er uden for området: '4'
/test/4/menuadmin.asp, line 85

Jeg kan ikke lige gennemskue koden med hvordan jeg får øget dette til feks. 6 eller 8

//Claus
Avatar billede nute Nybegynder
29. marts 2004 - 09:39 #12
ja, det kan jeg godt se. Endnu en lille bug som ikke blev fanget i min test fordi jeg tilfældigvis havde samme antal menupunkter som brugere :-|

Problemet ligger i linie 85 ... arrayet 'arrUsers' skal bruge 'j' iteratoren, ikke 'i' som jeg har brugt i den anden reference til arrayet.

med andre ord - denne linie:

Response.Write( "<td><input type=""checkbox"" name=""chkUserMenuItem_" & arrUsers( 0, j ) & "_" & arrMenuItems(0, i) & """ value=""" & arrUsers( 0, i ) & "¤" & arrMenuItems(0, i) & """" & strChecked & "></td>" )

skal være:

Response.Write( "<td><input type=""checkbox"" name=""chkUserMenuItem_" & arrUsers( 0, j ) & "_" & arrMenuItems(0, i) & """ value=""" & arrUsers( 0, j ) & "¤" & arrMenuItems(0, i) & """" & strChecked & "></td>" )

/nute
Avatar billede hinca Nybegynder
29. marts 2004 - 14:55 #13
--nute
Nu virker der, og jeg kan kun sige at du virkelig har fortjent dine point.
Smid lige et svar så du kan få dem.
Håber jeg må trække på din hjælp næste gang jeg har et problem

//Claus
Avatar billede nute Nybegynder
29. marts 2004 - 14:58 #14
det var da godt at høre :) og joda ... jeg hjælper gerne, hvis det er noget jeg kan hjælpe med :o]
Avatar billede hinca Nybegynder
29. marts 2004 - 16:07 #15
--nute
Jeg har en del mp3 album på computeren og kunne godt tænke mig at man kunne gå ind på en side feks. A.asp og se alle de kunstner der starter med A.
Herfra skal man så kunne trykke på en kunstner og så se alle kunstnerens album hvor der også bliver vist et lille billede af albummet.
Når man så har fundet et album og trykket på det, så skal man naturligvis kunne se alle musikfilerne samt downloade enkelt filer eller hele albummet.

filerne ligger på følgende måde.

E:\musik\Abba\ALBUM1\track1.mp3
E:\musik\Abba\ALBUM1\track2.mp3
E:\musik\Abba\ALBUM1\front.jpg
E:\musik\Johnny Madsen\ALBUM1\track1.ogg
E:\musik\Johnny Madsen\ALBUM1\track2.ogg
E:\musik\Johnny Madsen\ALBUM1\front.jpg
E:\musik\Johnny Madsen\ALBUM1\back.jpg
E:\musik\Johnny Madsen\ALBUM2\track1.mp3
E:\musik\Johnny Madsen\ALBUM2\track2.mp3
E:\musik\Johnny Madsen\ALBUM2\front.jpg

Håber det er forklaret nogenlunde klart..

\\Claus
Avatar billede nute Nybegynder
29. marts 2004 - 16:19 #16
dette er jo dybest set et helt andet spm ;o]

jeg ville have løst dette ved at lægge alle filer ind i en database. det bliver nemmere at holde styr på samt at søge i.

jeg ville have løst det på følgende måde:

- du laver en "crawler" - et script der løber alle dine filer (i e:\musik) igennem. scriptet tolker første folder, under e:\musik, som artist, anden folder som album og derefter filnavnet.
- for hver artist scriptet støder på, så tjekker det om denne artist allerede eksisterer i din database. hvis artisten ikke eksisterer, så lægger scriptet artisten i basen.
- samme princip følges for album
- samme princip følges for filnavn

herefter kan du lave en side der lister ud alle dine filer. du kan søge efter artister, album og filnavn ... *meget* mere simpelt end at skulle behandle filer på samme måde

/nute
Avatar billede hinca Nybegynder
29. marts 2004 - 17:57 #17
Ja jeg ved godt det er et nyt spørgsmål, og har derfor også oprettet det på http://www.eksperten.dk/spm/483422
Jeg ville helst have at jeg slap for at bruge en database, så ændringer i filnavne ol. ikke også skulle ændres i db.

//Claus
Avatar billede hinca Nybegynder
30. marts 2004 - 22:19 #18
--Nute
Er det iøvrigt muligt af få TARGET med i linken i db.
Jeg bruger frames på min side og det er jo ikke så heldigt at det åbner de forkerte steder.

//Claus
Avatar billede nute Nybegynder
30. marts 2004 - 22:49 #19
selvfølgelig er det muligt ! hvorfor kan du ikke bare oprette en kolonne der hedder 'target' i 'menuItem' tabellen ? denne skriver du så ud sammen med dit link.

hvis du ikke vil have target på et link, så undlader du bare at lægge værdi ind.
Avatar billede hinca Nybegynder
31. marts 2004 - 06:29 #20
--Nute
Fordi jeg ikke ved hvordan jeg skal ændre linjerne i scriptet.
Jeg håbede at man kunne skrive noget ala.. misik.asp;target="main" eller hvordan det nu skulle stå.
Men det er også helt fint at lave en ny kollone og så have target der.
Jeg ved bare ikke hvor og hvordan linjerne skal se ud.

//Claus
Avatar billede nute Nybegynder
31. marts 2004 - 09:35 #21
"Fordi jeg ikke ved hvordan jeg skal ændre linjerne i scriptet." - hmm... hvordan vil du så få lagt til noget, hvis du ikke vil ændre noget ?

Det havde også været på sin plads at fortælle hvor meget asp du egentlig kunne. Jeg kan godt forstå nu, at det er *meget* begrenset viden du har, om både HTML og ASP. Jeg regnet med at du kun havde behov for hjælp til at løse din opgave, fordi du ikke vidste hvordan du skulle gribe det an. Men jeg mener helt ærlig ... en lille indsats fra din side, er også påkrævet.

Du kan, med minimale ændringer, sætte

<base target="[NAVN PÅ DIN FRAME HER]">

som det første tag umiddelbart dit <body> tag. Dette gør at alle links på den siden du har dette på, åbnes i den frame du angiver.

/nute
Avatar billede hinca Nybegynder
31. marts 2004 - 14:34 #22
--Nute
Du har fuldstændigt ret... Min viden er begrænset !!
Jeg kan saktens gennemskue html kode og rette i den, men specialist bliver jeg nok aldrig. Når vi kommer til vb asp og andre script sprog, så er jeg mange gange stået af, da noget af dette overhovedet ikke er til at gennemskue, og når man så skal rette i det, ja det gør det jo ikke bedre.
Jeg vil MEGET gerne rette i scriptet, men det kræver jo at jeg ved hvad der skal stå.
<base target="[NAVN PÅ DIN FRAME HER]"> kunne godt have været brugt, men ikke alle sider skal åbne i samme frame.
Derfor syntes jeg rigtigt godt om dit foreslag med at tilføje en ekstra kollone i db.
Men jeg ved ikke hvordan linjen i scriptet skal ændres så det bliver rigtigt.
200 point er nok ikke meget for den hjælp jeg søger, men det er åbenbart ikke muligt at give mere herinde. Men jeg starter gerne et par nye spørgsmål så du kan få noget mere for din hjælp

//Claus
Avatar billede nute Nybegynder
31. marts 2004 - 14:54 #23
hvis du laver en ny kolonne (som hedder 'menuTarget') i din database, så skal du bare skrive denne ud på denne måde:

while not objMenuRS.EOF
    Response.write( "<a href=""" & objMenuRS("menuLink") & """ title=""" & objMenuRS("menuText") & """ target=""" & objMenuRS( "menuTarget" ) & """>" )
    Response.write( "<img src=""" & objMenuRS("menuPic") & """ border=""0""></a><br>" )
    objMenuRS.MoveNext
wend

med andre ord, så er det denne kode der skal ind, der du skriver ud dine links:

target=""" & objMenuRS( "menuTarget" ) & """

/nute
Avatar billede nute Nybegynder
13. april 2004 - 10:29 #24
sker der noget her ?
Avatar billede svart Nybegynder
25. juni 2004 - 17:46 #25
hinca minder dig lige på at du har en del spørgsmål ude og ialt 750 point.

Du har blandt andet glemt mig og per-olof på dette spørg: http://www.eksperten.dk/spm/509880
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