Just nu i M3-nätverket
Gå till innehåll

sessionsvariabler och cache


triniverse

Rekommendera Poster

triniverse

Hej!

 

Jag har ett intrikat problem, som jag hoppas någon kan ge mig goda råd till och som gärna har haft egen erfarenhet av samma problem.

 

Min uppgift har varit att skapa en till synes enkel sökfunktion för flera olika register. Varje register är lagrad i en egen databastabell, men de är annars likartat uppbyggda.

 

Tanken är att man ska kunna söka i alla dessa register samtidigt och få upp träffar ur de olika registren och kolla på de träffar man fått i ett register i taget om man så vill. Det innebär alltså att man snabbt ska kunna växla mellan olika register.

 

Jag har löst det genom att scriptet läser in en slags konfigurationsfiler med sessionsvariabler som lagrar info om de olika tabellerna. Variablerna är desamma hela tiden, men skiftar värde beronde på vilket register man tittar på för tillfället. Sessionsvariablerna lagarar bland annat tabellnamn, kolumnnamn, användarvänliga namn för tabellen och kolumnerna, infotexter som skiljer sig för de olika registren, samt en rad andra värden som skiljer sig från register till register. Så värdena i variblerna skiftar så fort man byter register. Men det är även möjligt i scriptet att hålla flera av värdena i minnet samtidigt, vilket är nödvändigt då man t ex ska göra en sökning i samtliga register.

 

Problemet är att jag tyckte att det var enklast att använda sessionsvariabler för att lagra dessa värden. Och det funkade alldeles utmärkt, fram till dess att en kollega testkörde och använde browserns fram- och tillbaka-knappar, istället för att använda de knappar som fanns i html:n. De knapparna i html:n var kopplade till asp-funktioner som ändrade vissa av de här sessionsvariablerna då man klickade på dem. Men när han backade tillbaka några sidor med hjälp av browserns knappar så kördes inte den kod som "låg i knapparna" och sessionsvariablerna innehöll då ibland värden från fel register. Och eftersom sidan ändå fanns i cachen så försökte den återskapa sidan med fel sessionsvariabel-värden. Det blev alltså helt fel då.

 

Just nu har jag gjort en ful-lösning med en massa komplicerade if-satser som försöker kontrollera om en sida lagrats från cachen, eller inte, men det funkar inte perfekt och verkar praktiskt omöjligt att få till det att funka bra.

 

Ett litet förtydligande och exempel på problemet:

1. Jag gör en sökning i scriptet och får träffar i två olika register.

2. Jag klickar upp träffarna i ena registret

3. Går tillbaka till register-träfflistan och klickar fram träffarna i det andra registret.

4. Nu vill jag gå tillbaka till de första träffarna igen, och använder då tillbaka knapparna för att komma till det, men nu har scriptet fortfarande värden för att hämta data från den andra tabellen i minnet och använder de värdena för att hämta data från det första registret i den cachade sidan.

 

Någon som haft liknande problem eller nån som har förslag på en lösning? Scriptet innehåller alltså ganska många olika variabler som kan byta värden ofta. En lösning utan sessionsvariabler skulle väl kräva att en väldig massa information skickades genom t ex POST, för att sedan extraheras på nästa sida. Och jag är inte riktigt säker på om det löser cache-problemet heller.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Jag tycker din lösning verkar aningens förvirrande. Men om jag tolkar dig rätt så vill du söka i en databas, men flera tabeller? Vad har du för databas? Sql-server, access, mysql?

 

Om det är sql-server eler mysql så borde du skapa procedurer. Dessa procedurer tar emot parametrar, tillexempel värdet i sökrutan och ger tillbaka ett resultat. Likadant så skapar du en procedur för att hämta detaljerna för respektive register. På så vis behöver du inte spara undan knepiga variabler, eftersom proceduren kommer hålla reda på sql-frågorna åt dig.

 

Det enda du behöver hålla reda på är att anroppa rätt procedur för rätt register.

 

Länk till kommentar
Dela på andra webbplatser

triniverse

Hej!

 

Ursäkta sent svar. Förstår om det verkar förvirrande.

Japp, jag ska söka i EN databas som har FLERA tabeller. Tabellerna är inte på något sätt kopplade till varandra, utan innehåller flera likartade register som man enkelt och snabbt ska kunna hoppa mellan med webblösning.

 

Jag har under utvecklingen använt MySQL, men det kommer senare köras på SQL Server och jag vill hålla mig till standard-SQL för att enkelt kunna byta till ev ytterligare databaser då det är möjligt att detta script ska kunna köras på andra ställen där de använder olika databaser. Därför är SQL-procedurer inget alternativ tyvärr, men tack för tipset! Men jag vet inte om det skulle löst problemet heller.

 

Ska försöka förtydliga mig, då problemet klarnat något för min egen del.

 

Jag lagrar information om vilken tabell som ska anropas i en sessions-variabel (och det är nog det som är det huvudsakliga problemet). När en användare har varit inne på flera olika register och backar tillbaka med browserns tillbaka-knappar så får den upp cachade sidor av tidigare databaser, so far so fine. Men om användaren då trycker på t ex knappen "visa nästa 10 poster", så anropar scriptet fel databas, eftersom sessionsvariabeln inte cachas utan ligger på servern (vilket jag inte insett tidigare). Så sessionsvariabeln innehåller alltså den tabell som jag senast aktivt anropade.

 

Så jag antar att jag inte skulle ha använt sessionsvariabler från första början?

 

Länk till kommentar
Dela på andra webbplatser

Alla databaser värt namnet använder procedurer. Det är nästan bara access och sqlite som inte gör det. Så procedurer är nog rätt väg att gå hur som helst.

 

Sessionsvariabler borde dessutom bara användas till sånt som faktiskt är relaterade till sessionen. Tillexempel vem som är inloggad. Eller spara undan information som används i ett flöde med flera sidor.

 

Så plocka bort dina sessionsvariabler och lägg informationen i querystring eller i hiddenfält.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...