23. januar 2003 - 21:16Der er
76 kommentarer og 1 løsning
Array eller ?
Jeg har lavet et artikel system. Når man vil oprette en artikel skriver man først overskriften og derefter en introduktion til artikel også har jeg lavet et felt hvor de kan skrive ind hvor mange sider artiklen skal være på. Når man så trykker submit bliver man smidt videre til en side, hvor man kan oprette de antal sider som man nu har tastet ind, stien ser nogenlunde sådan ud: opret_sektioner.asp?artid=9&antalsider=3
Så har jeg lavet et loop som udskriver forms, alt efter hvor mange sider man vil have, det ser sådan ud:
For sidenr = 1 To AntalSider Her udskrives forms'ne så Next
Mit problem er så, at alle forms'ne kan jo ikke hedde det samme, hvis man nu har sagt at man vil have 3 sider, så skal forms'ne jo f.eks. hedde:
Sidenavn1 Indhold1
Sidenavn2 Indhold2
osv.
Jeg ved at jeg skal lave en form for array, men jeg synes ikke rigtigt at jeg kan finde den rigtige metode til at gøre det. Håber at der er en der kan hjælpe.
der er bare et lille problem ved at gøre det på den måde der jespernaur: Jeg plejer at gøre det sådan her når jeg laver en side hvor man kan submitte noget:
Noget allá det der også mine forms, ser nogenlunde sådan ud: <input type="text" name="SideNavn" value=""& SideNavn &""> <input type="text" name="Indhold" value=""& Indhold &"">
Hvis jeg skal gøre det som jeg vil, kan jeg jo ikke gøre det på den måde der, uden at bruge noget array, for man kan jo ikke sige:
Det ser ikke rigtigt ud til at virke optimalt. Jeg skal bruge noget alle variablerne og forms'ne kommer til at hedde noget forskelligt, hvis du forstår hvad jeg mener ?
Nej, jeg forstår det ikke helt, da det du senest har skrevet indeholder oplysninger, der aldeles ikke fremgår af det oprindelige spørgsmål.
Sådan som jeg opfattede det, har du brug for at der på en enkelt side bliver oprettet et variabelt antal forme, hvor det ønskede antal kommer ind over en URL-parameter, omtrent som følger:
opret_sektioner.asp?artid=9&antalsider=3
Så kan du indefra opret_sektioner.asp få fat i antallet af sider med
AntalSider = Request.QueryString("antalsider")
Så kommer løkken, den skaber 'antalsider' forme på siden:
Jeg forstår godt hvad du mener med det og det du har skrevet der, har jeg også brugt før dvs. jeg kan godt bruge det der, men jeg skal bruge noget mere:
Den metode som jeg plejer at bruge, den som jeg beskrev længere oppe, skal jeg have lavet lidt om på, sådan at: SideNavn = Request.Form("SideNavn") bliver til: SideNavn1 = Request.Form("SideNavn1") SideNavn2 = Request.Form("SideNavn2") osv.
Det er det jeg ville have været frem til fra starten af, men det har været lidt svært at forklarer det ordenligt.
det du skal gøre er egentlig ret simpelt !! du skal lege lidt med collections...
På siden der skal requeste dine forms skriver du
Set conntemp = Server.CreateObject("ADoDB.Connection") conntemp.open DSN
For each item in Request.Form If Left(item, 4) = "side" Then SQL = "INSERT INTO TABLE (SIDENAVN, INDHOLD) VALUES ('"& Right(item, 1) &"', Request.Form(item) &"')" conntemp.execute(SQL) Next
conntemp.Close
Denne fremgangmåde kræver at du navngiver dine inputs med dette mønster: side1, side2, side3, side4 osv.
man må vel kunne lave et array af en art, som ligger inde i det loop som jeg har lavet og laver: SideNavn1 = Request.Form("SideNavn1") SideNavn2 = Request.Form("SideNavn2") alt efter hvor mange sider man vil lave..
Det begynder at ligne et tilfælde for 'Execute' funktionen. Execute tillader dig at opbygge en streng med noget kode, og derefter få det udført. Noget i retning af:
For sidenr = 1 To AntalSider str = "SideNavn" & sidenr & " = Request.Form(""SideNavn" & sidenr & "")" Response.Write "vil nu udføre " & str & "<br>" ' dette er en testudskrift Execute str Next
jespernaur>> og hvis det er min kommentar omkring php/asp du hentyder til, så kommer du ikke udenom at det er noget gammelt skidt... ligesom at du ikke vil råde nogen til at lære windows 95.
Det ser lovende ud, men jeg tror ikke at du har forstået hvad jeg mener ellers har jeg bare ikke kunne forklarer det ordenligt...jeg prøver lige engang til:
Først har jeg mit loop: For sidenr = 1 To AntalSider 'AntalSider for jeg fra Request("AntalSider")
Inde I det loop skal jeg kan lavet et array som kan gøre følgende følgende: (taget fra mit originale script)
Det overstående skal laves for det antal sider som der nu er i Request("AntalSider") og for hver side, skal alle variablerne osv. have hvert sit nummer dvs. hvis tallet i Request("AntalSider") nu er 4 skal det se sådan ud:
NEJ... du behøver IKKE at hive dine inputs ind i hver sin variabel !!
hvis vi nu tager det fra starten... 1) jeg vil lave det lidt anderledes end du har lavet det... giv mig 5 minutter, så viser jeg dig en side hvorpå det fungerer som jeg tror du vil have det
koden til siden som jeg lavede er følgende... rimelig enkelt og ligetil, så mon ikke du kan rette den til så den passer til dit behov?
<% If Request.ServerVariables("REQUEST_METHOD") = "POST" Then For Each item In Request.Form If Left(item, 5) = "Tekst" Then Response.Write "Du skrev følgende på side "& Right(item, 1) &":<br />" Response.Write Request.Form(item) &"<br /><br />" End If Next
Else
intPages = Request.Querystring("sider") If intPages = "" Then intPages = 1 Else intPages = CInt(intPages) End If %> <form method="post" action="default.asp"> <% For i = 1 to intPages Response.Write "Side "& i &"<br />" Response.Write "<input type=""text"" name=""Tekst"& i &"""> <br /><br />" Next %> <input type="submit" value="submit"> </form>
<% End If %>
En anden måde at gøre det på er at du giver dine input's navnene sidenavn1, fonttype1, fontstørrelse1, fontfarve1, tekst1 osv... PLUS at du laver et hidden field der f.eks. hedder antalsider, som indeholder værdien på antal sider... på den måde kan du nemlig hente dine felter ud på denne måde:
For i = 1 to Request.Form("antalsider") Sidenavn = Request.Form("sidenavn"& i) Fonttype = Request.Form("fonttype"& i) osv. osv.
SQL = "INSERT INTO tabel (sidenavn, fonttype...) VALUES ('"& Sidenavn &"','"& Fonttype &"',...) Conn.Execute(SQL) Next
Jeg har lige prøvet dit sidste forslag der, jeg kan se at det burde virke, men den kommer med en fejl længere oppe i mit script, jeg tænkte på om du lige kunne kigge på det, jeg har ikke selv never til at sidde og kigge på det mere.
Hvis du gider, så kan jeg da lige skrive URL'en til dig og fejlmeldelingen selvfølgelig.
det som sker er at, når du trykker på submitknappen, bliver du sendt hen til denne side http://www.cichlide-net.dk/opret_sektioner.asp?side=opret, og her er det IKKE noget der hedder artID, og derfor vil den være tom når du executer din sqlstreng.
heheh... det gør den også... du skal dog huske på, at vbscript bliver udført fra oven og ned... det har både sine ulemper, og fordele... flest ulemper, hvilket betyder at du skal dele din side op i to, en til hvad der skal køre når side = opret, og en til resten... en bedre måde at gøre det på var måske at tjekke om der bliver postet til siden...
If Request.ServerVariables("REQUEST_METHOD") = "POST" Then 'Der er sørme blevet postet til siden, så mon ikke vi skal udføre lidt databasesjov? Else 'Æv hvor kedeligt... siden bliver bare vist normalt End If
hmm, det var vist ikke ordenlig dansk... det jeg ville sige var, at IIS sørger for at eksekvere AL koden på siden, med mindre du fortæller den at "det må du ikke"... og siden at du ingen steder har skrevet at
SQL_FIND_ARTIKEL = "SELECT * FROM ARTIKLER WHERE ARTID = "& Request("ArtID") Set rsFindArtikel = conntemp.execute(SQL_FIND_ARTIKEL)
ikke må køre, hvis side = opret, så gør den det, selvom ArtID er tomt
nu kan jeg selvfølgelig ikke se koden for din side, men det nemmeste ville nok være, at poste fra opret_sektioner.asp til opret_sektioner_nu.asp og så redirecte tilbage til opret_sektioner.asp når du har sat data'erne ind i databasen.
http://www.cichlide-net.dk/opret_sektioner.txt <-- du kan stadig se koden for siden der... Nu har jeg gjort som jeg beskrev før, tror du at det er noget som virker eller er jeg helt på den forkerte side ??
ah... sidst jeg kiggede på siden havde du ikke opdateret den med den nye kode...
jo, sådan er den mest normale måde at gøre det på.. HUSK dog at redirecte brugere tilbage til opret_sektioner.asp, ellers vil han bare blive præsenteret for en blank side :( Jeg vil også anbefale dig, nej... nærmest tvinge dig til, at bruge det REQUEST_METHOD tjek, da man ellers bare kan gå ind på opret_sektioner.asp?side=opret, og på den måde få en træls fejl.
så ElseIf Request("side") = "opret" And Request.ServerVariables("REQUEST_METHOD") = "POST" Then For i = 1 To Request.Form("AntalSider") ArtikelID = Request("artid") SideNavn = Trim(RemoveHTML(HTMLConv(Request.Form("SideNavn"& i)))) Tekst = Trim(RemoveHTML(HTMLConv(Request.Form("Tekst"& i))))
Set conntemp = Server.CreateObject("ADoDB.Connection") conntemp.open DSN SQL_NY_SEKTION = "INSERT INTO ART_SEKTIONER (SEK_ARTID, SEK_SIDENR, SEK_TITEL, SEK_INDHOLD) " &_ "VALUES ('"& ArtikelID &"', '"& sidenr &"', '"& VildereTegn(SideNavn) &"', '"& VildereTegn(Tekst) &"')" conntemp.execute(SQL_NY_SEKTION) conntemp.Close Next End If
Det virker da sådan nogenlunde, men den kommer med en fejl:
Microsoft VBScript runtime error '800a000d' Type mismatch: '[string: "2, 2"]'
/opret_sektioner.asp, line 226
Du kan selv lige prøve hvis det er, jeg tror det er fordi den løkke der bliver lavet, ikke funker ordenligt, for den indsætter nogle tal, isteder for teksten som man skriver ind.
prøv at converter din Request.Form("AntalSider") til et tal...
CInt(Request.Form("AntalSider"))
det er nok en af de mest trælse ting i scriptsprog, at alle variabler er af typen variant... dette gør at du skal være ekstra påpasselig med at tjekke om de inputs du får er af den rigtige type... tal, streng eller noget tredie
<% If Request.ServerVariables("REQUEST_METHOD") = "POST" Then For Each item In Request.Form If Left(item, 5) = "Tekst" Then Response.Write "Du skrev følgende på side "& Right(item, 1) &":<br />" Response.Write Request.Form(item) &"<br /><br />" End If Next For i = 1 To CInt(Request.Form("AntalSider")) Response.Write i Next
Else
intPages = Request.Querystring("sider") If intPages = "" Then intPages = 1 Else intPages = CInt(intPages) End If %> <form method="post" action="default.asp"> <% For i = 1 to intPages Response.Write "Side "& i &"<br />" Response.Write "<input type=""text"" name=""Tekst"& i &"""> <br /><br />" Next %> <input type="hidden" name="AntalSider" value="<%= intPages %>"> <input type="submit" value="submit"> </form>
som sagt, så kan du se at koden ( For i = 1 To CInt(Request.Form("AntalSider"))) er nøjagtig samme som din, og det er det hidden field også (<input type="hidden" name="AntalSider" value="<%= intPages %>">) så med mindre at du har to navne der hedder AntalSider, så forstår jeg ikke hvorfor at den ikke kan køre en CInt på værdien
Jamen der er jo mere en et felt der hedder AntalSider, men det er jo den løkke der går det, det kan jeg jo ikke undgå...men jeg ved jo ikke om det har noget med det at gøre.
Hvis vi nu kunne få det andet forslag til at virke, så ville det jo være noget smartere.
Tror vi har fundet problemet måske...hvis du kigger på siden(lige ovenover submit knappen) der har jeg skrevet Request.Form("AntalSider") ud og der står 0.
halloo... du kan ikke skrive Request.Form("AntalSider") ud FØR at siden er postet !!
skriv hellere sådan her
ElseIf Request("side") = "opret" And Request.ServerVariables("REQUEST_METHOD") = "POST" Then Response.Write Request.Form("AntalSider") For i = 1 To CInt(Request.Form("AntalSider"))
Nej, jeg forstår ikke at den det...det må vel være fordi at den tallet ind i Request.Form("AntalSider"), efter hvor højt tallet er. Hvis det havde været 3, så havde den skrevet 3, 3, 3..
Nej, jeg forstår ikke at den gør det...det må vel være fordi at den sætter tallet ind i Request.Form("AntalSider"), efter hvor højt tallet er. Hvis det havde været 3, så havde den skrevet 3, 3, 3..
Det virker meget meget absurd, for det burde den slet ikke... :( du kunne evt. prøve at sende antal sider som querystring istedet.... altså opret_sektion.asp?mode=opret&sider=4, og så requeste det med Request.Querystring("sider") istedet for Request.Form("AntalSider")... hvis det HELLER ikke virker, så er jeg helt på bar bund
Der var da noget der virkede, men jeg ville ønske at jeg ikke havde flere problemer (det ville du nok også :D), men prøv at kig lidt på det den skriver en i database, ligemeget hvad man skriver i forms'ne:
hehe... kære psyclown... da jeg skrev at du kunne bruge For i = 0 to Request.Querystring("AntalSider") lå det implicit i mit indlæg, at du også skulle rette
Okay, nu er det rettet, nu kan man da se hvad der sker...den skriver alle felter i en SQL, jeg har dog heller ikke forstået hvorfor alle felterne skulle hedde SideNavn1, Tekst1 osv.
psyclown>> det skulle de fordi at vi skal kunne skelne mellem hvilket felt der hører til hvilken side...
jeg kan se på din side at du har kaldt alle dine felter for Navn1... det var jo ikke det du skulle... du skal kalde den første for Navn1, den næste for Navn2 og så fremdeleds
okay, men det var ikke sådan jeg havde forstået det du havde skrevet, men nu er det rettet. den kommer med denne fejl, hvis jeg sætter SQL'en til at virke igen:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression.
aaaarrrrrrggggggggg, nu troede jeg lige at jeg havde fået det hele til at virke, men den opretter kun en side, men det siger vel sig selv...den skal vel redirecte til siden hvor den opretter siderne, men hvordan skal det se ud..skal det bare være den sti som jeg submitter til eller ??
ElseIf Request("side") = "opret" And Request.ServerVariables("REQUEST_METHOD") = "POST" Then For i = 1 To Request.Querystring("AntalSider") ArtikelID = Request.Querystring("artid") SideNavn = Trim(RemoveHTML(HTMLConv(Request.Form("SideNavn"& i)))) Tekst = Trim(RemoveHTML(HTMLConv(Request.Form("Tekst"& i))))
Set conntemp = Server.CreateObject("ADoDB.Connection") conntemp.open DSN SQL_NY_SEKTION = "INSERT INTO ART_SEKTIONER (SEK_ARTID, SEK_SIDENR, SEK_TITEL, SEK_INDHOLD) " &_ "VALUES ('"& ArtikelID &"', '"& i &"', '"& VildereTegn(SideNavn) &"', '"& VildereTegn(Tekst) &"')" ' Response.Write (SQL_NY_SEKTION) conntemp.execute(SQL_NY_SEKTION) conntemp.Close Next Response.Redirect "opret_sektioner.asp?side=opret&artid="& Request.Querystring("artid") &"&antalsider="& Request.Querystring("AntalSider") &"" End If
weeeeeeee, endeligt virkede det. Nu mangler jeg bare at du lige svarer, så du kan få dine meget velfortjente point også vil jeg bare sige tak for hjælper og tak for din store tålmodighed :D
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.