16. maj 2005 - 06:41Der er
29 kommentarer og 2 løsninger
Tilføje mere indhold til en cookie
Jeg har en formular, hvori det er muligt at vælge et antal varer fra et katalog via en formular med felttypen "checkbox"...
Jeg giver brugere mulighed for at gemme x-antal valg/varer i en cookie via Response.Write fra et Request.Form, men da antallet at varer er meget stor, har det været nødvendigt at lave en paging (side: 1, 2, 3...)
Mit spørgsmål er så...
Hvordan gør jeg det muligt, at nye data gemt i nævnte cookie fra f.eks. side 1 bibeholdes, når brugeren på f.eks. side 4 tilføjer x-antal nye produkter?
Med andre ord, så skal der kunne tilskrives nye data i cookien, UDEN at de i forvejen gemte værdier overskrives!
Hvsi cookies måske ikke er vejen frem, hører jeg også meget gerne fra andre med bedre forslag!
Du tjekker vel bare om den er tom først og så putter du dens indhold med If request.cookie("din_cookie") <> "" then response.cookie("din_cookie") = request.cookie("din_cookie")&"ekstra indhold" end if
og så en else indhold = request.cookie("din_cookie") If indhold <> "" then response.cookie("din_cookie") = indhold&"ekstra indhold" else response.cookie("din_cookie") = "ekstra indhold" end if
alternativ for cookies er sessions. Forskellen er at sessions ligger på serveren, cookies hos brugeren. Sikkerhed er større hos sessions end cookies, men jeg ved ikke hvor meget det gør med sikkerhed hvis det er en indkøbskurv. Den har brugeren jo ingen grund til at ødelægge. Det må være programmørens valg ;o)
Hvor meget fylder det mon i dine cookies? I spørgsmålet her diskurterer de lidt om hvor mange cookies man kan lave og hvor meget de må fylde. Max 20 pr gang, max 300 ialt, max 4kb pr stk http://www.eksperten.dk/spm/618025 Så hvis du kommer til at overskride 4kb pr stk, så bør du nok overveje en anden løsning som sessions eksempelvis
Set fra programmerens synspunkt er der jo næsten ingen kode som skal laves om Mit foreslag med cookies 10:27:15 i sessions vil være --- indhold = session("din_session") If indhold <> "" then session("din_session") = indhold&"ekstra indhold" else session("din_session") = "ekstra indhold" end if --- Så man refererer jo til dem næsten på samme måde. Dog mere direkte da man slipper for response og request. Desuden så kan en session indeholde objecter, det ved jeg ikke om en cookie kan (for har aldrig selv benyttet cookies) Dvs du kunne putte et array ind i din session som du så kunne løbe igennem når de skal betale, eller noget.
hifi4all >> hvis du benytter nogle cookies til at identificerer en køber med eller lign. Altså hvis du giver dem en lang udløbsdato eksempelvis. Så skal du blot huske at en session som default timer out efter 20 min inaktivitet! Og at sessions nok ikke er til for at gemme sådanne oplysninger i i dagevis ligefrem eftersom de ligger på serveren og "sluger energi" :o) Så hvis du har brugerinfo eller andet godt så er det smart at proppe i en database Det var bare en mente :o)
Jeg er ked af, hvis jeg har givet indtryk af der er tale om en indkøbskurv - det er det ikke, men istedet er der tale om en produktguide, hvor der skal kunne udvælges og sammenlignes valgte produkter.
Således er sikkerhed ikke det væsentlige, men derfor er session sikkert ikke nogen dårlig ide.
Men problematikken vedr. størrelsen på cookien er jo ret relevant, men alt der tilføjes er produktes / varens id, adskilt med komma. Noget i stil med: 12, 23, 75, osv osv... Mon vi rammen græsen på 4 kb?
Ideen er var oprindeligt at begrænse antallet af mulige valg, så det f.eks er max 20 produkter i cookien.
Hvis vi antager, at session bliver løsningen, og følgende benyttes:
---------------- indhold = session("din_session") If indhold <> "" then session("din_session") = indhold&"ekstra indhold" else session("din_session") = "ekstra indhold" end if ----------------
hvorledes ville I så anbefale at data hentes ud, således at hvert ID i session bliver udskrevet?
I formularen, som er beskrevet øverst, benyttes SELECT* FROM TABEL WHERE XX IN...
-Og mange tak for de fine svar - de kan absolut bruges (Points gives!!!)
Session bruges hvis data kun skal huskes hen over en enkelt - ja - session.
Cookies bruges hvis data skal huskes til næste gang at brugeren vender tilbage. Et alternativ i denne sammenhæng er at gemme data i en database i stedet:
Cookies - Mange kunder som måske eller måske ikke vender tilbage.
Database - Få kunder som næsten med garenti vender tilbage - sædvaligvis mere egenetlige "brugere" (f.eks. forhandlere) end kunder.
Du kan stadig godt lave dem komma sepereret ---------------- indhold = session("din_session") If indhold <> "" then session("din_session") = indhold&","&nyt_id else session("din_session") = nyt_id end if ---------------- Så splitter du den blot idArr = Split(session("din_session"),",") for i=0 to ubound idArr response.write(idArr[i]) next
oki her er et svar hvis jeg ikke lige er tilstede :o) Det var blot din kommentar om vælge ex antal valg/vare fra et katalog. Så troede jeg det var en inkøbskurv eller lign :o) Der er ikke noget spooky ved sessions. Du kan nærmest betragte dem som en global variabel du har til rådighed unikt for hver besøgende på dit site
Jeg valgte at benytte cookie løsningen, da jeg gerne vil have mulighed for at holde på de indsamlede date.
Det vist sig i midlertid, at det var RET nemt at hente da indsamlede data ind´og udskrive alle id´er fra databasen - så maneg tank for jeres indsats!
Jeg har dog et enkelt spørgsmål tilbage...
Jeg har bemærket, at dubeletter er muligt, når data tilføjes, hvilket jo er knap så godt, men om muligt ville det være ønskeligt, hvis man også kunne fjerne et enkelt (brugeren bestemmer selv hvilket) id fra cookien UDEN at alle andre data slettes?
Points for jeres tidligere svar er givet, men flere gives selvfølgelig, hvis I har lyst til at fortsætte med at hjælpe!? :O)
tja noget ala id = ID_SOM_SKAL FJERNES indhold = request.cookie("din_cookie) indholdArr = Split(indhold,",") for i=0 to ubound indholdArr if indholdArr(i) <> id then if i=0 then nytIndhold = indholdArr(i) else nytIndhold = nytIndhold&","&indholdArr(i) end if end if next response.cookies("din_cookie") = nytIndhold
Microsoft VBScript compilation error '800a0401' Expected end of statement ../s_delete.asp, line 6 for i=0 to ubound indholdArr ------------------^
Skriver følgende i ASP´en:
<% Response.Buffer = True id = Request.QueryString("id") indhold = Request.Cookies(GUIDE) indholdArr = Split(indhold,",") for i=0 to ubound indholdArr if indholdArr(i) <> id then if i=0 then nytIndhold = indholdArr(i) else nytIndhold = nytIndhold&","&indholdArr(i) end if end if next Response.Cookies("GUIDE") = nytIndhold Response.Cookies("GUIDE").Domain = "."& Request.ServerVariables("SERVER_NAME") Response.Cookies("GUIDE").Path = "/guide" Response.Redirect("s2.asp") %>
Ja, spørgsmålet er lukket, men det stopper os jo ikke fra at skrive videre. :^)
Umiddelbart kan jeg ikke finde nogen fejl i kodeksemplet (16/05-2005 17:49:53) - det burde slette det id du vil have slettet. Måske kunne du vise nogle eksempler på hvornår det går galt?
Nu har jeg prøvet, alt hvad jeg kan for at få det til at virke, men uden succes.
For at få lidt sammenhæng (forhåbentligt), så lister jeg her fremgangsmåden - side for side.
På side 1, der hvor produkterne ER valgt, og hentes ind i cookien fra en formular: Kode: <% Response.Buffer = True 'Cookie i guide indhold = Request.Cookies("GUIDE") If indhold <> "" then Response.Cookies("GUIDE") = indhold&", "&Request.Form("s") else Response.Cookies("GUIDE") = Request.Form("s") end if %> Data skrives i cookie som de skal, nemlig som eks.: 17%2B+25%2B+31%2B+17%2B+25%2B+31
På side 2 henter jeg data fra cookien over i min connection-string, så data kan udskrives: Kode: Er ikke releavnt :O)
Side 3 - siden hvor jeg gerne ville have mulighed for at slette et id i cookien: Kode: <% indhold = Request.Cookies("GUIDE") %> <% Response.Buffer = True id = Request.QueryString("id") indholdArr = Split(indhold, ",") for i=0 to ubound (indholdArr) if indholdArr(i) <> id then if i=0 then nytIndhold = indholdArr(i) else nytIndhold = nytIndhold&","&indholdArr(i) end if end if next Response.Cookies("GUIDE") = nytIndhold Response.Redirect("side2.asp") %>
Som det ser ud nu, er det kun muligt at slette den første tilskrevne værdi i cookien. F.eks. 5412, 547, 547 - her er det KUN 5412 som kan slettes. (øhh, ???)
Ej heller er det muligt at slette mere end EEN gang - sletning bliver ganske enkelt ignoreret! :O(
Sletningen kaldes via linket ../minside.dk/guide/s_delete.asp?id=XX
Jeg er virkelig lost - der sættes stor pris på hjælp.!!!
id = Request.QueryString("id") indholdArr = Split(indhold, ",") for i=0 to ubound (indholdArr) if indholdArr(i) <> id then if i = 0 then nytIndhold = indholdArr(i) else nytIndhold = nytIndhold & "," & indholdArr(i) end if end if next Response.Cookies("GUIDE") = nytIndhold Response.Redirect("side2.asp") %>
Konsekvensen af dette er at testen:
if indholdArr(i) <> id then
- nærmest ikke kan undgå at give falsk. Altså på nær hvis der lige vare tale om det allerførste ID i din Cookie.
Læsningen er ganske simpel. Lad være med at sætte det der mellemrum ind:
<% Response.Buffer = True 'Cookie i guide
indhold = Request.Cookies("GUIDE") If indhold <> "" then Response.Cookies("GUIDE") = indhold & "," & Request.Form("s") else Response.Cookies("GUIDE") = Request.Form("s") end if %>
Hvis man ikke lige ved hvad man skal kigge efter så ser man det aldrig. Ikke så underligt hvis du føler dig lidt lost. ;^?
Jeg havde faktisk været lidt den vej rundt, men brugt en "replace funktion" til at fjerne komma og mellemrum - det duede desværre ikke.
desværre skal jeg bruge den kommaseperation til connectionstringen - men omvendt kan man jo sætte "replace-funktionen" ind her?
Det prøver jeg lige!
I guder, det er dog det mest irriterende jeg længe har arbejdet med *GG*
Tak for du kastede lidt lys over problematikken - jeg vender tilbage.
Hvis det har interesse, vil jeg meget gerne fremvise projektet, men da der er tale om et helt nyt site, og jeg gerne vil holde tæt med funktionalitet og design, vil jeg tillade mig at sende link pr. mail - admin@hifi4all.dk
Så startede vi dagen med friske øjne, og sørme ikke om du har ret, nielle!
Alt man behøvede, var blot at fjerne det lille komma, så virker koden, som busschou har skrevet tidligere!
Ved at sætte en replace-funktion (som omdeler med komma og mellemrum), og det også muligt at hente data ud fra db - 100% som ønsket!
Nu er jeg en glad mand, som endelig kan komme videre i teksten! ;O)
Mange, mange tak for jeres hjælp og indsats!!!!!
Synes godt om
Ny brugerNybegynder
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.