117471
Goto Top

PHP 8.1 isset - Syntaxproblem?

Huhu,

mein Webhoster hat das PHP auf 8.1 aktualisiert. Im Rahmen der Cookie-Handhabung habe ich eine Warnung bekommen, so dass ich jetzt vor dem Auslesen der Cookies prüfe, ob diese überhaupt existieren.

Code alt:

$cookie = $_COOKIE["cookie_erlaubt_ad"];  
if ($cookie == "allow") {  
  echo "\n<!-- Code fuer Google Ads -->\n";  
};

Code neu:

if (isset($_COOKIE["cookie_erlaubt_ad"])) {  
  $cookie = $_COOKIE["cookie_erlaubt_ad"];  
  if ($cookie == "allow") {  
    echo "\n<!-- Code fuer Google Ads -->\n";  
  };
}

Warum steigt der Mistvogel nicht in die Schleife ein? Das Cookie ist genau so gesetzt...?!?

Gruß,
Jörg

Content-ID: 4687586740

Url: https://administrator.de/contentid/4687586740

Ausgedruckt am: 25.11.2024 um 05:11 Uhr

StefanKittel
StefanKittel 19.11.2022 aktualisiert um 16:09:45 Uhr
Goto Top
Hallo,

bei mir gehts.
http://skit.center/1.php
<?php

echo "Cookies=";  
print_r($_COOKIE);
echo "<br>";  
echo "<br>";  

echo "PHP=" . phpversion();  

echo "<br>";  
echo "<br>";  


if (isset($_COOKIE['user'])) {  
    echo 'User is ' . $_COOKIE['user'];}  
else {        
    echo 'User is not logged in'; // false, cookie is not set  
}

http://skit.center/2.php
<?php

setcookie('user', 'Test', time()+3600, '/');  
echo "Cookie set";  

Mach doch mal ein print_r($_COOKIE); davor zum testen was es an Cookies gibt.

Stefan
117471
117471 19.11.2022 um 16:48:38 Uhr
Goto Top
Hallo,

ja - ich weiß, dass es so geht.

Aber in diesen einen Fall halt nicht. Da muss irgendein Syntaxfehler drin sein (per Cut & Paste übernommen), den ich schlichtweg nicht finde.

Gruß,
Jörg
tk1234
tk1234 19.11.2022 um 16:50:23 Uhr
Goto Top
Zitat von @117471:
mein Webhoster hat das PHP auf 8.1 aktualisiert. Im Rahmen der Cookie-Handhabung habe ich eine Warnung bekommen, so dass ich jetzt vor dem Auslesen der Cookies prüfe, ob diese überhaupt existieren.

Zugriff auf nicht existierende Variablen/Arrayelement war schon immer falsch, mit PHP 8.0 wurde die Fehlerstufe hier nur von Notice auf Warning gehoben.

$cookie = $_COOKIE["cookie_erlaubt_ad"];  

Warum das Umkopieren des Wertes? Aber setz doch einfach noch einen Standardwert:
$cookie = $_COOKIE["cookie_erlaubt_ad"] ?? 'denied';  

Warum steigt der Mistvogel nicht in die Schleife ein? Das Cookie ist genau so gesetzt...?!?

Welche Schleife?
117471
Lösung 117471 19.11.2022 um 16:59:29 Uhr
Goto Top
Hallo,

Zitat von @tk1234:

Warum das Umkopieren des Wertes?

Weil ich es nur auf diese Art und Weise begreife.

Welche Schleife?

Ich denke, wir schaffen das auch, ohne wertvollen Strom für unnötige Spitzfindigkeiten zu verschwenden face-wink

Ich habe inzwischen die Lösung: Offenbar unterscheide Opera zwischen einem Klick auf das Reload-Symbol und einem Klick mit gedrückter Shift-Taste auf das Reload-Symbol. Warum auch immer...

Gruß,
Jörg
StefanKittel
StefanKittel 19.11.2022 aktualisiert um 17:14:31 Uhr
Goto Top
Zitat von @117471:
Aber in diesen einen Fall halt nicht. Da muss irgendein Syntaxfehler drin sein (per Cut & Paste übernommen), den ich schlichtweg nicht finde.
Deshalb das Beispiel...

Zitat von @tk1234:
Warum das Umkopieren des Wertes?
Weil ich es nur auf diese Art und Weise begreife.
KISS

Ich habe inzwischen die Lösung: Offenbar unterscheide Opera zwischen einem Klick auf das Reload-Symbol und einem Klick mit gedrückter Shift-Taste auf das Reload-Symbol. Warum auch immer...
Bei Firefox z.B. ist F5-Reload und Strg-F5 Force-Reload.
StefanKittel
StefanKittel 19.11.2022 um 17:14:38 Uhr
Goto Top
Tip:
Bei "solchen" merkwürdigen fehlern verwende ich immer die("q5"); an bestimmten Stellen.
Die Zahl zähle ich dann hoch. Wenn ich die alte Zahl sehe, stimmt da irgendwas nicht.
firefly
firefly 19.11.2022 aktualisiert um 18:13:00 Uhr
Goto Top
Hi,

ich würde ja statt "isset()" immer !empty() nehmen.

if (!empty($_COOKIE["cookie_erlaubt_ad"])) {  
    if ($_COOKIE["cookie_erlaubt_ad"] == "allow") {  
        echo "\n<!-- Code fuer Google Ads -->\n";  
    }
}

oder vereinfacht:

if (!empty($_COOKIE["cookie_erlaubt_ad"])) {  
    echo $_COOKIE["cookie_erlaubt_ad"] == "allow" ? "\n<!-- Code fuer Google Ads -->\n" : null;  
}

Im "!empty()" ist das "isset()" inkludiert und der meckert auch nicht, wenn die Variable erst gar nicht vorhanden bzw. gesetzt wurde.

empty() überprüft ob die Variable:

  • überhaupt existiert
  • den Wert null hat
  • den Wert 0 hat
  • der Wert false ist

empty() ist das Equivalent zu:
!isset($var) || $var == false
bzw. bei !empty()
isset($var) || $var == true

Gruß
@firefly
117471
117471 19.11.2022 um 18:21:44 Uhr
Goto Top
Hallo,

in den Variablen steht aber „allow“ und „deny“ statt „false“ und „true“?!?

Oder verstehe ich das jetzt flasch?

Gruß,
Jörg
firefly
firefly 20.11.2022 um 03:27:43 Uhr
Goto Top
Zitat von @117471:

Hallo,

in den Variablen steht aber „allow“ und „deny“ statt „false“ und „true“?!?

Oder verstehe ich das jetzt flasch?

Gruß,
Jörg

Das mit den false/true war doch nur die Erklärung, was empty() alles prüft.

Oben hatte ich doch das Beispiel mit "allow" gemacht:

if (!empty($_COOKIE["cookie_erlaubt_ad"])) {  
    echo $_COOKIE["cookie_erlaubt_ad"] == "allow" ? "\n<!-- Code fuer Google Ads -->\n" : null;  
}

oder mit einer klassischen if Abfrage:

if (!empty($_COOKIE["cookie_erlaubt_ad"])) {  
    if ($_COOKIE["cookie_erlaubt_ad"] == "allow") {  
        echo "\n<!-- Code fuer Google Ads -->\n";  
    }
}

--> $_COOKIE["cookie_erlaubt_ad"] == "allow"

Die erste Zeile prüft ob dein $_COOKIE["cookie_erlaubt_ad"] überhaupt existiert, null, 0 oder false ist. Wenn nicht, dann geht er in die zweite Zeile und prüft auf dein "allow". Du sparst dir damit die Abfrage isset() und die zusätzliche Prüfung ob das Cookie leer ist (dein Fehler oben). isset prüft ja nur ob die Variable existiert, nicht aber ob sie den Wert 0, null, etc. hat. empty() bzw. !empty() macht beides. isset() würde ja bei einem Wert von "0" = true ausgeben. empty() wäre = false.

Gruß
firefly