Voo het testen van enkele instelling heb ik een script gemaakt dat een aantal globale variabelen in $_SESSION plaatst
if ( ! session_id() ) @ session_start();
//$datum = date("d-m-Y H:i");
$_SESSION = array("first_name"=>"John",
                "family_name"=>"Doe",
                "user_rank"=>"ADMIN",
                "user_logged" => TRUE,
                "language"=>substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2),
                "ip-adres"=>$_SERVER['REMOTE_ADDR'],
                "SESSIONID"=>session_id(),
                "client-UNIX" => $timenow,
                "time-zone" => $datum
                );

Om gebruikers van niet toegankelijke pagina's door te sturen plaats ik boven aan die pagina's deze code
  if(!(! isset($_SESSION["user_logged"]) && $_SESSION["user_logged"] == FALSE)) {
    header("Location: login.php");
    exit;
}
Echter wordt altijd door verwezen naar de login pagina.
Enig idee??
Gebruik gewoon één ontkenning met een uitroepteken. Ik neem aan dat de sessie alleen bestaat als er is ingelogd. Dan voldoet een enkele voorwaarde met isset() ook.
Wat als je gaat debuggen? Bestaat de sessie dan?
Heb je session_start in je code staan?
Over deze code meteen een aantal opmerkingen:
1. gebruik gewoon session_start(), geen @, geen if constructies.
2. Waarom sla je het session id in de session op? Dat is nergens goed voor
3. Accept language is iets complexer dan een enkele waarde die je met substr kan uitlezen. Zie hier: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language
4. Je zit voor de login controle je condities nogal diep te nesten. Dit werkt ongetwijfeld beter:

<?php
if (!isset($_SESSION["user_logged"]) || $_SESSION["user_logged"] == FALSE) {
?>
Ook snap ik niet waarom je $_SERVER["HTTP_ACCEPT_LANGUAGE"] in de sessie opslaat. Die kan je prima gebruiken zonder sessie want die verandert toch nooit zomaar. Uiteraard zit er een heuse theorie achter het gebruik van $_SERVER["HTTP_ACCEPT_LANGUAGE"] waar Ben naar linkt.
Obelix en Idefix op 27/08/2017 21:19:03

Wat als je gaat debuggen? Bestaat de sessie dan?
Heb je session_start in je code staan?
De sessie start ik als eerste
if ( ! session_id() ) @ session_start();
//$datum = date("d-m-Y H:i");
$_SESSION = array("first_name"=>"Harry H.",
                "family_name"=>"Arends",
                "user_rank"=>"ADMIN",
                "user_logged" => TRUE,
                "language"=>substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2),
                "ip-adres"=>$_SERVER['REMOTE_ADDR'],
                "SESSIONID"=>session_id(),
                "client-UNIX" => $timenow,
                "time-zone" => $datum
                );


Dit is altijd true, waardoor altijd een redirect wordt uitgevoerd:

<?php
if (!(!isset($_SESSION["user_logged"]) && $_SESSION["user_logged"] == FALSE)) {
    header("Location: login.php");
    exit;
}
?>


Hier staat om te beginnen "als $_SESSION["user_logged"] niet is ingesteld én $_SESSION["user_logged"] false is":

!isset($_SESSION["user_logged"]) && $_SESSION["user_logged"] == FALSE

Dat kan niet. Iets kan nooit tegelijk én niet zijn ingesteld én false zijn, dus dit is altijd false.

Vervolgens keer je die false om in een true door er met ! een ontkenning van te maken:

if (!(!isset($_SESSION["user_logged"]) && $_SESSION["user_logged"] == FALSE))

Iets dat altijd false was, is daardoor nu altijd true, dus wordt altijd de redirect uitgevoerd.
- Ariën - op 27/08/2017 21:53:17

Ook snap ik niet waarom je $_SERVER["HTTP_ACCEPT_LANGUAGE"] in de sessie opslaat. Die kan je prima gebruiken zonder sessie want die verandert toch nooit zomaar. Uiteraard zit er een heuse theorie achter het gebruik van $_SERVER["HTTP_ACCEPT_LANGUAGE"] waar Ben naar linkt.
Deze heb ik eigenlijk instaan als controle en ik gebruik deze waarde om een welkoms bericht te maken
<?php
$_greetings = array(    "nl" => "Hallo Welkom",
                        "de" => "Hallo Wilkommen",
                        "en" => "Hello Welcome",
                        "fr" => "Bonjour Bienvenue",
                        "es" => "Hola Bienvenido",
                        "it" => "Ciao Benvenuto",
                        "sv" => "Hallå Välkommen",
                        "da" => "Hej Velkommen",
                        "fi" => "Hei Tervetuloa",
);

        echo (explode(' ',trim($_greetings[$_SESSION[language]]))[0]) ;
        echo " ".$_SESSION[first_name]." ,";
        echo (explode(' ',trim($_greetings[$_SESSION[language]]))[1]);
        echo "<br />Lsast visit on ";
?>
Het kan mischien beter/anders maar voor nu werkt het. Nog toe te voegen de controle voor onbekend $language
p.s. kan niet snel reageren, mijn ysteem ik continue amiol van Ziggo aan het downloaden. Probleem bij Ziggo

Als het om vertalen gaan.
Waarom maak je niet een bestand aan, per taal, waarin je een vertaal-array plaatst?
Dat maakt het vertalen tevens makkelijker.
Buiten alles is wat je opslaat gewoon niet correct. Je kunt niet gewoon even substr gebruiken om de taal te achterhalen. Zie de eerder geposte link.
Verder wordt $_SERVER["HTTP_ACCEPT_LANGUAGE"] ook niet veel gebruikt. Er zijn genoeg bedrijven of mensen in Nederland die een Engels vertaald operating-system hebben, en jij die dus standaard de Engelse taal geeft.
Los daarvan is de eerder gegeven link van Ben handig om te lezen, want aan landen hangen ook gewichten over welke taal nou belangrijk is.

De beste manier is om te kijken naar ip2geo.

Reageren