2.7 A Working Example
In this section, we use some of the
techniques described so far to develop a simple, complete PHP script.
The script doesn't process input from the user, so
we leave some of the best features of PHP as a web scripting language
for discussion in later chapters.Our example is a script that produces a web page containing the times
tables. Our aim is to output the 1-12 times tables. The first table
is shown in Figure 2-2 as rendered by a Mozilla
browser.
Figure 2-2. The output of the times-tables script rendered in a Mozilla browser

shown in Example 2-4. The first ten lines are the
HTML markup that produces the <head>
components and the <h1>The Times
Tables</h1> heading at the top of the web page.
Similarly, the last two lines are HTML that finishes the document:
</body> and
</html>.Between the two HTML fragments that start and end the document is a
PHP script to produce the times-table content and its associated
HTML. The script begins with the PHP open tag
<?php and finishes with the close tag
?>.
Example 2-4. A script to produce the times tables
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"The script is designed to process each times table and, for each
"http://www.w3.org/TR/html401/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>The Times-Tables</title>
</head>
<body bgcolor="#ffffff">
<h1>The Times Tables</h1>
<?php
// Go through each table
for($table=1; $table<13; $table++)
{
print "<p><b>The " . $table . " Times Table</b>\n";
// Produce 12 lines for each table
for($counter=1; $counter<13; $counter++)
{
$answer = $table * $counter;
// Is this an even-number counter?
if ($counter % 2 == 0)
// Yes, so print this line in bold
print "<br><b>$counter x $table = " .
"$answer</b>";
else
// No, so print this in normal face
print "<br>$counter x $table = $answer";
}
}
?>
</body>
</html>
table, to produce a heading and 12 lines. To do this, the script
consists of two nested loops: an outer and inner
for loop.The outer for loop uses the integer variable
$table, incrementing it by 1 each time the loop
body is executed until $table is greater than 12.
The body of the outer loop prints the heading and executes the inner
loop that actually produces the body of each times table.The inner loop uses the integer variable $counter
to generate the lines of the times tables. Inside the loop body, the
$answer to the current line is calculated by
multiplying the current value of $table by the
current value of $counter.Every second line of the tables and the times-table headings are
encapsulated in the bold tag <b> and bold
end tag </b>, which produces alternating
bold lines in the resulting HTML output. After calculating the
$answer, an if statement
follows that decides whether the line should be output in bold tags.
The expression the if statement tests uses the
modulo operator % to test if
$counter is an odd or even number.The modulo operation divides the variable $counter
by 2 and returns the remainder. So, for example, if
$counter is 6, the returned value is 0, because 6
divided by 2 is exactly 3 with no remainder. If
$counter is 11, the returned value is 1, because
11 divided by 2 is 5 with a remainder of 1. If
$counter is even, the conditional expression:
($counter % 2 == 0)is true, and bold tags are printed.Example 2-4 is complete but not especially
interesting. Regardless of how many times the script is executed, the
result is the same web page. In practice, you might consider running
the script once, capturing the output, and saving it to a static HTML
file. If you save the output as HTML, the user can retrieve the same
page, with less web-server load and a faster response time.In later chapters, we develop scripts with output that can change
from run to run, and can't be represented in a
static file. In Chapter 6, we show scripts that
interact with the MySQL database management system; the result is
dynamic pages that change if the underlying data in the database is
updated. We also show scripts that interact with the system
environment and with user input from fill-in
forms.