Cookies geven foutmelding bij 1e keer pagina laden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marco Apeldoorn

Marco Apeldoorn

22/02/2020 20:13:18
Quote Anchor link
Hoi,

Heb al van alles geprobeerd, gelezen en weer geprobeerd.
Als ik de eerste keer de volgende pagina laad dan krijg ik de foutmeldingen:

Notice: Undefined variable: WDlng in C:\HTDOCS\test.php on line 9

Notice: Undefined variable: sessie in C:\HTDOCS\test.php on line 15

Notice: Undefined variable: WDshw in C:\HTDOCS\test.php on line 21
NLDI0

Aan de uitkomst NLDI0 is te zien dat hij ze wel uitleest, reload ik de pagina verdwijnt het probleem.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
$lifetime
=time()+600;
$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;

if(!isset($_COOKIE['JaiDje_Language']))
{

    setcookie('JaiDje_Language', 'NLD', $lifetime, '/', $domain, false);
}

$WDlng == $_COOKIE['JaiDje_Language'];

if(!isset($_COOKIE['JaiDje_Page']))
{

    setcookie('JaiDje_Page', 'I', $lifetime, '/', $domain, false);
}

$sessie == $_COOKIE['JaiDje_Page'];

if(!isset($_COOKIE['JaiDje_Show']))
{

    setcookie('JaiDje_Show', '0', $lifetime, '/', $domain, false);
}

$WDshw == $_COOKIE['JaiDje_Show'];

echo $_COOKIE["JaiDje_Language"];
echo $_COOKIE["JaiDje_Page"];
echo $_COOKIE["JaiDje_Show"];
?>


Heeft iemand een oplossing voor dit probleem?

Alvast bedankt
 
PHP hulp

PHP hulp

31/03/2020 17:31:57
 
- Ariën -
Beheerder

- Ariën -

22/02/2020 20:15:50
Quote Anchor link
Die lijnen kunnen geen vergelijking zijn, maar een toewijzing met een enkele = .

Je vergelijkt nu een niet-bestaande variabele.
Gewijzigd op 22/02/2020 20:20:41 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

22/02/2020 20:39:56
Quote Anchor link
In php zijn allerlei verschillende operatoren. Hier een drietal die misschien op elkaar lijken maar toch verschillend zijn.

1. assignment operator =
voorziet een variabele van een nieuwe waarde.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$a
= 1; // $a heeft nu de waarde 1
$b = $a; // $b krijgt de waarde van $a
?>


2. vergelijkingsoperator ==
Test of twee waarden gelijk zijn (type onafhankelijk). Levert altijd TRUE of FALSE op.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if(2 == '2') { // vergelijk een getal met een tekst
    echo 'true';
}
else {
    echo 'false';
}

?>

uitkomst: true;


3. vergelijkingsoperator ===
Test of twee waarden gelijk zijn (type afhankelijk). Levert ook altijd TRUE of FALSE op.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if(2 === '2') { // vergelijk een getal met een tekst
    echo 'true';
}
else {
    echo 'false';
}

?>

uitkomst: false;
 
Marco Apeldoorn

Marco Apeldoorn

22/02/2020 20:46:17
Quote Anchor link
Bedankt voor jullie reactie.
Maak ik van == een enkele = dan geeft het nog foutmelding bij eerste keer laden, reload geeft geen foutmelding meer.

Notice: Undefined index: JaiDje_Language in C:\HTDOCS\test.php on line 9

Notice: Undefined index: JaiDje_Page in C:\HTDOCS\test.php on line 15

Notice: Undefined index: JaiDje_Show in C:\HTDOCS\test.php on line 21

Notice: Undefined index: JaiDje_Language in C:\HTDOCS\test.php on line 23

Notice: Undefined index: JaiDje_Page in C:\HTDOCS\test.php on line 24

Notice: Undefined index: JaiDje_Show in C:\HTDOCS\test.php on line 25
 
- Ariën -
Beheerder

- Ariën -

22/02/2020 20:48:27
Quote Anchor link
Gebruik isset() om te controleren.

Je roept nu een variabele op die nog niet bestaat. Dus breid je if uit met een 'else', en plaats de toewijzing daar in.
Gewijzigd op 22/02/2020 20:53:34 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

22/02/2020 21:12:47
Quote Anchor link
Ik denk dat het hier toch wat genuanceerder ligt.

Je moet het zo zien:

- Browser doet een request aan webserver en stuurt daarbij al dan niet een cookie mee
- php leest het cookie uit (als die er is) en plaatst deze in de $_COOKIE array.
- de inhoud van deze array veranderd NIET. Dus ook niet wanneer je setcookie gebruikt. Dit komt pas bij de volgende request naar voren.

Je kan het zo oplossen..
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Maak een variabele $language en geef deze een standaard waarde (default value).
$language = 'EN';

if(isset($_COOKIE['language']))
{

    $language = $_COOKIE['language'];
}
else {
    setcookie('language', 'NL', $lifetime, '/', $domain, false);
}


// hieperdepiep je hebt altijd een $language variabele MET een geldige waarde

?>



Toevoeging op 22/02/2020 21:14:38:

p.s. leest een stuk makkelijker he $language in plaats van $JaiDje_Language
Gewijzigd op 22/02/2020 21:13:13 door Frank Nietbelangrijk
 
Thomas van den Heuvel

Thomas van den Heuvel

22/02/2020 21:35:02
Quote Anchor link
m.a.w. indien je een cookie set met setcookie() zit dit cookie pas het volgende request in $_COOKIE.

Het zetten van een cookie is in principe ook een "state change", dus wat dat betreft zou je direct daarna een page refresh moeten doen.
 
Marco Apeldoorn

Marco Apeldoorn

22/02/2020 23:28:21
Quote Anchor link
Dank voor de opzet, alleen krijg ik nog foutmeldingen:

Notice: Undefined index: JaiDje_Language in C:\HTDOCS\test.php on line 18
Notice: Undefined index: JaiDje_Page in C:\HTDOCS\test.php on line 26
Notice: Undefined index: JaiDje_Show in C:\HTDOCS\test.php on line 34
Notice: Undefined index: JaiDje_Language in C:\HTDOCS\test.php on line 43
Notice: Undefined index: JaiDje_Page in C:\HTDOCS\test.php on line 45
Notice: Undefined index: JaiDje_Show in C:\HTDOCS\test.php on line 47

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
//
// Opzetten extra data Cookies
//

$lifetime=time()+600;
$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
//
// Opzetten VAR's met default waarde
//

    $WDlng = 'NLD';
    $sessie = 'I';
    $WDshw = '0';
//
//
//

if(!isset($_COOKIE['JaiDje_Language']))
{

    $WDlng = $_COOKIE['JaiDje_Language'];
}

else
{
    setcookie('JaiDje_Language', 'NLD', $lifetime, '/', $domain, false);
}

if(!isset($_COOKIE['JaiDje_Page']))
{

    $sessie = $_COOKIE['JaiDje_Page'];
}

else
{
    setcookie('JaiDje_Page', 'I', $lifetime, '/', $domain, false);
}

if(!isset($_COOKIE['JaiDje_Show']))
{

    $WDshw = $_COOKIE['JaiDje_Show'];
}

else
{
    setcookie('JaiDje_Show', '0', $lifetime, '/', $domain, false);
}

//
//
//

echo $_COOKIE["JaiDje_Language"]."<br>";
echo $WDlng."<br>";
echo $_COOKIE["JaiDje_Page"]."<br>";
echo $sessie."<br>";
echo $_COOKIE["JaiDje_Show"]."<br>";
echo $WDshw."<br>";
?>


Maar nu ook NA de refresh blijven deze meldingen komen.
Blijft de optie van een refresh over, en dat wilde ik eigenlijk voorkomen.
Andere optie (komt op zelfde neer) de cookies op te zetten in een eerste pagina en dan na het opzetten doorlinken naar de daadwerkelijke pagina.

Maar vind dat eigenlijk een lapmiddel, dit moet toch netter te doen zijn?

PS. de reden dat ik de cookies uitgebreider benoem is om ze herkenbaar te houden als geldend voor de gehele website, verderop in de code komen de "eenvoudige" namen al voor en wil zo verwarring voorkomen.

Toevoeging op 22/02/2020 23:31:20:

PS2, ook met kortere namen blijft het probleem bestaan:

Notice: Undefined index: Language in C:\HTDOCS\test.php on line 18
Notice: Undefined index: Page in C:\HTDOCS\test.php on line 26
Notice: Undefined index: Show in C:\HTDOCS\test.php on line 34
Notice: Undefined index: Language in C:\HTDOCS\test.php on line 43
Notice: Undefined index: Page in C:\HTDOCS\test.php on line 45
Notice: Undefined index: Show in C:\HTDOCS\test.php on line 47
 
- Ariën -
Beheerder

- Ariën -

22/02/2020 23:32:36
Quote Anchor link
Het staat vermeld op php.net:

Quote:
Cookies will not become visible until the next loading of a page that the cookie should be visible for. To test if a cookie was successfully set, check for the cookie on a next loading page before the cookie expires. Expire time is set via the expires parameter. A nice way to debug the existence of cookies is by simply calling print_r($_COOKIE);.

Dus pas na een refresh kan je een cookie benaderen met $_COOKIE.
Gewijzigd op 22/02/2020 23:33:13 door - Ariën -
 
Marco Apeldoorn

Marco Apeldoorn

22/02/2020 23:34:40
Quote Anchor link
Dan maar kiezen voor de "minder" nette oplossing, jammer, maar zit denk ik niks anders op.

Toch bedankt allemaal. :-)
 
- Ariën -
Beheerder

- Ariën -

22/02/2020 23:40:16
Quote Anchor link
Gezien de werkwijze van cookies lijkt me het doorsturen wel de juiste werkwijze.
 
Marco Apeldoorn

Marco Apeldoorn

22/02/2020 23:41:09
Quote Anchor link
Dit is de code geworden:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
$lifetime
=time()+600;
$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;

if(!isset($_COOKIE['JaiDje_Language']))
{

    setcookie('JaiDje_Language', 'NLD', $lifetime, '/', $domain, false);
}

else
{
    $WDlng = $_COOKIE['JaiDje_Language'];
}


if(!isset($_COOKIE['JaiDje_Page']))
{

    setcookie('JaiDje_Page', 'I', $lifetime, '/', $domain, false);
}

else
{
    $sessie = $_COOKIE['JaiDje_Page'];
}


if(!isset($_COOKIE['JaiDje_Show']))
{

    setcookie('JaiDje_Show', '0', $lifetime, '/', $domain, false);
}

else
{
    $WDshw = $_COOKIE['JaiDje_Show'];
}


if(!isset($_COOKIE['JaiDje_Language']) AND !isset($_COOKIE['JaiDje_Page']) AND !isset($_COOKIE['JaiDje_Show']))
{

    header("Refresh:0");
}

?>


Comments wat wat is ga ik nog toevoegen. ;-)
Gewijzigd op 22/02/2020 23:53:47 door Marco Apeldoorn
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/02/2020 12:49:43
Quote Anchor link
Jammer dat je verder weinig doet om dingen te verbeteren.

- Waarom van die rare overdreven variabel-namen? Waarom beginnen die met een hoofdletter?
- Waarom if NOT ... else ... en niet if ... else ... wat toch veel leesbaarder en logischer is.
- Waarom geen variabelen initialiseren? Nu ben je nog steeds niet zeker of $WDlng (what the f**k het mag betekenen) überhaupt bestaat vanaf regel 13 buiten het if/else statement. Dus dan nog maar een keer hetzelfde voorbeeldje om te kijken of het lampje gaat branden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

// Maak een variabele $language en geef deze een standaard waarde (default value).
$WDlng = 'ENG';

if(isset($_COOKIE['JaiDje_Language']))
{

    $WDlng = $_COOKIE['JaiDje_Language'];
}
else {
    setcookie('JaiDje_Language', 'NL', $lifetime, '/', $domain, false);
}


// hieperdepiep je hebt altijd een $WDlng variabele MET een geldige waarde. Als de if TRUE oplevert dan wordt de standaard waarde overschreven en anders heb je de waarde 'ENG'

?>
 
Rob Doemaarwat

Rob Doemaarwat

23/02/2020 13:43:31
Quote Anchor link
Frank Nietbelangrijk op 23/02/2020 12:49:43:
- Waarom van die rare overdreven variabel-namen? Waarom beginnen die met een hoofdletter?

In in ieder geval Pascal/Delphi is het gebruikelijk om variabelen met een hoofdletter te beginnen (CamelCase). Misschien een overstapper?

On topic:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
function my_set_cookie($key,$value,$delta = 600){
  setcookie($key,$_COOKIE[$key] = $value,time() + $delta,'/');
}

Kun je daarna gewoon meteen in $_COOKIE kijken.

Maarrr: als je cookies toch maar voor 10 minuten (600 seconden) zet, waarom dan niet gewoon in de $_SESSION bijhouden? Kan iemand er ook niet mee gaan kl*ten (bijvoorbeeld JaiDje_Language = '"<).
 
Marco Apeldoorn

Marco Apeldoorn

23/02/2020 17:49:38
Quote Anchor link
Frank,

Jouw manier van werken met VAR's is misschien anders dan anderen, om het overzichtelijk te houden heb ik een ezelsbruggetje.
VAR die uit (bijvoorbeeld) een config bestand komen en geldig MOETEN blijven beginnen met de hoofdletters WD van Website Data, in geval van WDlng is het dus "Website Data LaNGuage", dus logisch lijkt mij.

Het IF NOT verhaal snap ik niet helemaal wat je bedoeld, ik heb het geleerd met IF ELSE en evt ELSEIF.

Bij regel 13 begint het checken voor de 2e cookie, en vanaf regel 23 het derde cookie, wat is daar dan fout aan, dit horen dan toch aparte IF secties te worden, voor het geval er 1 of 2 van de totaal 3 cookies niet bestaat.

En ja, Rob heeft gelijk, als je eerst Basic, dan Pascal en met nog een paar programmeertalen hebt gespeeld dan neem je gewoontes uit de ene taal over in een andere taal.

En Rob, ik zal naar $_SESSION gaan kijken, misschien "schoner", veiliger en makkelijker. ;-)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/02/2020 20:13:51
Quote Anchor link
>> Jouw manier van werken met VAR's is misschien anders dan anderen, om het overzichtelijk te houden heb ik een ezelsbruggetje.

Zullen we het omdraaien? Ik sluit me aan bij 95% van de php programmeurs. Begrijp me niet verkeerd het was maar een advies.

>> VAR die uit (bijvoorbeeld) een config bestand komen en geldig MOETEN blijven beginnen met de hoofdletters WD van Website Data, in geval van WDlng is het dus "Website Data LaNGuage", dus logisch lijkt mij.

Nou niet echt. Ten eerste mag ik een klein beetje aannemen dat je minimaal een functie hebt die je config variabelen inleest? Maar nog liever heb je een config class? Dit zegt iedereen wel iets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$config
= new Config();
$dbUser = $config->get('db_user');
?>


>> Het IF NOT verhaal snap ik niet helemaal wat je bedoeld, ik heb het geleerd met IF ELSE en evt ELSEIF.

Wederom maar een tip. Het is allemaal niet ernstig. Wat je schrijft is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Als er GEEN cookie is: maak cookie, anders lees het cookie.

In plaats van
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Als er (WEL) een cookie is: lees het cookie, anders maak een cookie


Dan vervolgens: als je een nieuwe variabele introduceert in een IF statement dan bestaat de variabele in de rest van je code de ene keer wel en de andere keer niet, namelijk enkel maar als de IF wordt uitgevoerd en anders niet. Dat kun je oplossen door variabelen te initialiseren. Initialiseren is misschien een duur woord maar het komt er gewoon op neer dat je de variabele aanmaakt met een standaard waarde en buiten het IF blok.

Ik ging er blindelings van uit dat de COOKIE bedoelt was voor als de gebruiker terugkeerde nadat de SESSIE reeds verlopen was. Scherp van Rob.
Gewijzigd op 23/02/2020 20:18:32 door Frank Nietbelangrijk
 
Marco Apeldoorn

Marco Apeldoorn

23/02/2020 20:37:13
Quote Anchor link
Quote:
Zullen we het omdraaien? Ik sluit me aan bij 95% van de php programmeurs. Begrijp me niet verkeerd het was maar een advies.


Bedoelde het ook niet verkeerd, iedere (hobby)programmeur heeft zijn/haar eigen manier, was meer bedoeld als aanloop voor mijn ezelsbruggetje waar ik inmiddels ruim 20 jaar mee werk, het is iets waardoor ik snel (ook na lange tijd) kan herleiden wat voor VAR het is.

Nee, ik laad vooraan in m'n code een config bestand met mijn "WD" (sorry, kon het niet laten) VAR's waarmee ik ze introduceer, VAR die niet geldig hoeven blijven staat in hun eigen "deel" van de code, kan een functie zijn, kan een IF of WHILE stuk zijn.

Ok, het IF NOT is duidelijk.

Maar ik ga het advies van Rob verder bekijken, gaat uiteindelijk om VAR's in een sessie, als de bezoeker de site verlaat mogen ze vervalen.

En voor het juiste beeld, alle programmeer kunsten in de verschillende talen heb ik mezelf geleerd zonder cursus, wellicht daardoor volg ik niet altijd de "standaard" manier van opzetten van code.
Ik geef zonder meer toe, kom ik er na veel puzzelen niet uit dan roep ik hulp in van Forums.

Maar het maakt me wel trots als een project draait, terwijl dit voor een PRO programmeur een eitje zou zijn.
Gewijzigd op 23/02/2020 20:59:59 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/02/2020 21:20:15
Quote Anchor link
>> Maar ik ga het advies van Rob verder bekijken, gaat uiteindelijk om VAR's in een sessie, als de bezoeker de site verlaat mogen ze vervalen.

Goed idee! Ben je bekend met sessie variabelen?
 
Marco Apeldoorn

Marco Apeldoorn

23/02/2020 21:38:30
Quote Anchor link
Nee, daarom ga ik het rustig bekijken en in (testpagina) opbouwen, kom ik zeker op terug.
Wil ik eerst leren kennen voordat ik het in de (nu onder PHP7 draaiende website) inbouw.
Er staat (zag ik al) uitgebreide uitleg online.

Bedankt (allemaal) voor de adviezen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.