Avatar billede hifi4all Nybegynder
16. maj 2005 - 06:41 Der 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!

Der sættes stor pris på jeres hjælp!

På forhånd tak! ;o)
Avatar billede busschou Praktikant
16. maj 2005 - 10:26 #1
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
Avatar billede busschou Praktikant
16. maj 2005 - 10:27 #2
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
Avatar billede busschou Praktikant
16. maj 2005 - 10:32 #3
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)
Avatar billede busschou Praktikant
16. maj 2005 - 10:38 #4
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
Avatar billede nielle Nybegynder
16. maj 2005 - 10:57 #5
Det lyder helt bestemt som om at hifi4all skal glemme alt om cookies i denne sammenhæng - Session() må da være svaret:

http://www.w3schools.com/asp/asp_ref_session.asp

(Selvfølgelig kan man hævde ar Session bare er en bestemt slags cookies).
Avatar billede busschou Praktikant
16. maj 2005 - 11:11 #6
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.
Avatar billede busschou Praktikant
16. maj 2005 - 11:15 #7
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)
Avatar billede hifi4all Nybegynder
16. maj 2005 - 11:26 #8
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!!!)
Avatar billede hifi4all Nybegynder
16. maj 2005 - 11:28 #9
busschou> Der er intet brugerlogin eller funktionalitet forbundet med den service jeg er ved at udvikle, men alene tale om, ja et opslagsværk...
Avatar billede nielle Nybegynder
16. maj 2005 - 11:32 #10
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.
Avatar billede busschou Praktikant
16. maj 2005 - 11:32 #11
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
Avatar billede hifi4all Nybegynder
16. maj 2005 - 11:36 #12
I er YDERST hjælpsomme - tak for det! ;O)

Jeg afprøver lige ovenstående, og vender tilbage, så vi kan få delt nogle points ud!
Avatar billede busschou Praktikant
16. maj 2005 - 11:37 #13
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
Avatar billede nielle Nybegynder
16. maj 2005 - 11:54 #14
Jeg modtager da gerne et par point, men giv nu bare de fleste til busschou - det er jo ham som har vist dig noget reel kode. :^)
Avatar billede hifi4all Nybegynder
16. maj 2005 - 17:14 #15
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)

Igen, tak!
Avatar billede hifi4all Nybegynder
16. maj 2005 - 17:20 #16
Hmm... Det går lidt hurtigt nu. (både med de mange skrivefejl, men også med ASP´en)

Det har sørme vist sig, at ved brugen af "WHERE ID IN", er der INGEN dubletter, da de åbenbart automatisk sorteres fra.

Men jeg vil meget gerne have hjælp til at slette enkelt-id´er som beskrevet ovenfor!
Avatar billede busschou Praktikant
16. maj 2005 - 17:20 #17
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
Avatar billede hifi4all Nybegynder
16. maj 2005 - 17:49 #18
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")
%>
Avatar billede hifi4all Nybegynder
16. maj 2005 - 17:53 #19
Skulle måske tilføje, at der efter hvert id skrives "%2C" (, ) i cookien - bør det give vrøvl?

Altså f.eks.: 98%2C+199%2C+334
Avatar billede nielle Nybegynder
16. maj 2005 - 17:56 #20
Kommaer bliver til "%2C" og mellemrum bliver til "+". Nej det giver ingen problemer, det hedder URLencoding.
Avatar billede nielle Nybegynder
16. maj 2005 - 18:18 #21
Prøv at rette til:

for i=0 to ubound(indholdArr)
Avatar billede nielle Nybegynder
16. maj 2005 - 18:22 #22
busschou> Jeg synes nu altså at du skal have de fleste point for den her:

http://www.eksperten.dk/spm/618228
Avatar billede hifi4all Nybegynder
16. maj 2005 - 18:22 #23
Tak for svaret - nu får jeg ingen fejl, men id fjernes desværre ikke fra cookien :O(
Avatar billede hifi4all Nybegynder
16. maj 2005 - 18:23 #24
nielle wrote:
"busschou> Jeg synes nu altså at du skal have de fleste point for den her:
http://www.eksperten.dk/spm/618228

Enig - jeg forhøjer antallet af point - det er blot fordi jeg ikke helt har styr på det med fordeling!
Avatar billede nielle Nybegynder
16. maj 2005 - 18:30 #25
Når du fordeler porints er der en mulighed for at trykke på Avanceret hvorefter du kan fordele dine points - ellers bliver de bare fordelt ligeligt.

Og nej, du kan ikke forhøje mere points på dette spørgsmål. Det nyes jeg nu heller ikke at der er grund til - 150 er rigeligt.
Avatar billede hifi4all Nybegynder
16. maj 2005 - 18:35 #26
Hov, du har ret. Er spørgsmålet så lukket??? (ØV!)

Der er jo masser af points at tage, og jeg sætter stor pris på alt den hjælp jeg kan få, så det med points skal ikke være afgørende!!!! ;o)
Avatar billede nielle Nybegynder
16. maj 2005 - 18:41 #27
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?
Avatar billede hifi4all Nybegynder
16. maj 2005 - 21:23 #28
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.!!!
Avatar billede nielle Nybegynder
16. maj 2005 - 22:24 #29
Det er vist en af de små detaljer som driller. Den som er sk*** svære at få has på :^)

MEN, når du i første om gang bruger ”, ” – altså et komma efterfulgt af et mellemrum – til at skille de enkelte ID’er:

<%
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
%>

- så betyder det at du senere, når du bruger Split til at skille ID’erne igen har et mellemrum foran hvert ID på nær det allerførste:

<%
Response.Buffer = True
indhold = Request.Cookies("GUIDE")

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. ;^?
Avatar billede hifi4all Nybegynder
16. maj 2005 - 23:35 #30
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
Avatar billede hifi4all Nybegynder
17. maj 2005 - 10:30 #31
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!!!!!
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