Tredun ohjelmistokehittäjien kurssimateriaaleja
Kun sivu pyydetään palvelimelta, sille voidaan pyynnön mukana erilaisia parametreja. Esim. käyttäjältä voidaan kysyä hänen nimeään. Tämä tieto välitetään palvelimelle osoitekentässä kuljetettavissa muuttujissa. Esimerkiksi name-muuttujalle voidaan antaa arvo osoitekentässä:
index.php?name=Tiina
PHP:ssa näin saatuja arvoja kutsutaan superglobaaleiksi muuttujiksi. Ne tallentuvat taulukkoon, jonka nimi on $_GET[]. Superglobaalin muuttujan ‘name’ saa poimittua taulukosta sen nimen avulla:
<?php
echo "Hello, " . $_GET['name'];
?>
Koska osoiteriviin voi kirjoittaa mitä tahansa, myös vahingollista koodia, joka muuttaa sivun toimintaa, näitä superglobaaleja muuttujan arvoja ei saa koskaan käyttää ilman että ne käsittelee niin, että ne eivät toimi koodina, tätä kutsutaan sanitoinniksi (sanitation).
Käytännössä tämä tapahtuu niin, että kaikki erikoismerkit muunnetaan HTML-entiteeteiksi htmlspecialchars-funktion avulla:
<?= "Hello, " . htmlspecialchars($_GET['name']); ?>
index.php?name=<a href="http://google.com">Anna</a>
index.php?name=<script>alert("You got hacked!")</script>
PHP-ohjelman kannalta on oleellista testata lähettikö selain tietyt parametrit vai eli onko muuttujalle annettu arvo. Sen voi testata isset()-funktion avulla. isset() - palauttaa totuusarvon, jota voi testata joko perinteisellä if-else - ehtolauseella tai sitä vastaavalla lyhennettyllä muodolla, joka muodostetaan kysymysmerkin avulla (ternary operator).
<?php
if(isset($_GET['name'])){
$name = htmlspecialchars($_GET['name']);
if(isset($name))
echo "Hello " . $name;
else
echo "Hello, stranger";
}
?>
Tämän lyhyempi versio olisi:
<?= isset($name) ? "Hello {$name}" : "Hello, stranger"; ?>
Myös ehtolauseen voi katkaista ja kirjoittaa väliin HTML-koodia:
<?php if(isset($name))) : ?>
<p> Hello <?= $name ?></p>
<?php else : ?>
<p> Hello, stranger </p>
<?php endif?>