General remarks
A PHP file typically consists of two parts:
- A PHP code block with param fetching and logic (e.g. form handling) at the top.
- An HTML block with some PHP for displaying only (!) at the bottom.
Processing a form
Use isset()
⚑ to extract parameters from $_GET
/$_POST
<?php
$name = isset($_GET['name']) ? (string) $_GET['name'] : '';
$pass = isset($_GET['pass']) ? (string) $_GET['pass'] : '';
$gender = isset($_GET['gender']) ? (string) $_GET['gender'] : '';
$cont = isset($_GET['cont']) ? (int) $_GET['cont'] : 0;
$meals = isset($_GET['meals']) ? (array) $_GET['meals'] : array();
$remark = isset($_GET['remark']) ? (string) $_GET['remark'] : '';
// …
Persisting a form
⚠ Always use htmlentities()
when outputting something on screen. If you don't, visitors will be able to perform an XSS attack!
<?php
// Get values from $_GET, or provide a default one if not set
$name = isset($_GET['name']) ? (string) $_GET['name'] : '';
$pass = isset($_GET['pass']) ? (string) $_GET['pass'] : '';
$gender = isset($_GET['gender']) ? (string) $_GET['gender'] : '';
$cont = isset($_GET['cont']) ? (int) $_GET['cont'] : 0;
$meals = isset($_GET['meals']) ? (array) $_GET['meals'] : array();
$remark = isset($_GET['remark']) ? (string) $_GET['remark'] : '';
?><!DOCTYPE html>
<html>
<head>
<title>Testform</title>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="styles.css" />
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
<fieldset>
<h2>Testform</h2>
<dl class="clearfix">
<dt><label for="name">Name</label></dt>
<dd class="text"><input type="text" id="name" name="name" value="<?php echo htmlentities($name); ?>" class="input-text" /></dd>
<dt><label for="pass">Password</label></dt>
<dd class="text"><input type="password" id="pass" name="pass" value="<?php echo htmlentities($pass); ?>" class="input-text" /></dd>
<dt><label>Gender</label></dt>
<dd>
<label for="gender_male"><input type="radio" class="option" name="gender" id="gender_male" value="male"<?php if ($gender == 'male') { echo ' checked="checked"'; } ?> />Male</label>
<label for="gender_female"><input type="radio" class="option" name="gender" id="gender_female" value="female"<?php if ($gender == 'female') { echo ' checked="checked"'; } ?> />Female</label>
</dd>
<dt><label for="cont">Continent</label></dt>
<dd>
<select name="cont" id="cont">
<option value="0"<?php if ($cont === 0) { echo ' selected="selected"'; } ?>>Please select...</option>
<option value="1"<?php if ($cont === 1) { echo ' selected="selected"'; } ?>>Africa</option>
<option value="2"<?php if ($cont === 2) { echo ' selected="selected"'; } ?>>America</option>
<option value="3"<?php if ($cont === 3) { echo ' selected="selected"'; } ?>>Antarctica</option>
<option value="4"<?php if ($cont === 4) { echo ' selected="selected"'; } ?>>Asia</option>
<option value="5"<?php if ($cont === 5) { echo ' selected="selected"'; } ?>>Europe</option>
<option value="6"<?php if ($cont === 6) { echo ' selected="selected"'; } ?>>Oceania</option>
</select>
</dd>
<dt><label>Meals</label></dt>
<dd>
<label for="meal0"><input type="checkbox" class="option" name="meals[]" id="meal0" value="breakfast"<?php if (in_array('breakfast', $meals)) { echo ' checked="checked"'; } ?> />breakfast</label>
<label for="meal1"><input type="checkbox" class="option" name="meals[]" id="meal1" value="lunch"<?php if (in_array('lunch', $meals)) { echo ' checked="checked"'; } ?> />lunch</label>
<label for="meal2"><input type="checkbox" class="option" name="meals[]" id="meal2" value="dinner"<?php if (in_array('dinner', $meals)) { echo ' checked="checked"'; } ?> />dinner</label>
</dd>
<dt><label for="remark">Remark</label></dt>
<dd class="text"><textarea name="remark" id="remark" rows="5" cols="40"><?php echo htmlentities($remark); ?></textarea></dd>
<dt class="full clearfix" id="lastrow">
<input type="hidden" name="moduleAction" value="processForm" />
<input type="submit" id="btnSubmit" name="btnSubmit" value="Send" />
</dt>
</dl>
</fieldset>
</form>
</body>
</html>
Formchecking
ℹ Use a hidden input named moduleAction
to check if a form was sent or not.
⚠ Always use urlencode()
when passing parameters into URLs
⚠ Always use exit()
after redirecting using header()
to prevent further execution of the script.
<?php
// initial values
$name = isset($_POST['name']) ? (string) $_POST['name'] : '';
$moduleAction = isset($_POST['moduleAction']) ? (string) $_POST['moduleAction'] : '';
$msgName = '*';
// form is sent: perform formchecking!
if ($moduleAction == 'processForm') {
$allOk = true;
// name not empty
if (trim($name) == '') {
$msgName = 'Please enter your name';
$allOk = false;
}
// end of form check. If $allOk still is true, then the form was sent in correctly
if ($allOk === true) {
header('Location: formchecking_thanks.php?name=' . urlencode($name));
exit();
}
}
?><!DOCTYPE html>
<html>
<head>
<title>Testform</title>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="styles.css" />
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<fieldset>
<h2>Testform</h2>
<dl class="clearfix">
<dt><label for="name">Name</label></dt>
<dd class="text">
<input type="text" id="name" name="name" value="<?php echo htmlentities($name); ?>" class="input-text" />
<span class="message error"><?php echo $msgName; ?></span>
</dd>
<dt class="full clearfix" id="lastrow">
<input type="hidden" name="moduleAction" value="processForm" />
<input type="submit" id="btnSubmit" name="btnSubmit" value="Send" />
</dt>
</dl>
</fieldset>
</form>
</body>
</html>
Working with file uploads
ℹ Inputs with type="file"
cannot be persisted.
<!DOCTYPE html>
<html>
<head>
<title>Testform</title>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="styles.css" />
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<fieldset>
<h2>Testform</h2>
<dl class="clearfix">
<dt><label for="image">Image</label></dt>
<dd class="text"><input type="file" id="image" name="image" value="" class="input-text" /></dd>
<dt class="full clearfix" id="lastrow">
<input type="hidden" name="moduleAction" value="processUpload" />
<input type="submit" id="btnSubmit" name="btnSubmit" value="Send" />
</dt>
</dl>
</fieldset>
</form>
</body>
</html>
In 05.files.and.folders.html we'll see how to handle an upload