[PHP] Waarom fetched PHP maar 1 variabele uit deze cookie?

Pagina: 1
Acties:
  • 232 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Ik ben bezig met een cookie, zodat ik mijn website aan hand van de schermresolutie van de client(side) proportioneel kan laten opbouwen.
Nu pakt dit script alleen de eerste variabele uit de cookie, ik heb geen idee waarom.
Voer het script maar eens uit, dan zul je zien dat de y-resolutie niet door de echo statement in de body weergegeven wordt.
Wat ik in principe heb getracht te bereiken is met javascript de variabelen in de cookie te setten en met php die variabelen dan vervolgens weer uit de cookie proberen te ontrekken.(als arrays >> $HTTP_COOKIE_VARS[])



Deze code moet in een file genaamd screenResTest.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<html>
<head>

<?php
if(isset($HTTP_COOKIE_VARS["screenResX_in_cookie"]))
{
    $screenResX = $HTTP_COOKIE_VARS["screenResX_in_cookie"];
    $screenResY = $HTTP_COOKIE_VARS["screenResY_in_cookie"];    
}
else
{
?>
<script language="javascript">

    var theCookie = "screenResX_in_cookie="+ screen.width +";";
    theCookie = theCookie +"screenResY_in_cookie="+ screen.height +";";

    document.cookie = theCookie;
     
    location = 'screenResTest.php';

</script>
<?
}
?>

</head>
<body>


<?php
echo 'The x-resolution is '.$screenResX.' and the y-resolution is '.$screenResY.' .';
?>


</body>
</html>

[ Voor 46% gewijzigd door Arcane Apex op 18-02-2005 03:07 ]


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
For starters zou ik eens $_COOKIE gaan gebruiken, in plaats van $HTTP_COOKIE_VARS. Dat is onderhand ancient te noemen.

Ik weet niet precies hoe javascript cookies werken, maar doen eens een print_r($_COOKIE) om te kijken of uberhaupt die var geset is.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Yo-han
  • Registratie: December 2001
  • Laatst online: 18-08 20:16

Yo-han

nope.

Heb het zelf ook even geprobeerd en kan de cookies die ik weg schrijf met Javascript gewoon ophalen met PHP. Mischien ligt het aan de manier waarop je de cookie zet met Javascript?

* Yo-han is ook geen Javascript held/die-hard :/

Hier de wijze waarop ik het getest heb:
JavaScript:
1
2
3
4
5
6
7
8
9
10
function SetCookie(cookieName,cookieValue,nDays) {
     var today = new Date();
     var expire = new Date();
     if (nDays==null || nDays==0) nDays=1;
     expire.setTime(today.getTime() + 3600000*24*nDays);
     document.cookie = cookieName+"="+escape(cookieValue)
                     + ";expires="+expire.toGMTString();
}

SetCookie(' test','blaat',1);


En dan met PHP:

PHP:
1
print_r($_COOKIE["test"]) // geeft blaat als uitvoer

[ Voor 52% gewijzigd door Yo-han op 17-02-2005 09:38 ]


  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
print_r($_COOKIE); geeft inderdaad aan dat er maar 1 variabele gezet is, namelijk screenResX_in_cookie, maar screenResY_in_cookie niet, terwijl ik die wel toegevoegd heb aan de cookie in de code.
Weet iemand misschien waarom alleen screenResX_in_cookie toegevoegd wordt aan de cookie en niet de 2e variabele?

  • Yo-han
  • Registratie: December 2001
  • Laatst online: 18-08 20:16

Yo-han

nope.

* Yo-han kan niet lezen...

Maar volgens mij ligt het nog steeds aan de manier van je cookie zetten. Volgens mij zet je 2 waarden in 1 cookie (als ik nu wel goed lees) en je probeert er 2 op te halen met PHP...

Probeer het zo eens:
code:
1
2
3
4
5
var koekjeX = "screenResX_in_cookie="+ screen.width +";";
var koekjeY = "screenResY_in_cookie="+ screen.height +";";

document.cookie = koekjeX;
document.cookie = koekjeY;

[ Voor 33% gewijzigd door Yo-han op 17-02-2005 12:14 ]


  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Dat werkt wel, maar dan worden er 2 cookies aangemaakt, elke voor een aparte variabele.
Stel dat als ik (in theorie) 100 cookie variabelen aan zou willen maken, wordt dat dan niet heel omslachtig en krijgt de client(side) dan niet 100 cookies op zijn/haar computer?
Is het niet gewoon mogelijk alle variabelen in 1 cookie op te slaan?

  • Yo-han
  • Registratie: December 2001
  • Laatst online: 18-08 20:16

Yo-han

nope.

Arcane schreef op donderdag 17 februari 2005 @ 12:31:
Dat werkt wel, maar dan worden er 2 cookies aangemaakt, elke voor een aparte variabele.
Stel dat als ik (in theorie) 100 cookie variabelen aan zou willen maken, wordt dat dan niet heel omslachtig en krijgt de client(side) dan niet 100 cookies op zijn/haar computer?
Is het niet gewoon mogelijk alle variabelen in 1 cookie op te slaan?
Uiteraard is dat mogelijk :Y) . Je zal dan alleen wel een array moeten opslaan in de cookie en niet 2 strings zoals je nu doet. Deze zijn namelijk niet als aparte cookies op te halen door php.

Ok, dit is dus makkelijk op het net te vinden (lees google), maar ben in een goeie bui dus bij deze:

code:
1
2
var Blaat = 'unos|dos|tres'; // value
SetCookie('test',Blaat,1); // Functie om de cookie te setten


PHP:
1
print_r(explode("|",$_COOKIE["test"]));

[ Voor 19% gewijzigd door Yo-han op 17-02-2005 12:46 ]


  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
De variabelen in een cookie worden in de array $_COOKIE zowiezo toch als array opgeslagen?
Als ik de variabelen in javascript dan nog maals als array declareer dan krijg ik een array in een array is dat niet dubbelop?

De voorbeelden die te vinden zijn op google doen het op de manier die ik liet zien, dus daarom snap ik niet waarom die 2e variabele niet in de cookie opgeslagen wordt.

[ Voor 4% gewijzigd door Arcane Apex op 17-02-2005 12:59 ]


  • Yo-han
  • Registratie: December 2001
  • Laatst online: 18-08 20:16

Yo-han

nope.

Dit is duidelijk meer een Javascript probleem dan een PHP probleem. 'k Zou de vraag eens in W&G posten, alwaar de JS goeroe's bivakeren.

  • alley
  • Registratie: Mei 2002
  • Laatst online: 19-04-2023

alley

ahuh

Volgens mis je ook een aantal basis principes.
De $_COOKIE array is een array van al je cookies die je op de client hebt opgeslagen. Jij wilt in 1 cookie weer een array, dat kan ook best, maar je haalt wel 2 dingen door elkaar.
Anyway, de manier van dayoman is gewoon prima.
Ook kan het zo:
code:
1
2
3
4
var resx = '1024'; // value
var resy = '768'; // value
SetCookie('res[]',resx,1); // Functie om de cookie te setten
SetCookie('res[]',resy,1); // Functie om de cookie te setten


hierdoor zou de $_COOKIE['res'] een array met 2 values bevatten

I am always doing that which I can not do, in order that I may learn how to do it. (Pablo Picasso)


  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Dus meerdere variabelen in een cookie zijn echt alleen mogelijk door de variabelen in een array op te slaan in de cookie?

  • alley
  • Registratie: Mei 2002
  • Laatst online: 19-04-2023

alley

ahuh

Nee (zie antwoord van dayoman, die slaat het op als 1 string).
Maar wat is het probleem van 'meerdere cookies' ? Er komt maar 1 bestand per cookie-domain op de client te staan met daarin de gehele cookiestring.
Technisch kan er zelfs maar 1 cookie aanwezig zijn, 1 lange string met daarin alle info over de verschillende cookies :D lekker duidelijk verhaal, maar zo zit het wel

I am always doing that which I can not do, in order that I may learn how to do it. (Pablo Picasso)


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
alley schreef op donderdag 17 februari 2005 @ 13:41:
Maar wat is het probleem van 'meerdere cookies' ? Er komt maar 1 bestand per cookie-domain op de client te staan met daarin de gehele cookiestring.
In een ander forum topic zei men dat er een limiet was van het aantal cookies dat per domein geset kon worden, dit waren er ongeveer 40 als ik me niet vergis.
Dus daar zit dan wel een heikel punt.

[ Voor 8% gewijzigd door Arcane Apex op 18-02-2005 00:43 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Arcane schreef op vrijdag 18 februari 2005 @ 00:43:
[...]


In een ander forum topic zei men dat er een limiet was van het aantal cookies dat per domein geset kon worden, dit waren er ongeveer 40 als ik me niet vergis.
Dus daar zit dan wel een heikel punt.
Ja dat klopt. Vroeger deden we voor de klipklapcookies hier op het forum ook per categorie een cookie zetten totdat mensen opeens spontaan uitgelogd werden omdat het maximaal aantal cookies overschreden werd, en de oudste daardoor door de browser werd weggegooid (en dat is dan meestal je sessie-cookie :P ).

Maar zoals ik in het W&G topic al opmerkte is dat prima op te lossen door bij elkaar horende gegevens bijvoorbeeld seperated of serialized in 1 cookie te zetten :)

In dit geval zou je bijvoorbeeld een cookie genaamd 'screenRes' kunnen zetten met de volgende string:
code:
1
'screenResX:1024,screenResY:800'

dit is met wat simpele splits/explodes makkelijk weer uit elkaar te trekken :)

[ Voor 14% gewijzigd door crisp op 18-02-2005 00:58 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
crisp schreef op vrijdag 18 februari 2005 @ 00:54:
[...]
In dit geval zou je bijvoorbeeld een cookie genaamd 'screenRes' kunnen zetten met de volgende string:
code:
1
'screenResX:1024,screenResY:800'

dit is met wat simpele splits/explodes makkelijk weer uit elkaar te trekken :)
Ik snap wat je bedoelt, dat kan wel met PHP, maar dan moet ik voor elke variabele wel een stuk script erbij schrijven.
Wat mij een stuk omslachtiger lijkt dan alle variabelen uit de cookie te ontrekken zoals dat op de standaard manier wordt gedaan.
Alleen heb ik nog steeds dit niet voor elkaar gekregen, ook niet na alle adviezen in dit topic en het JS topic.
Ik ben er nog steeds niet achter wat het nou exact is in de code van mijn eerste reply dat die 2e variabele niet naar de cookie schrijft.
Het kan met arrays, maar ook zonder...ik heb beide manieren geprobeerd, steeds krijg ik maar 1 variabele naar de cookie.
Het moet een heel specifiek foutje zijn dat dit veroorzaakt, want ik ben nu al ongeveer 2 dagen lang bezig allemaal mogelijkheden uit te proberen...niets werkt.
En ik wil ook niet blind code copieren van voorbeelden, ik wil echt weten hoe het werkt.
Ik snap het (al dan niet ongeveer) wel, alleen het ene kleine detail dat het probleem veroorzaakt heb ik er nog niet uit kunnen vissen, ook niet na alle adviezen uitgeprobeerd te hebben.
Het enige wat werkt is 2(multiple) cookies aanmaken, maar als ik dan tegen de 40 cookies uiteindelijk aan ga lopen zijn mijn opties verstreken.
Daarom wil ik het goed doen en wil ik exact weten wat mijn code doet.

[ Voor 4% gewijzigd door Arcane Apex op 18-02-2005 01:20 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

De mooiste oplossing imho is met behulp van een serialize implementatie in javascript; je kan dan bijvoorbeeld dit doen:

JavaScript:
1
2
3
4
5
6
7
function writecookie()
{
  var screenRes = new Array();
  screenRes['X'] = screen.width;
  screenRes['Y'] = screen.height;
  setCookie('screenRes', serialize(screenRes));
}

en in php:
PHP:
1
2
3
$screenRes = unserialize($_COOKIE['screenRes']);
echo 'screen width: ', $screenRes['X'];
echo '<br>screen height: ', $screenRes['Y'];


een voorbeeld van een PHP-compatible serialize implementatie in javascript vind je in de j.js van dit forum, en een voorbeeld van een setCookie functie had ik je al eerder gegeven in het W&G topic ;)


by the way: ik heb je W&G topic maar gesloten aangezien het allemaal een beetje dubbelop is.
Ik laat dit topic nog maar even in P&W staan aangezien het een grensgeval is tussen client- en serverside, hoewel het meer een vraag is hoe je clientside iets kan voorbereiden om het serverside makkelijk te kunnen verwerken. Desalniettemin is dit denk ik interessant voor beide kanten, dus ik laat het verder aan de P&W mods over wat te doen met dit topic ;)

[ Voor 51% gewijzigd door crisp op 18-02-2005 01:36 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
crisp schreef op vrijdag 18 februari 2005 @ 01:23:
by the way: ik heb je W&G topic maar gesloten aangezien het allemaal een beetje dubelop is.
Ik laat dit topic nog maar even in P&W staan aangezien het een grensgeval is tussen client- en serverside, hoewel het meer een vraag is hoe je clientside iets kan voorbereiden om het serverside makkelijk te kunnen verwerken. Desalniettemin is dit denk ik interessant voor beide kanten, dus ik laat het verder aan de P&W mods over wat te doen met dit topic ;)
Ok, geen probleem...ik zat al te twijfelen op welk forum het nu beter paste.
Ik ga ook uitproberen wat je voorslaat met serialize, maar ben nog steeds benieuwd wat het precies is in mijn code wat het "net niet" laat werken.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Arcane schreef op vrijdag 18 februari 2005 @ 01:38:
[...]


Ok, geen probleem...ik zat al te twijfelen op welk forum het nu beter paste.
Ik ga ook uitproberen wat je voorslaat met serialize, maar ben nog steeds benieuwd wat het precies is in mijn code wat het "net niet" laat werken.
Als je iets als
code:
1
screenResX_in_cookie=1024;screenResY_in_cookie=800;

als string in 1 enkel cookie wilt wegschrijven dan moet je urlencoden aangezien het = en ; teken een speciale betekenis hebben. Het wordt dan zoiets:
JavaScript:
1
document.cookie = 'screenRes=' + escape('screenResX_in_cookie=1024;screenResY_in_cookie=800;');

maar dat zal je in PHP dus weer moeten gaan splitten enzo. Vandaar dat ik vind dat een serialize/unserialize de mooiste oplossing is.
Javascript is gelukkig/helaas* niet zo bloated als PHP, dus daar zal je uiteindelijk zelf functies en methods voor moeten maken. Als je echter op een gegeven moment een aantal standaard oplossingen op de plank hebt liggen maakt dat je leven naderhand wel een stuk makkelijker :)

[ Voor 15% gewijzigd door crisp op 18-02-2005 01:48 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Ok ik heb het met serialize geprobeerd, maar nu geeft echo in de body helemaal geen waarden weer.
Ik weet niet wat er precies fout is.

Hier de code:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<html>
<head>
<?php
if(isset($_COOKIE["theCookie[0]"]))
{
    $screenResX = $_COOKIE["theCookie[0]"];
    $screenResY = $_COOKIE["theCookie[1]"]; 
}
else
{
?>

<script language="javascript">

    var theCookie = new Array();
    theCookie[0] = "screenResX_in_cookie="+ screen.width +";";
    theCookie[1] = "screenResY_in_cookie="+ screen.height +";";
    
    serialize(theCookie);

    document.cookie = theCookie;
     
    location = 'screenResTest.php';

</script>

<?
unserialize($_COOKIE['theCookie']);
}
?>

</head>
<body>


<?php
echo 'The x-resolution is '.$screenResX.' and the y-resolution is '.$screenResY.' .';
print_r($_COOKIE);
?>


</body>
</html>

[ Voor 17% gewijzigd door Arcane Apex op 18-02-2005 03:07 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

zoals ik al zei: serialize zit niet standaard in javascript, en verder heb je mijn voorbeeld ook niet goed gevolgd.

[ Voor 3% gewijzigd door crisp op 18-02-2005 09:07 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

crisp schreef op vrijdag 18 februari 2005 @ 09:07:
zoals ik al zei: serialize zit niet standaard in javascript, en verder heb je mijn voorbeeld ook niet goed gevolgd.
Maar deze staat wel in de sourceforge :)

http://jpspan.sourceforge.net/examples/serialize_php.php

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Werkend voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<html>
<head>
<title>Serialized data in cookies</title>
<script type="text/javascript">

function writecookie()
{
  var screenRes = new Array();
  screenRes['X'] = screen.width;
  screenRes['Y'] = screen.height;
  setCookie('screenRes', serialize(screenRes));
}

function setCookie(sName, sValue)
{
    document.cookie = sName + '=' + escape(sValue) + '; expires=Fri, 31 Dec 2099 23:59:59 GMT; path=/';
}

function serialize(data)
{
    return typeof data.toPHP == 'function' ? data.toPHP() : '';
}

Number.prototype.toPHP=function()
{
    return (Math.floor(this) == this ? 'i' : 'd') + ':' + this + ';';
}

String.prototype.toPHP=function()
{
    var s = this.replace(/\r\n|\r|\n/g, '\r\n');
    return 's:' + s.length + ':"' + s + '";';
}

Boolean.prototype.toPHP=function()
{
    return 'b:' + (this==true ? 1 : 0) + ';';
}

Array.prototype.toPHP=function()
{
    var o = this, s = '', count = 0, item;
    for (item in o)
    {
        if (typeof o[item] == 'function' || typeof o[item] == 'undefined') continue;
        count++;
        if (isNaN(item)) s += 's:' + item.length + ':"' + item + '";';
        else s += 'i:' + item + ';';
        if (o[item] === null) s +='N;';
        else s += o[item].toPHP();
    }
    return 'a:' + count + ':{' + s + '}';
}

Object.prototype.toPHP=function()
{
    var o = this, s = '', count = 0, item;
    for (item in o)
    {
        if (typeof o[item] == 'function' || typeof o[item] == 'undefined') continue;
        count++;
        if (isNaN(item)) s += 's:' + item.length + ':"' + item + '";';
        else s += 'i:' + item + ';';
        if (o[item] === null) s +='N;';
        else s += o[item].toPHP();
    }
    return 'o:' + count + ':{' + s + '}';
}

</script>

</head>
<body onload="writecookie()">
<?php

if (isset($_COOKIE['screenRes']))
{
    $screenRes = unserialize($_COOKIE['screenRes']);
    echo 'screen width: ', $screenRes['X'];
    echo '<br>screen height: ', $screenRes['Y'];
}
else
{
    echo 'Nog geen cookie; druk op refresh...';
}

?>
</body>
</html>

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Arcane Apex
  • Registratie: Juni 2003
  • Laatst online: 30-01 15:19
Crisp, Dayoman en de anderen in deze thread, hartstikke bedankt voor de hulp...ik denk dat ik er nu eindelijk wel uit ben gekomen.(Met jullie hulp)

Nogmaals bedankt.

[ Voor 6% gewijzigd door Arcane Apex op 18-02-2005 21:54 ]

Pagina: 1