Niet ingelogde gebruikers afvangen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
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
);
//$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
Code (php)
1
2
3
4
2
3
4
if(!(! isset($_SESSION["user_logged"]) && $_SESSION["user_logged"] == FALSE)) {
header("Location: login.php");
exit;
}
header("Location: login.php");
exit;
}
Enig idee??
Gewijzigd op 27/08/2017 19:37:19 door Harry H Arends
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.
Heb je session_start in je code staan?
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:
Gewijzigd op 27/08/2017 22:05:48 door Ben van Velzen
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:
De sessie start ik als eersteWat als je gaat debuggen? Bestaat de sessie dan?
Heb je session_start in je code staan?
Heb je session_start in je code staan?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
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
);
//$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
);
Code (php)
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:
Deze heb ik eigenlijk instaan als controle en ik gebruik deze waarde om een welkoms bericht te makenOok 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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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 ";
?>
$_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 ";
?>
p.s. kan niet snel reageren, mijn ysteem ik continue amiol van Ziggo aan het downloaden. Probleem bij Ziggo
Gewijzigd op 28/08/2017 16:59:03 door Harry H Arends
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.
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.
Gewijzigd op 28/08/2017 16:46:28 door Ben van Velzen
Vraag mij ook af dit voor het welkoms bericht van die paar talen zinvol is.
Of alles maar gewoon in het Engels doen??
Flickr doet dat ook. Maar ik was even in de veronderstelling dat je alles van je site wou vertalen.
Voor een enkel stukje vertaling voldoet deze implementatie van de array wel.
Gewijzigd op 28/08/2017 17:18:49 door Ben van Velzen
Code (php)
1
2
3
2
3
if(!isset($_greetings[$_SESSION['language']])) { } else {
$_SESSION['language'] = "en";
}
$_SESSION['language'] = "en";
}
Om de Scandinavisch namen en woorden juist te laten zien wordt het welkom op deze wijze getoond
Code (php)
1
2
3
2
3
$wMessage = htmlentities((explode(' ',trim($_greetings[$_SESSION['language']]))[0])) ;
$wMessage .= " ".htmlentities($_SESSION['language']." ,");
$wMessage .= htmlentities((explode(' ',trim($_greetings[$_SESSION['language']]))[1]));
$wMessage .= " ".htmlentities($_SESSION['language']." ,");
$wMessage .= htmlentities((explode(' ',trim($_greetings[$_SESSION['language']]))[1]));
Gewijzigd op 28/08/2017 19:45:59 door Harry H Arends
Daarna kun je gaan kijken naar de juiste charsets. Hier ben je van afhankelijk.
Ben van Velzen op 28/08/2017 18:18:13:
Aangepast en toegevoegd aan de html. Dit lijkt het probleem opgelost te hebben.Schrijf eerst je code eens zoals hij hoort te zijn. Dus niet $_SESSION[language] maar $_SESSION['language']. Hoe vaak is dit ondertussen al gezegd eigenlijk?
Daarna kun je gaan kijken naar de juiste charsets. Hier ben je van afhankelijk.
Daarna kun je gaan kijken naar de juiste charsets. Hier ben je van afhankelijk.
En als je databases gebruikt, geef dan ook mee bij je connectie dat je UTF-8 gebruikt.
Dit is zeker interessant leesvoer: http://www.phptherightway.com/#php_and_utf8
Hier wordt een hoop verteld over UTF-8 in PHP, en natuurlijk op de rest van de site een hoop andere 'good practise'.
Gewijzigd op 29/08/2017 21:32:48 door - Ariën -
De array's
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$_SESSION['language'] = "we";
date_default_timezone_set(Europe/Amsterdam');
$_SESSION['client-UNIX'] = time();
$_greetings = array( "nl" => "Hallo #USER# Welkom, <BR /> uw laatste bezoek was op #DATE# om #TIME#",
"de" => "Hallo #USER# Wilkommen,<br/>Ihr letzter Besuch war auf #DATE# at #TIME#",
"en" => "Hello #USER# Welcome,<br/>Your last visit was on #DATE# at #TIME#");
date_default_timezone_set(Europe/Amsterdam');
$_SESSION['client-UNIX'] = time();
$_greetings = array( "nl" => "Hallo #USER# Welkom, <BR /> uw laatste bezoek was op #DATE# om #TIME#",
"de" => "Hallo #USER# Wilkommen,<br/>Ihr letzter Besuch war auf #DATE# at #TIME#",
"en" => "Hello #USER# Welcome,<br/>Your last visit was on #DATE# at #TIME#");
Nu wil ik dus controleren of $_SESSION['language'] in de array voorkomt met de in_array functie
Code (php)
1
2
3
4
5
6
2
3
4
5
6
if (in_array($_SESSION['language'], $_greetings)) {
echo "this array contains".$_SESSION['language'];
} else {
echo "this array NOT contains ".$_SESSION['language'];
$_SESSION['language'] = 'en'; // default language
}
echo "this array contains".$_SESSION['language'];
} else {
echo "this array NOT contains ".$_SESSION['language'];
$_SESSION['language'] = 'en'; // default language
}
Echter wordt altijd de default in gesteld
Gewijzigd op 30/08/2017 20:18:20 door Ben van Velzen