Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Web Development
You last visited: Today at 07:53

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Cookie erst nach refresh nicht mehr NULL

Discussion on Cookie erst nach refresh nicht mehr NULL within the Web Development forum part of the Coders Den category.

Reply
 
Old   #1
 
Legithos's Avatar
 
elite*gold: 95
Join Date: Nov 2009
Posts: 669
Received Thanks: 47
Cookie erst nach refresh nicht mehr NULL

Hallo zusammen,

ich bin gerade dabei meine Seite mehrsprachig aufzubauen. Hierfür nutze ich Übersetzungsseiten im .json-Format.

Die Sprache würde ich gerne als Cookie ($_COOKIE["language"]) regeln. Jetzt habe ich das Problem, dass zwar ein Cookie namens language und dem Inhalt de_DE oder us_US erstellt, jedoch anschließend nicht die richtige Übersetzungsdatei geladen wird, weil der $_COOKIE["language"] wohl NULL sei. Angezeigt wird er mir im Dev-Tool jedoch mit dem Inhalt us_US. Erst nach einem reload oder nach einer Weiterleitung wird dann die richtige Übersetzungsdatei geladen.

Code aus meiner header-Datei und somit der Datei, die bei egal welchem Unterseitenaufruf IMMER als erstes geladen wird.

Zudem kann der Cookie language für diverse andere Zwecke via POST (weil die Sprachenänderung für den User mit Sprachenflaggen in Form von <forms> gehandhabt wird) und GET (aus einem Link mit z.B. $lang=us_US) geändert werden.

Code:
// configuration of the language with the cookie $_COOKIE["language"]
if((isset($_COOKIE["language"]) AND $_COOKIE["language"] == 'de_DE') OR (isset($_COOKIE["language"]) AND $_COOKIE["language"] == 'us_US')){
        
        // change language with get ?lang
        if(isset($_GET["lang"]) AND !empty($_GET["lang"])){
        
            setcookie("language", htmlspecialchars($_GET["lang"]), time()+(3600*24*365), '/');
            $_SESSION["user_language"] = htmlspecialchars($_GET["lang"]);
            $translations = json_decode($lang_file_content, true);
            $_GET["lang"] = NULL;
            
        }
    
        // change language with language flag
        if(isset($_POST['lang']) AND !empty($_POST['lang'])){
            
            $_SESSION["user_language"] = htmlspecialchars($_POST["lang"]);
            setcookie("language", htmlspecialchars($_POST["lang"]), time()+(3600*24*365), '/');
            
            
        }

} elseif(!isset($_COOKIE["language"]) AND ((isset($_POST["lang"]) AND !empty($_POST["lang"])) OR (isset($_GET["lang"]) AND !empty($_GET["lang"])))) {
    
        // change language with get ?lang
        if(isset($_GET["lang"]) AND !empty($_GET["lang"])){
            
            setcookie("language", htmlspecialchars($_GET["lang"]), time()+(3600*24*365), '/');
            $_SESSION["user_language"] = htmlspecialchars($_GET["lang"]);
            $translations = json_decode($lang_file_content, true);
            $_GET["lang"] = NULL;
            
        }
    
        // change language with language flag
        if(isset($_POST['lang']) AND !empty($_POST['lang'])){
            
            $_SESSION["user_language"] = htmlspecialchars($_POST["lang"]);
            setcookie("language", htmlspecialchars($_POST["lang"]), time()+(3600*24*365), '/');
            
            
        }
    
} elseif((isset($_COOKIE["language"]) AND $_COOKIE["language"] != "de_DE") OR (isset($_COOKIE["language"]) AND $_COOKIE["language"] != "us_US")) {
    
        // if changed and not de_DE or us_US
        setcookie("language","us_US",time()+(3600*24*365), '/');
        include_once $_SERVER['DOCUMENT_ROOT'] . "/nocookies.php";
        exit();
    
} else {
    
        // set language cookie
        setcookie("language", "us_US", time()+(3600*24*365), '/');
       
}

// language files
$lang_file_content = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/config/lang/" . $_COOKIE["language"] . ".json");
$translations = json_decode($lang_file_content, true);
Hier der konkrete Fall. Sollte ich die Seite zum ersten Mal besucht haben und noch kein Cookie language gesetzt sein, dann wird obwohl beim ersten Besuch der Cookie language zwar laut Dev-tool gesetzt wird ( siehe den else-Fall der if-Schleife ), jedoch versucht er dann mit $lang_file_content die Datei zu laden, bei der $_COOKIE["language"] dann NULL ist... Wenn ich mit header("Location: #"); die Seite nach der Erstellung des Cookies nochmals reloade dann lädt er die richtige Datei und alles funkst.

Vielleicht kann mir jemand helfen ? Fehler von PHP bekomme ich abgesehen von $_COOKIE["language"] = NULL keine angezeigt.
Legithos is offline  
Old 08/03/2020, 21:04   #2


 
False's Avatar
 
elite*gold: 0
The Black Market: 243/0/0
Join Date: Apr 2011
Posts: 11,118
Received Thanks: 2,435
Weißt du den wie ein Cookies gesetzt wird (Sprich wie es abläuft) ?

Ich gehe mal davon aus das dies nicht der Fall ist, ansonsten würdest du den Fehler sofort finden.
Die Funktion setcookie(...) setzt ein Header, dieser Header wird vom Browser ausgelesen, interpretiert und dann wird der cookie gesetzt.

Denk dir beim ersten Pfeil statt Login einfach "Erster Request"


Das heißt aber auch wiederum das "$_COOKIE["language"]" erst gefüllt sein kann nach dem du die Seite erneut aufrufst.
Sprich du solltest nicht
PHP Code:
$lang_file_content file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/config/lang/" $_COOKIE["language"] . ".json"); 
sondern
PHP Code:
$lang_file_content file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/config/lang/" $language ".json"); 
nutzen.
Die Variable $language füllst du jenachdem (Entweder aus dem Cookie, aus get, post, oder was auch immer).

Der Code sieht für das was es tun soll übrings gruselig aus
Soetwas in die richtung sollte auch gehen (und ausreichen):
PHP Code:
$language 'de_DE'//DEFAULT LANGUAGE
$allowedLanguages = ['de_DE''us_US'];

if (isset(
$_COOKIE["language"]) && in_array($_COOKIE["language"], $allowedLanguagestrue)) {
    
$language $_COOKIE["language"];
}

if (isset(
$_POST['lang']) and !empty($_POST['lang'])) {
    
$language $_POST['lang'];
}

if (isset(
$_GET['lang']) and !empty($_GET['lang'])) {
    
$language $_GET['lang'];
}

if (
$language !== $_COOKIE["language"]) {
    
setcookie("language"$languagetime() + (3600 24 365), '/');
}

$lang_file_content file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/config/lang/" $language ".json");
$translations json_decode($lang_file_contenttrue); 
False is offline  
Thanks
3 Users
Old 08/03/2020, 21:22   #3
 
Legithos's Avatar
 
elite*gold: 95
Join Date: Nov 2009
Posts: 669
Received Thanks: 47
Das klingt fantastisch, vielen Dank !

Bin halt leider erst in meinen Anfängen .

Prinzipiell funktioniert alles einwandfrei, nur habe ich noch Probleme bei der Verwendung von Funktionen nach genanntem Prinzip. Zwar ist die Variable $language jetzt mit de_DE belegt, nur können Funktionen ja nicht auf die Variable $language zugreifen. Ich mach dir ein Beispiel.

Wir haben 3 Seiten
Code:
- index.php - Startseite
- header.php - Unsere header-Datei zum einbinden
- Test.php - Unsere Testklasse mit der test_function() Funktion
Test.php

header.php (von False)

index.php

Wenn ich die index.php nun ausführe, wird erst nach einem refresh die gewechselte Sprache anzeigen, da ich die $language variable ja nicht in der Funktion nutzen kann und hier auf $_COOKIE["language"] zurückgreifen muss. Vielleicht hast du auch hier einen Tipp für mich ?

Danke schonmal,
Legithos
Legithos is offline  
Old 08/04/2020, 09:52   #4


 
False's Avatar
 
elite*gold: 0
The Black Market: 243/0/0
Join Date: Apr 2011
Posts: 11,118
Received Thanks: 2,435
Paar Möglichkeiten:
  • Die language Variable einfach als Parameter übergeben
  • Die language Variable global erreichbar machen (nicht so empfehlenswert)
  • OOP nutzen und mit setter/getter arbeiten
  • Den Inhalt von der Variable einfach in $_COOKIE['language'] schreiben falls dies nicht schon der Fall ist.
False is offline  
Thanks
1 User
Old 08/04/2020, 12:07   #5
 
Legithos's Avatar
 
elite*gold: 95
Join Date: Nov 2009
Posts: 669
Received Thanks: 47
Quote:
Originally Posted by False View Post
Paar Möglichkeiten:
  • Die language Variable einfach als Parameter übergeben
  • Die language Variable global erreichbar machen (nicht so empfehlenswert)
  • OOP nutzen und mit setter/getter arbeiten
  • Den Inhalt von der Variable einfach in $_COOKIE['language'] schreiben falls dies nicht schon der Fall ist.
  • Den Inhalt von der Variable einfach in $_COOKIE['language'] schreiben falls dies nicht schon der Fall ist.

Das war wohl die einfachste Möglichkeit bei meinem Projekt. Funktioniert genau wie es soll! Und nochmals herzlichen Dank False !
Legithos is offline  
Reply


Similar Threads Similar Threads
Will das Spiel starten und dann kommt NULL NULL
12/08/2011 - Kal Online - 2 Replies
Also wie im titel schon gesagt ist habe ich wenn ich das spiel starten will ein kleines fenster mit zwei "NULL NULL" buttons kann mir jemand helfen wie ich jetzt spielen und das problem lösen kann. wäre cool wenn schnell eine antwort kommt danke, gruß:D:D
How to kill Dark Colluseast: Null and Steelation: Null (TT 3-1)?
06/10/2011 - PW Hacks, Bots, Cheats, Exploits - 1 Replies
Can anyone tell me How to kill Dark Colluseast: Null and Steelation: Null (TT 3-1)? :handsdown: After patch 121 or mermaid update, the boss, Dark Colluseast: Null and Steelation: Null, has a random aggro, area stun, and area banish. :confused:
NULL NULL
11/01/2008 - Kal Online - 1 Replies
Hallo zusammen , Ich habe mir nach dieser anleitung Server erstellen - KalZone.de - Deutscher KalOnline P-Server Support einen kalserver gebaut . Aber wen ich in das spiel möchte ... zeigt er mir den fehler NULL NULL an i einem kleinem fenster.



All times are GMT +2. The time now is 07:53.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.