Formulieren

Een formulier heeft gewoonlijk een action-attribute daarin staat het adres van de form-handler, dat is het script dat de gegevens uit het formulier verwerkt. Het is de gewoonte in Php om het formulier en de handler in één script onder te brengen. Dat is niet verplicht maar wel handig omdat ze daardoor onafscheidelijk zijn en makkelijk kunnen worden hergebruikt. Dergelijke scripts beginnen meestal met een stukje logica waarin bepaald wordt wat er moet gebeuren. Zoals gezegd bevat het action-attribuut een adres. Daar zijn wij niet zo gek op want als we hetzelfde script elders toe willen passen dan moet dat adres weer veranderd worden. Daarom vervangen we dat adres door een variabele die Php zelf in mag vullen. deze variabele ( $_SERVER['PHP_SELF'] ) bevat het adres van het actuele script. Dit is een zogenaamde servervariabele. Php haalt de (string)waarde daarvan ergens op uit een of ander serverregister en plaatst die dan netjes in de output. Als je met F12 of control-u de bron van je pagina bekijkt dan zie je dat het correcte adres bij de action bij het renderen van de pagina door Php netjes is ingevuld. De regel waarbinnen het formelement gedefinieerd wordt kan enigzins verwarrend overkomen maar als je het eenmaal begrijpt is het gewoon heel erg simpel. Een Php-script is vaak een mengelmoesje van PHP en HTML door elkaar. Besef goed in welke modus je zit. Als het form-element vanuit php wordt gedefinieerd wordt het echo-statement gebruikt.

echo '<form action="'.$_SERVER['PHP_SELF'].'?page=3" method="post">';

In het geval hierboven is er nog een GET-string aan vastgekoppeld. Daarmee maak je het script toch weer niet-algemeen-toepasbaar. Dan had je er net zo goed het hele adres in kunnen zetten. Toch is die GET-string bij Php-toepassingen vaak nodig om op de juiste pagina te komen. Gelukkig hebben we de beschikking over een servervariabele die ook die GET-string bevat: $_SERVER['REQUEST_URI']. Daarmee krijg je altijd het hele relatieve pad naar het actuele script inclusief de GET-string. (Overigens, voor de volledigheid, deze server-variabele is alleen beschikbaar op Apache-servers en niet op IIS.) Hiervan gebruikmakend krijgen we:

echo '<form action="'.$_SERVER['REQUEST_URI'].'" method="post">';

Als het formelement binnen Html-code wordt gedefinieerd moet er voor de variabele heel eventjes een uitstapje naar Php gemaakt worden.

<form action="<?php echo $_SERVER['REQUEST_URI']; ?>" method="post">

Deze formuleringen lijken veel op elkaar maar zijn toch heel anders.
In het eerste geval zien we dat een PHP-echo-string onderbroken wordt om er een variable in te lassen;
In het tweede geval wordt er te midden van de Html-code opeens een stukje Php ingeplemd. Vergeet die 'echo' niet want de betreffende waarde moet wel omgezet worden in Html.

In oudere scripts zien we nog wel $PHP_SELF i.p.v. $_SERVER['PHP_SELF']. Dit dateert uit het PHP4-tijdperk toen er nog geen superglobals waren. In PHP5 werkt dit niet. Gek genoeg zal het script toch gewoon werken. Hoe kan dat??? Als we in de browser de source bekijken, zien we dat er niets is ingevuld bij action. Wat blijkt: als er helemaal geen action is opgegeven dan neemt de browser als default het adres van de actuele pagina. Dus eigenlijk kan je jezelf al die moeite besparen en gewoon het hele action-attribuut weglaten. Dit zal wel niet helemaal kosjer zijn want het wordt nergens aanbevolen. Je bent dan natuurlijk ook afhankelijk van de grillen van je browser dus is het ongetwijfeld beter om voor een valide actionadres te zorgen.

Je zou kunnen denken dat het in het volgende geval helemaal niet nodig is om de string te onderbreken voor de variabele.

echo "<form action=\"".$_SERVER['REQUEST_URI']."\" method=\"post\">";
Immers binnen dubbele aanhalingstekens worden in PHP variabelen gewoon geëvalueerd. Hiervan ben ik overigens nooit zo gecharmeerd geweest omdat het m.i. rommelig is. Het blijkt zo te zijn dat je dat weer niet mag doen als er gequote sleutels in voorkomen. (array-sleutels zijn heel vaak strings, maar die moeten dan wel altijd tussen quotes staan) Dit geeft onoverkomenlijke problemen als je de heredoc-notatie gebruikt, want daarbij kan je niet zo makkelijk even uit de quote-mode springen. Daarom is daarvoor weer een oplossing bedacht en die ziet er zo uit:
echo "<form action=\"{$_SERVER['REQUEST_URI']}\" method=\"post\">";
. Maar deze notatie is helemaal niet voorbehouden aan heredoc gebruik; je mag hem ook gewoon in echo-regels toepassen.

Dankzij de accolades is dit zelfs toegestaan:

echo "<form action='{$_SERVER['REQUEST_URI']}' method='post'>";
Dat is toch een vrij overzichtelijke notatie.