10. maj 2006 - 12:48Der er
13 kommentarer og 2 løsninger
Gem indhold af sub i variabel
Jeg har en database som bl.a. indeholder en tabel der hedder content.
Indholdet i denne tabel indeholder min hjemmeside med alle HTML koder.
Derudover er der også nogle specialkoder, f.eks. $$$specialkode$$$ som i bund og grund er nogle eksterne asp filer som bliver eksekveret når siden bliver kaldt med server.execute
Når jeg så henter indholdet ind på min hjemmeside har jeg en sub som kigger mit content igennen og eksekverer mine specialkoder og præsenterer det hele på hjemmesiden.
Min sub ser således ud:
<% SQL = "select content from TABEL where id=3" set rs = conn.execute(SQL) content = rs("content") rs.close set rs = nothing
executenavne = "specialkode"
sub RepKode(content, keys) Set CMregEx = New RegExp CMregEx.IgnoreCase = True CMregEx.Global = True CMregEx.Pattern = "[\$]{3}(" & Replace(keys, ",", ")[\$]{3}|[\$]{3}(") & ")[\$]{3}" Set Matches = CMregEx.Execute(content) startpos = 1 For Each Match In Matches pos = Match.FirstIndex + 1 Response.Write Mid(content, startpos, pos - startpos) Server.Execute("/mappe/" & Replace(Match.Value, "$", "") & ".asp") startpos = pos + Len(Match.Value) Next Response.Write Mid(content, startpos) End sub %>
På selve hjemmesiden indsætter jeg så indholdet med: <% call RepKode(content, executenavne) %>
Alt dette virker perfekt.
Jeg vil nu gerne udvide min hjemmeside med en søgefunktion, så jeg skal have indholdet af hver side - incl. indholdet af de eksekverede specialkoder - gemt i en ny tabel i databasen så jeg kan søge i denne.
Jeg har forsøgt en masse ting som jeg ikke kan få til at virke, og en psydo-kode kunne se således ud:
variabel = call RepKode(content, executenavne)
- og så indsætte denne variabel i databasen, men denne virker naturligvis ikke :o(
Du skal umiddelbart have lagt indholdet over i en streng som du kan returnere fra din rutine (der så skal ændres til at være en function):
Function RepKode(content, keys) dim tmp tmp = "" Set CMregEx = New RegExp CMregEx.IgnoreCase = True CMregEx.Global = True CMregEx.Pattern = "[\$]{3}(" & Replace(keys, ",", ")[\$]{3}|[\$]{3}(") & ")[\$]{3}" Set Matches = CMregEx.Execute(content) startpos = 1 For Each Match In Matches pos = Match.FirstIndex + 1 tmp = tmp & Mid(content, startpos, pos - startpos) Server.Execute("/mappe/" & Replace(Match.Value, "$", "") & ".asp") startpos = pos + Len(Match.Value) Next tmp = tmp & Mid(content, startpos) RepKode = tmp End Function
Dette er dog kun en halv løsning, da det output som dine server.execute leverer ikke kommer med i dette... du skal med andre ord givetvis have splittet din arkitektur ad for at kunne håndtere dette behov.
En vild (og nok ikke særlig pratisk anvendelig) idé, er at indlæse dine asp-filer manuelt og smide dem igennem RepKode-funktionen, så du rekursivt fortolker dine asp-filer. Det betyder så også at du selv skal udfør ASP-koden i dine ASP-filer (det kunne du måske have held til at gøre med Execute-kommandoen i VBScript), men det vil kræve at du kører VBScript koden i disse ASP-filer igennem en forberedende parsing som sørger for at omsætte de korte notationer til noget eksekverbart (f.eks. skal <%=Tekst%> omsættes til Response.Write Tekst).
Ja, det var jeg også selv kommet frem til, det går galt med server.execute delen som ikke kommer med.
Det er netop den del der volder mig problemer, ellers kan jeg søge i den nuværende tabel :o)
Jeg har eksperimenteret lidt videre og jeg kan godt indlæse mit call i et tekstfelt i en formular og så submitte denne form og derved indsætte indholdet i databasen, men jeg orker ikke at sidde og gøre dette manuelt hver gang jeg ændrer noget. Der er rigtig mange sider :o)
Jeg kan ikke lige gennemskue om man kan gøre følgende:
Jeg kalder en side, f.eks. opdater.asp som looper igennem alle id numre i databasen
For hvert loop indsætter den indholdet i et tekstfelt(form) og submitter formen - gemmer og fortsætter til næste id nr.
Det er fint at jeg skal aktiverer denne del selv, hvis bare den selv kan loope igennem og gemme i databasen.
Du kan lave et HTTPRequest på serveren som submitter din form automatisk, rent faktisk ville det være bedst hvis du kunne sætte en "scheduled task" op på webserveren (eller en anden maskine), så kunne kalde din webserver for alle de tekster der skal submittes...
Sådan en fætter kan du så bare sætte til at køre med jævne mellemrum, så dit søgeindeks er up-to-date (minus x antal timer)...
ja jeg har nu fået noget bikset sammen med HttpGet som jeg tror vil virke, dog skal jeg manuelt kører den da jeg ikke har adgang til cron jobs eller lign.
Smid et svar, så får du pointene for god sparring :o)
Du kan godt beholde størstedelen af point - jeg skulle jo ikke lave noget ;-)
I øvrigt kan du bare sætte en planlagt handling op på din lokale maskine som udfører denne handling (med mindre din maskine ikke er tændt hver dag?)...
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.