Tutorials

Superglobals

Duidelijke en simpele uitleg over de 5 meestegebruikte superglobals. Ik ben van mening dat te weinig mensen superglobals gebruiken, met name is dit erg bij $_POST en $_GET. Daarom kan iedereen het hier, nu, leren!

Pagina 1

Inleiding

Je ziet nog heel vaak dat mensen geen superglobals gebruiken, zelfs niet in nieuwe scripts.
Hierdoor onstaan heel veel problemen. Want niet alleen werkt het script bij deze persoon
zelf na een upgrade niet meer, maar ook beginners leren PHP 'verkeerd'.

Deze tutorial gaat over het gebruik van de superglobals $_GET, $_POST, $_SERVER, $_COOKIE en $_SESSION .
Ook bestaan er nog 3 superglobals, namelijk $_FILES, $_REQUEST en $_ENV. Hiervoor verwijs ik je naar http://nl3.php.net/variables.predefined

Ik zal eerst wat informatie geven over superglobals: waarom je ze moet gebruiken en wat het voordeel ervan is.
Pagina 2

Wat en Waarom?

Wat zijn superglobals?
Superglobals vervangen bepaalde 'gewone variabelen' en de $HTTP_XXX_VARS arrays (zoals $HTTP_POST_VARS).

Gegevens uit een sessie, cookie of van een POST of GET worden in een array gestopt, en dat zijn dus de superglobals.
Als je normaal die waarde zou uitlezen met $waarde of $HTTP_POST_VARS['waarde'], dan doe je dat nu met $_POST['waarde'].
Zoals je al weet is $_POST niet de enige, maar is er een superglobal per request method.

Waarom nou superglobals?
Ten eerste is het voor het overzicht heel erg handig. Als je bijvoorbeeld een script hebt van 100 regels of groter, dan
wordt het lastig te onthouden welke variabelen (als je $var gebruikt) nou van een formulier of GET (iets.php?naam=waarde) komen,
of dat je die zelf hebt gedefinieerd.
Ten tweede staat bij de nieuwere versies van PHP (PHP >= 4.3.4) register_globals op OFF. Dat betekent dat je $var helemaal
niet meer KAN gebruiken, en dus wel genoodzaakt bent om op superglobals over te gaan.
Ook handig is dat alle waardes van bijvoorbeeld 'een $_POST' in een array staan, want superglobals zijn arrays.

We gaan nu snel kijken naar de toepassingen van superglobals bij de method GET.
Pagina 3

$_GET

Waarschijnlijk weet je al wat een 'GET' inhoudt, maar ik zeg het toch nog even, zodat zelfs de ergste n00b dit nog kan volgen.
GET kan je in een formulier gebruiken, als method. Dus <form method="GET">. Na het submitten van het formulier komen dan
in de URL in de adresbalk alle <input> waarden en textarea waarden te staan, als volgt: http://site.ext/pagina.php?naam=waarde&naam2=waarde2

Als je die waarden wilt gebruiken in je script, dan zou je zonder superglobals simpelweg $naam gebruiken of $HTTP_GET_VARS['naam'].
Met superglobals gebruik je echter $_GET['naam'].

Misschien klinkt het een beetje raar en verwarrend, dus hier een voorbeeldje:

// formulier.html \\

<form method="GET" action="verwerking.php">
<input type="text" name="voornaam">
<input type="submit">
</form>

\\ EIND //
------------
// verwerking.php \\

<?php

echo $HTTP_GET_VARS['voornaam']; // dit is een oude manier

echo $voornaam; // dit is ook een oude manier

echo $_GET['voornaam']; // dit is dus de goede manier, met superglobal

// deze 3 manieren zijn dus 'hetzelfde'
?>

\\ EIND //

Ik denk dat het gebruik van superglobals nu wel redelijk duidelijk is. Nu komen er een paar
voorbeeld met $_POST, zodat je begrijpt wat het nut van superglobals is.
Pagina 4

$_POST

Hier komt een script met een zeer simpel formulier waar iemand zijn of haar naam en gegevens
moet invullen, die later ge-echo-d worden. Eerst komt er het script hoe je 'het vroeger zou doen',
en daarna met superglobals. Ik gebruik er ook wat gewone variabelen en overbodige rotzooi in, zodat je ziet dat superglobals
veel overzichtelijker zijn.

// geensuperglobals.php \\

<?php

$admin = "Erik";

if (isset($voornaam) && isset($leeftijd))
{
$newage = round($leeftijd * 365.25);
// afgeronde (round()) leeftijd in dagen, inclusief schikkeljaar

echo "Goededag " .$voornaam;

if (!empty($achternaam))
{
echo " " .$achternaam. "<br>";
}

else echo "<br>";

echo "Je bent vandaag " .$newage. " dagen oud<br>";
echo "Berekend door " .$admin;
}

else
{
echo "<form method=\"POST\">";
echo "<input type=\"text\" name=\"voornaam\"><br>";
echo "<input type=\"text\" name=\"achternaam\"><br>";
echo "<input type=\"text\" name=\"leeftijd\"><br>";
echo "<input type=\"submit\" name=\"submit\"><br>";
echo "</form>";
}

?>

\\ EIND //

Nu komt hetzelfde script, maar dan mèt superglobals:

// welsuperglobals.php \\

<?php

$admin = "Erik";

if (isset($_POST['voornaam']) && isset($_POST['leeftijd']))
{
$newage = round($_POST['leeftijd'] * 365.25);
// afgeronde (round()) leeftijd in dagen, inclusief schikkeljaar

echo "Goededag " .$_POST['voornaam'];

if (!empty($_POST['achternaam']))
{
echo " " .$_POST['achternaam']. "<br>";
}

else echo "<br>";

echo "Je bent vandaag " .$newage. " dagen oud<br>";
echo "Berekend door " .$admin;
}

else
{
echo "<form method=\"POST\">";
echo "<input type=\"text\" name=\"voornaam\"><br>";
echo "<input type=\"text\" name=\"achternaam\"><br>";
echo "<input type=\"text\" name=\"leeftijd\"><br>";
echo "<input type=\"submit\" name=\"submit\"><br>";
echo "</form>";
}

?>


\\ EIND //

Ik hoop dat je het verschil ziet en kan bedenken dat dit bij 500 regels script nogal lastig is om
uit elkaar te houden zonder superglobals.

Nu komt er info over het gebruik van superglobals bij Cookies.
Pagina 5

$_COOKIE

Ook cookies kan je nu gemakkelijk aanroepen met $_COOKIE['cookienaam']. Een cookie setten wordt
wel gewoon gedaan met setcookie().

Op zich is er niet veel interessants te vertellen over superglobals & cookies, behalve dan dat je
ze moet gebruiken.

Wel geef ik nog effe een voorbeeldje:

<?php

if (isset($_COOKIE['naam']) && isset($_COOKIE['laatste']))
{
echo "Welkom " .$_COOKIE['naam']. ", je laatste login was op " .$_COOKIE['laatste'];
}

else
{
setcookie("naam", $_SESSION['naam']);
// simpele setcookie() met als value de naam van een lopende sessie

setcookie("laatste", date("d-m-Y G:i"));
// simpele setcookie() met als value de huidige datum en tijd
}

?>

Nu ga je verder naar $_SESSION. Hierover is iets meer te vertellen, omdat bepaalde functies,
related to sessions, overbodig zijn geworden.
Pagina 6

$_SESSION

Sessions worden het meest gebruikt voor login scripts en dergelijke. Het is een serverside cookie,
die dus niet door iemand uitgelezen kan worden, alleen door de server waar de session op wordt
uitgevoerd.

Normaal gebruikte je session_register() om een session te registreren, en session_is_registered()
om te kijken of de session geregistreerd was, dus of iemand bijvoorbeeld is ingelogd.

Met superglobals kan dit echter een stuk makkelijker. Er komen nu 2 kleine scripts die hetzelfde
doen, alleen eentje zonder, en eentje met superglobals

<?php
session_start();

if (!session_is_registered("sessienaam"))
{
$sessienaam = "Een Geweldige Sessie";
session_register("sessienaam");
}

else
echo $HTTP_SESSION_VARS['sessienaam'];
?>

Nu de betere versie:

<?php
session_start();

if (!isset($_SESSION['sessienaam'])
$_SESSION['sessienaam'] = "Een Geweldige Sessie";


else
echo $_SESSION['sessienaam'];
?>


De 2 functies worden dus overbodig, én het script wordt overzichtelijker.

Ook de functies session_unregister() en session_destroy() worden overbodig. Het alternatief hiervoor is nu $_SESSION = array(); (gooi array leeg) of bijvoorbeeld unset($_SESSION['naam']) (gooi één stukje uit de $_SESSION array leeg).

Tot slot nu nog $_SERVER
Pagina 7

$_SERVER

PHP heeft een straatje met globals die serverinformatie, clientinformatie, headers
en paths als 'waarde' hebben. Deze zijn ook te vinden onder $HTTP_SERVER_VARS['DE_WAARDE']

Hiervoor heeft PHP nu de superglobal $_SERVER aangemaakt. Zo kan je iemands IP adres bijvoorbeeld
krijgen door $_SERVER['REMOTE_ADDR'] en de browsergegevens met $_SERVER['HTTP_USER_AGENT'].

Dit is niet echt speciaal, je moet het gewoon weten. Voor een overzicht van deze waarden kan je gaan
naar http://nl2.php.net/manual/nl/reserved.variables.php
Pagina 8

Slot

Ik hoop dat jullie hiervan weer iets hebben bijgeleerd en dat het nu eindelijk voor iedereen duidelijk is.
Als er iets niet klopt ofzo hoor ik het wel, ik wil niet dat mensen het verkeerd gaan leren.

Veel plezier met programmeren!

> PHPerik

Reacties

0
Nog geen reacties.