Predefined PHP variabelen

CMD FED Y2Q2W3 Lesbrief

Leerdoelen

Predefined PHP variabelen

Wat zijn 'Predefined' PHP variabelen? Het woord zegt het al: per defined, dus voorgedefinieerd. Ze bestaan al, je hoeft ze niet aan te maken. Je kunt ze meteen gaan gebruiken. Dit soort variabelen worden ook wel 'superglobals' genoemd, omdat de value van zo'n superglobal over meerdere pagina's gebruikt kan worden.

Je kunt de superglobals bekijken met een speciale PHP functie, genaamd phpinfo.

Aanroepen van deze funcie gaat als volgt:

<?php
phpinfo(); ?>

$_SERVER, $_SESSION en $_REQUEST variabelen

 

Het Request Response Model

Het Request Response Model beschrijft de manier waarop informatie uitwisseling tussen client en de server wordt afgehandeld. De client stuurt een request en de server geeft een response. Vergelijk het maar met bellen: jij (als client) wilt informatie van iemand (server), je toetst een telefoonnummer (ip-adres) in, er wordt opgenomen aan de andere kant (handshaking) en de informatieuitwisseling (http) vind plaats. Uitwisseling kan dus pas als er een verbinding is tussen de client en de server. Deze verbinding vindt plaats via een bepaald protocol, het TCP/IP protocol. (de telefoonlijn)


HTTP 0.9 en 1.0 ondersteunen transitory connections:
Hierbij is slechts een single request/response uitwisseling mogelijk. Zeer inefficient, gezien de aanvraag voor een webpagina vaak uit meerdere requests bestaat. Denk maar aan een hyperlink naar een andere pagina. Of een image. Al deze links genereren requests. En als er steeds maar 1 request tegelijk verstuurd kan worden en 1 response tegelijk verwerkt kan worden, dan lopen de wachttijden al snel op. Zeker als je weet dat voor ieder request de TCP/IP connection opnieuw moet worden opgebouwd!
Nog even de vergelijking met het telefoneren: stel je voor dat je dan bij iedere vraag een telefoonnummer moet bellen om daarna op te hangen om teruggebeld te worden voor het antwoord!

Daarom is HTTP 1.1 anders van concept. Het ondersteunt persistant connections, waarbij eerst de TCP/IP connection wordt gemaakt, waarna er meerdere requests en responses tegelijk in 1 sessie kunnen worden afgehandeld.

Je kunt hier meer over vinden op tcpipguide.com, zie http://www.tcpipguide.com/free/t_HTTPTransitoryandPersistentConnectionsandPipelinin.htm

Request-Response info in phpinfo()

Het Request Object

Zoals je kunt zien op bovenstaand overzicht bestaat het Request Object weer uit 3 objecten. In het Request Object staat alles wat aankomt op de server, verstuurd vanuit de browser.

De Request en Response informatie vind je terug in speciale voorgedefinieerde variabelen:

$_REQUEST

Verzamelobject van $_GET, $_POST en $_COOKIE
In PHP kun je deze bekijken mbv.

<?php print_r($_REQUEST);    //tonen inhoud ALLE request objecten ?>


$_GET

Een GET object bevat informatie die zichtbaar in URL wordt meegestuurd naar de server. Zie uitleg bij Google scherm verderop in deze lesbrief.
$_GET wordt gevuld zodra je een formulier hebt ingevuld en verstuurd met de get methode.
In PHP kun je deze bekijken mbv.

<?php print_r($_GET); //tonen    inhoud ALLE get objecten ?>
<?php echo $_GET['variabele']    ; //tonen inhoud get object met naam 'variabele' ?>

lifecycle: inhoud van de variabele is verdwenen als je de pagina waar de variabele wordt uitgelezen ververst.
Dus de ontvangende pagina krijgt de informatie maar deze is dus houdbaar zolang de ontvangende pagina aktief is. Als je de informatie wil doorgeven naar een andere pagina, dan kun je dit doen via een $_SESSION object of via een $_COOKIE object.


$_POST

Een POST object bevat informatie die NIET zichtbaar in de URL wordt meegestuurd, dus 'onderwater', naar de server.
$_POST wordt gevuld zodra je een formulier hebt ingevuld en verstuurd met de post methode.
In PHP kun je deze bekijken mbv.

<?php print_r($_POST); //tonen inhoud ALLE post objecten ?>
<?php echo $_POST['variabele']; //tonen inhoud post object met naam 'variabele' ?>


$_COOKIE

Een COOKIE object bevat informatie welke door de server is opgeslagen op de lokale computer
zie boek vanaf pagine 336.

$_COOKIE wordt gevuld met de functie setcookie(). Je moet een cookienaam opgeven als eerste parameter, daarna de inhoud als 2e parameter, daarna geef je op tot wanneer de cookie geldig is. Er zijn nog meer parameters, zie php.net voor uitgebreide informatie.

voorbeeld:

<?php setcookie( "LoginInfo", $username, time()+3600 ); ?>

belangrijk:

Als je gegevens in een cookie gaat bewaren met setCookie dan moet dit als eerste in de PHP pagina plaatsvinden. Als je dit niet doet dan krijg je een foutmelding en wordt de cookie NIET opgeslagen!

Zodra je een cookie hebt opgeslagen met setCookie() dan kun je deze weer bekijken mbv.

<?php print_r($_COOKIE); //tonen inhoud ALLE cookie objecten ?>
<?php echo $_COOKIE['cookienaam'] ; //tonen inhoud cookie object met naam 'cookienaam' ?>

Hoe zat het ook weer met een 'gewone' lokale variabele?

Het bereik van een 'gewone' variabele beperkt zich tot de scriptpagina (en de eventuele includes) waar de variabele wordt gemaakt, gevuld en gebruikt.

Voorbeeld:
Stel je vult in het script login.php een variabele met de naam $username:

$username = 'henk';

Binnen het script login.php kun je dan de waarde weer opvragen met:

echo ($username);

Als je daarna een andere pagina (bijv. check_login.php) aanroept, bijvoorbeeld via een hyperlink, dan is op de nieuwe pagina de variabele $username NIET meer aanwezig. Terwijl je die daar misschien wel zou willen kunnen gebruiken.
De variabele $username in login.php wordt daarom ook wel een lokale variabele genoemd.

Hoe kun je een variabele dan doorgeven aan een andere pagina?

Daar zijn verschillende manieren voor. Je kunt bijvoorbeeld een formulier-variabele gebruiken. Als je in een HTML pagina een formulier invult en daarna verstuurt dmv. de SUBMIT methode, dan wordt de inhoud van het formulier opgeslagen in diverse superglobals. Een overzicht van deze superglobals vind je op pagina 53.
Zo is er de superglobal $_POST. Dit is een array waarin alle verstuurde formuliervelden worden opgeslagen.

Gegevens verstuurd via de POST-methode worden niet zichtbaar in de URL doorgegeven naar de ontvangende script-pagina. Dit in tegenstelling tot de GET-methode, waarin gegevens wel zichtbaar door bijvoorbeeld een form via de URL worden doorgegeven aan een andere pagina. Je hebt dit vast wel eens gezien, kijk maar eens naar de URL van Google als je een zoekopdracht hebt gegeven:

voorbeeld simpel formulier genaamd, login.html:

<form action="check_login.php" method="POST"> <!-- via method geef je aan hoe de gegevens worden verstuurd -->  
  <input type="text" name="username" \>	   <!-- hier ontstaat de variabele $_POST['username'] -->
  <input type="submit" \>
</form>

Via de submit button wordt het formulier uit login.html via de POST-methode verstuurd naar check_login.php
Daar is de superglobal variabele $_POST['username'] beschikbaar.
Je kunt deze daar dan tonen met bijv.

echo ($_POST['username']);

We weten dat de lifecycle van POST en GET objecten beperkt is, nl. zolang het ontvangende script aktief is zijn ze aanwezig. Als we via een hyperlink verder gaan naar een andere pagina dan is de inhoud van POST en GET uit de eerdere pagina verdwenen. Als je toch variabelen wilt doorgeven dan kun je gebruik maken van $_SESSION; deze sessie-variabele is ook een superglobal. Prima geschikt om iets in op te slaan wat tijdens een sessie (browsersessie, een schermwisseling in de browser met 1 of meerdere pages van een website) beschikbaar moet blijven. Als je bent ingelogd kun je bepaalde pagina's openen. Als je niet bent ingelogd dan word je geweigerd en krijg je een login scherm te zien, zoals bij de postbank:

Stel dat je hebt bepaald dat de username, die je in je formulier hebt ingevuld, een juiste username is.
Deze controle voer je uit met een if statement zoals hieronder.
Deze controle staat in het script check_login.php

if ($username=='henk') {
  echo ('Welkom ' . $username . ', je bent nu ingelogd');
  // vastleggen dat iemand is ingelogd met een SESSION
  $_SESSION['ingelogd'] = TRUE;
  // verdere aktie
  . . . .

} else {

  echo ('Er is iets fout gegaan');
  $_SESSION['ingelogd'] = FALSE;
  // verdere aktie
  . . . .

}

Uitleg bovenstaand script
Via een if wordt gecontroleerd of de inhoud van variabele $username gelijk is aan de tekst 'henk'.
Als dit het geval is dan wordt er een samengestelde welkomsttekst getoond.
Daarna wordt de sessie variabele 'ingelogd' op true gezet om vast te leggen dat de login valide is.
Een verdere aktie zou kunnen zijn om een vervolgscript aan te roepen.
Als de tekst niet gelijk is aan 'henk' dan wordt de melding 'er is iets fout gegaan' getoond
Daarna wordt de sessie variabele 'ingelogd' op false gezet om vast te leggen dat de login mislukt is.
Een verdere aktie zou kunnen zijn om het login-scherm opnieuw te tonen.

Ieder script wat beveiligd dient te worden met een login, kan nu dus worden uitgebreid met de onderstaande code.
In die code wordt gecontroleerd op de inhoud van de superglobal $_SESSION['ingelogd']:

if ($_SESSION[ingelogd'] == FALSE) {
// niet toegestaan, dus // tonen login formulier header("Location: login.html"); . . . . } // toegestaan, dus verder . . . .

Erg handig, want je kunt de bovenstaande controle weer onderbrengen in een function zoals we in les4 zullen behandelen. Deze function kun je weer in een include onderbrengen.
En deze include zet je bovenin elke pagina zodat je de login check function kan aanroepen wanner je maar wilt.

Zie ook de workshop van deze week.

Voor superglobals zie ook het boek PHP 6 en MySQL 5 blz. 40, 53, 55, 106

Error Reporting

In PHP kun je instellen hoe er dient te worden omgegaan met foutmeldingen die in de pagina kunnen optreden.

// toon alle foutmeldingen
error_reporting(E_ALL);

Zie php.net voor de overige instellingen

Lesopdracht:

Maak een login formulier zoals hierboven. Gebruik de GET of POST methode.
Geef als action op: setcookie.php

Maak vervolgens een 2e bestand en noem deze setcookie.php
Hierin ga je de username en het password opslaan in een cookie.

Maak vervolgens een 3e bestand aan en noem deze showcookie.php
Hierin maak je de inhoud zichtbaar van de superglobal $_COOKIE