PHP 101 tutorial.docx - it208

perchmysteriousData Management

Dec 1, 2012 (4 years and 8 months ago)

2,047 views

1






PHP

Tutorial


Laboratory Guide in IT 208

Web Development





Compiled by:

A. JONATHAN S. PAGATPAN

2


PHP 101: PHP For the Absolute Beginner

Vikram
Vaswani


http://devzone.zend.com/article/627

This area is intended for everyone new to PHP. It opens with a series of informal, entertaining
tutorials written by Vikram Vaswani, founder and CEO of Melonfi
re. These tutorials build on a
previously
-
published 5
-
part series which has now been updated and extended to embrace PHP 5,
making parts of it suitable for those of you who already have worked with PHP 4 in the past.

If you came here to learn about element
ary PHP 4 or basic PHP 5, this is for you. Enjoy!

PHP 101 (part 1):
Down the Rabbit Hole

[July 17, 2004]

An introduction to PHP’s variables and operators.

PHP 101 (part 2):
Calling All Operators

[July 18, 2004]

The rest of the PHP operators (there are many), and simple form processing.

PHP 101 (PART 3):
Looping the Loop

[July 19, 2004]

Bas
ic control structures explained.

PHP 101 (PART 4):
The Food Factor

[July 20, 2004]

Arrays, PHP array functions, and what it all means.

PHP 101 (PART 5):
Rank and File

[July 21, 2004]

Everything you’re ever likely to need to know about dealing with external files from a PHP
script.

PHP 101 (PART 6):
Functionally Yours

[July 28, 2004]

All about functions, arguments, passing by reference, globals and scope.

PHP 101 (PART 7):
The Bear Necessiti
es

[August 07, 2004]

A gentle introduction to object oriented programming in PHP 4 and PHP 5.

PHP 101 (PART 8):
Databases and Other Animals

[August 31, 2004]

All about connecting to a MySQL database
from PHP, using the mysql or mysqli extensions.

PHP 101 (PART 9):
SQLite My Fire!

[September 16, 2004]

Introducing another database: SQLite.

PHP 101 (part 10):
A Session In The Cookie Jar

[October 3, 2004]

Sessions and cookies


how to keep track of visitors to your site.

PHP 101 (part 11):
Sinfully Simple

[October 3, 2004]

An introduction

to PHP’s easiest method for dealing with XML.

3


PHP 101 (part 12):
Bugging Out

[January 30, 2005]

Basic error handling.

PHP 101 (part 13):
The
Trashman Cometh

[February 27, 2005]

A primer in basic security.

PHP 101 (part 14):
Going to the Polls

[March 8, 2005]

Putting the pieces together


a first Web application.

PHP 101 (part 15):
No News is Good News

[June 4, 2005]

Creating a simple RSS news aggregator.



4


PHP 101 (part 1): Down the Rabbit Hole

Vikram Vaswani

|
61 comments
| Saturday, July 17, 2004


The Only Acronym You'll Ever Need

The Right Environment

Start Me Up

A Case of Identity

An Equal Music

Not My Type

Market Value

Stringing Things Along

The Only Acronym You'll Ever Need

If you're new to Web development, you could be forgiven for thinking that it consists of no more
than a mass of acronyms, each one more indecipherable than the last. ASP, CGI, SOAP, XML,
HTTP
-

the list seems never
-
ending, and the sheer volume of informati
on on each of these can
discourage the most avid programmer. But before you put on your running shoes and flee, there's
a little secret you should know. To put together a cutting
-
edge Web site, chock full of all the
latest bells and whistles, there's only
one acronym you
really

need to know:

PHP

Now, while you have almost certainly
heard

of PHP, you may not be aware of just how powerful
the language is, and how much it can do for you. Today, PHP has the enviable position of being
the only open
-
source serv
er
-
side scripting language that's both fun and easy to learn. This is not
just advertising: recent surveys show that more than 16,000,000 Web sites use PHP as a server
side scripting language, and the language also tops the list of most popular Apache modu
les.

Why, you ask? The short answer: it's powerful, it's easy to use, and it's free. Extremely robust
and scalable, PHP can be used for the most demanding of applications, and delivers excellent
performance even at high loads. Built
-
in database support me
ans that you can begin creating
data
-
driven applications immediately, XML support makes it suitable for the new generation of
XML
-
enabled applications, and the extensible architecture makes it easy for developers to use it
as a framework to build their own

custom modules. Toss in a great manual, a knowledgeable
developer community and a really low price (can you spell f
-
r
-
e
-
e?) and you've got the makings
of a winner!

My goal in this series of tutorials is very simple: I'll be teaching you the basics of usi
ng PHP, and
showing you why I think it's the best possible tool for Web application development today. I'll be
making
no

assumptions about your level of knowledge, other than that you can understand basic
HTML and have a sense of humor. And before you ask.
.. Yes, this series covers both PHP 4 and
PHP 5, with new PHP 5 features flagged for easy reference.

5


Let's get going!

The Right Environment

PHP is typically used in combination with a Web server like Apache. Requests for PHP scripts
are received by the Web server, and are handled by the PHP interpreter. The results obtained
after execution are returned to the Web server, which takes care of tr
ansmitting them to the client
browser. Within the PHP script itself, the sky's the limit
-

your script can perform calculations,
process user input, interact with a database, read and write files... Basically, anything you can do
with a regular programming

language, you can do inside your PHP scripts.

From the above, it is clear that in order to begin using PHP, you need to have a proper
development environment set up.

This series will focus on using PHP with the Apache Web server on Linux, but you can ju
st as
easily use PHP with Apache on Windows, UNIX and Mac OS. Detailed instructions on how to
set up this development environment on each platform are available in the online manual, at
http://www.php.net/manual/en/installation.php

-

or you can just download a copy of PHP 5 from
http://www.php.net

and read the installation instructions.

Go do that now, and come back when you've successful
ly installed and tested PHP.

Start Me Up

There's one essential concept that you need to get your mind around before we proceed further.
Unlike CGI scripts, which require you to write code to output HTML, PHP lets you embed PHP
code in regular HTML pages,
and execute the embedded PHP code when the page is requested.

These embedded PHP commands are enclosed within special start and end tags, like this:

<?php


... PHP code ...


?>

Here's a simple example that demonstrates how PHP and HTML can be combined
:

<html>

<head></head>

<body>


Agent: So who do you think you are, anyhow?

<br />


<?php

// print output

echo 'Neo: I am Neo, but my people call me The One.';

6


?>


</body>

</html>

Not quite your traditional "Hello, World" program... but then again, I always thought tradition
was over
-
rated.

Save the above script to a location under your Web server document root, with a .php extension,
and browse to it. You'll see something like thi
s:


Look at the HTML source:

<html>

<head></head>

<body>


Agent: So who do you think you are, anyhow?

<br />

Neo: I am Neo, but my people call me The One.

</body>

</html>

What just happened? When you requested the script above, Apache intercepte
d your request and
handed it off to PHP. PHP then parsed the script, executing the code between the
<?php...?>

marks and replacing it with the output of the code run. The result was then handed back to the
server and transmitted to the client. Since the ou
tput contained valid HTML, the browser was
able to render it for display to the user.

7


A close look at the script will reveal the basic syntactical rules of PHP. Every PHP statement
ends in a semi
-
colon. This convention is identical to that used in Perl, a
nd omitting the semi
-
colon is one of the most common mistakes newbies make. That said, it is interesting to note that
a semi
-
colon is
not

needed to terminate the
last

line of a PHP block. The PHP closing tag
includes a semi
-
colon, therefore the following i
s perfectly valid PHP code:

<?php


// print output

echo 'Neo: I am Neo, but my people call me The One.'


?>

It's also possible to add comments to your PHP code, as I've done in the example above. PHP
supports both single
-
line and multi
-
line comment bl
ocks:

<?php


// this is a single
-
line comment


/* and this is a

multi
-
line

comment */


?>

Blank lines within the PHP tags are ignored by the parser. Everything outside the tags is also
ignored by the parser, and returned as
-
is. Only the code between the tags is read and executed.

A Case of Identity

Variables are the bread and butter of every p
rogramming language... and PHP has them too. A
variable can be thought of as a programming construct used to store both numeric and non
-
numeric data; the contents of a variable can be altered during program execution. Finally,
variables can be compared wit
h each other, and you
-

the programmer
-

can write code that
performs specific actions on the basis of this comparison.

PHP supports a number of different variable types: integers, floating point numbers, strings and
arrays. In many languages, it's essential to specify the variable type before using it: for example,
a variable may need to be specified as type
integer

or typ
e
array
. Give PHP credit for a little
intelligence, though: it automagically determines variable type by the context in which it is being
used!

Every variable has a name. In PHP, a variable name is preceded by a dollar ($) symbol and must
begin with a let
ter or underscore, optionally followed by more letters, numbers and/or
underscores. For example,
$popeye
,
$one

and
$INCOME

are all valid PHP variable names, while
$123

and
$48hrs

are invalid.

8


Note that variable names in PHP are case sensitive, so
$me

is d
ifferent from
$Me

or
$ME
.

Here's a simple example that demonstrates PHP's variables:

<html>

<head></head>

<body>


Agent: So who do you think you are, anyhow?

<br />


<?php

// define variables

$name = 'Neo';

$rank = 'Anomaly';

$serialNumber = 1;


// print output

echo "Neo: I am <b>$name</b>, the <b>$rank</b>. You can call me by my serial
number, <b>$serialNumber</b>.";

?>


</body>

</html>

Here, the variables
$name
,
$rank

and
$serialNumber

are first defined with string and numeric
values, and

then substituted in the
echo()

function call. The
echo()

function, along with the
print()

function, is commonly used to print data to the standard output device (here, the
browser). Notice that I've included HTML tags within the call to
echo()
, and those have been
rendered by the browser in its output. You can do this too. Really.

An Equal Music

To assign a value to a variable, you use the assignment operator: the = symbol. This is used to
assign a value (the right side of the equation) to a v
ariable (the left side). The value being
assigned need not always be fixed; it could also be another variable, an expression, or even an
expression involving other variables, as below:

<?php


$age = $dob + 15;


?>

Interestingly, you can also perform mo
re than one assignment at a time. Consider the following
example, which assigns three variables the same value simultaneously:

<?php


$angle1 = $angle2 = $angle3 = 60;

9



?>

Not My Type

Every language has different types of variable
-

and PHP is no excep
tion. The language supports
a wide variety of data types, including simple numeric, character, string and Boolean types, and
more complex arrays and objects. Here's a quick list of the basic ones, with examples:



Boolean:

The simplest variable type in PHP,

a Boolean variable, simply specifies a true
or false value.

<?php


$auth = true;


?>



Integer:

An integer is a plain
-
vanilla whole number like 75,
-
95, 2000 or 1.

<?php


$age = 99;


?>



Floating
-
point:

A floating
-
point number is typically a fraction
al number such as 12.5 or
3.141592653589. Floating point numbers may be specified using either decimal or
scientific notation.

<?php


$temperature = 56.89;


?>



String:

A string is a sequence of characters, like "hello" or "abracadabra". String values
m
ay be enclosed in either double quotes ("") or single quotes(''). (Quotation marks within
the string itself can be "escaped" with a backslash (
\
) character.) String values enclosed in
double quotes are automatically parsed for special characters and variab
le names; if these
are found, they are replaced with the appropriate value. Here's an example:

<?php


$identity = 'James Bond';

$car = 'BMW';


// this would contain the string "James Bond drives a BMW"

$sentence = "$identity drives a $car";

echo $sentence;

10



?>

To learn more about PHP's data types, visit
http://www.php.net/manual/en/language.types.php
.

Market Value

If variables are the building blocks of a programming language, operators are the glue that let
you build something useful with them. You've already seen one example of an operator
-

the
assignment operator
-
, which lets you assign a value to a variable. S
ince PHP believes in spoiling
you, it also comes with operators for arithmetic, string, comparison and logical operations.

A good way to get familiar with operators is to use them to perform arithmetic operations on
variables, as in the following example:


<html>

<head>

</head>

<body>


<?php


// set quantity

$quantity = 1000;


// set original and current unit price

$origPrice = 100;

$currPrice = 25;


// calculate difference in price

$diffPrice = $currPrice
-

$origPrice;


// calculate percentage

change in price

$diffPricePercent = (($currPrice
-

$origPrice) * 100)/$origPrice


?>


<table border="1" cellpadding="5" cellspacing="0">

<tr>

<td>Quantity</td>

<td>Cost price</td>

<td>Current price</td>

<td>Absolute change in price</td>

<td>
Percent change in price</td>

</tr>

<tr>

<td><?php echo $quantity ?></td>

<td><?php echo $origPrice ?></td>

<td><?php echo $currPrice ?></td>

<td><?php echo $diffPrice ?></td>

<td><?php echo $diffPricePercent ?>%</td>

</tr>

</table>

11



</body>

</ht
ml>

Looks complex? Don't be afraid
-

it's actually pretty simple. The meat of the script is at the top,
where I've set up variables for the unit cost and the quantity. Next, I've performed a bunch of
calculations using PHP's various mathematical operators
, and stored the results of those
calculations in different variables. The rest of the script is related to the display of the resulting
calculations in a neat table.

If you'd like, you can even perform an arithmetic operation simultaneously with an assig
nment,
by using the two operators together. The two code snippets below are equivalent:

<?php


// this...

$a = 5;

$a = $a + 10;


// ... is the same as this

$a = 5;

$a += 10;


?>

If you don't believe me, try echoing them both.

Stringing Things Alo
ng

Why stop with numbers? PHP also allows you to add strings with the string concatenation
operator, represented by a period (.). Take a look:

<?php


// set up some string variables

$a = 'the';

$b = 'games';

$c = 'begin';

$d = 'now';


// combine them using the concatenation operator

// this returns 'the games begin now<br />'

$statement = $a.' '.$b.' '.$c.' '.$d.'<br />';

print $statement;


// and this returns 'begin the games now!'

$command = $c.' '.$a.' '.$b.' '.$d.'!';

print $c
ommand;


?>

As before, you can concatenate and assign simultaneously, as below:

12


<?php


// define string

$str = 'the';


// add and assign

$str .= 'n';


// str now contains "then"

echo $str;


?>

To learn more about PHP's arithmetic and string oper
ators, visit
http://www.php.net/manual/en/language.operators.arithmetic.php

and
http://www.php.net/manual/en/language.operators.string.php
.

That's about it for this tutorial. You now know all about the basic building blocks and glue of
PHP
-

its variables and operators. In
Part

Two

of this series, I'll be using these fundamental
concepts to demonstrate PHP's powerful form processing capabilities.




13


PHP 101 (part 2): Calling All Operators

Vikram Vaswani

|
47 comments
| Saturday, July 17, 2004


Not What You Expected

Form...

...And Function

Operating With Extreme Caution

A Question of Logic

Older But Not Wiser

If Not This, Then What?

Spreading Confusion

The Daily Special

Not What You Expected

In
Part One

of this series, I gave you a brief introduction to PHP, and how it fits into your Web
application development environment. I also taught you the basics of PHP variables, and showed
you how to add, multiply and concatenate them together.

Now that you know

the basics, it's time to focus in on one of PHP's nicer features
-

its ability to
automatically receive user input from a Web form and convert it into PHP variables. If you're
used to writing Perl code to retrieve form values in your CGI scripts, PHP's si
mpler approach is
going to make you weep with joy. So get that handkerchief out, and scroll on down.

Form...

Forms have always been one of quickest and easiest ways to add interactivity to your Web site.
A form allows you to ask customers if they like you
r products, casual visitors for comments on
your site, and pretty girls for their phone numbers. And PHP can simplify the task of processing
the data generated from a Web
-
based form substantially, as this first example demonstrates. This
example contains t
wo scripts, one containing an HTML form (named form.htm) and the other
containing the form processing logic (message.php). Here's form.htm:


<html>

<head></head>

<body>

<form action="message.php" method="post">

Enter your message: <input type="text" na
me="msg" size="30">

<input type="submit" value="Send">

</form>

</body>

</html>

The critical line in this page is the
<form>

tag

14



<form action="message.php" method="post">

...

</form>

As you probably already know, the "action" attribute of the
<form
>

tag specifies the name of the
server
-
side script (
message.php

in this case) that will process the information entered into the
form. The "method" attribute specifies
how

the information will be passed.

...And Function

Now for the other half of the puzzle: the
message.php

script. This script reads the data
submitted by the user and "does something with it". Here is
message.php
:


<html>

<head></head>

<body>


<?php

// retrieve form data

$input = $_POST['msg'];

// use

it

echo "You said: <i>$input</i>";

?>


</body>

</html>

When you enter some data into
form.htm

(let's say "Boo"), and submit it, the form processor
message.php

will read it and display it to you ("You said:
Boo
"). Thus, whenever a form is
submitted to

a PHP script, all variable
-
value pairs within that form automatically become
available for use within the script, through a special PHP container variable:
$_POST
. You can
then access the value of the form variable by using its "name" inside the
$_POST

co
ntainer, as I
did in the script above.

Obviously, PHP also supports the GET method of form submission. All you need to do is change
the "method" attribute to "get", and retrieve values from
$_GET

instead of
$_POST
. The
$_GET

and
$_POST

variables are actua
lly a special type of PHP animal called an array, which I'll be
teaching you about shortly. Don't worry too much about it at the moment, just make sure you're
comfortable with retrieving simple values from a form with PHP, and then scroll on down to
learn
about some more operators that are useful in this context.

Operating With Extreme Caution

Thus far, the scripts we've discussed have been pretty dumb. All they've done is add numbers
and strings, and read back to you the data you typed in yourself
-

not e
xactly overwhelming. In
order to add some intelligence to your scripts, you need to know how to construct what geeks
15


call a "conditional statement"
-

a statement which lets your script perform one of a series of
possible actions based on the result of a co
mparison test. And since the basis of a conditional
statement is comparison, you first need to know how to compare two variables and determine
whether they're identical or different.

You've already seen some of PHP's arithmetic and string operators. Howev
er, the language also
comes with operators designed specifically to compare two values: the so
-
called "comparison
operators". Here's an example that demonstrates them in action:


<?php


/* define some variables */

$mean = 9;

$median = 10;

$mode = 9;


// less
-
than operator

// returns true if left side is less than right

// returns true here

$result = ($mean < $median);

print "result is $result<br />";


// greater
-
than operator

// returns true if left side is greater than right

// returns false he
re

$result = ($mean > $median);

print "result is $result<br />";


// less
-
than
-
or
-
equal
-
to operator

// returns true if left side is less than or equal to right

// returns false here

$result = ($median <= $mode);

print "result is $result<br />";


//

greater
-
than
-
or
-
equal
-
to operator

// returns true if left side is greater than or equal to right

// returns true here

$result = ($median >= $mode);

print "result is $result<br />";


// equality operator

// returns true if left side is equal to right


// returns true here

$result = ($mean == $mode);

print "result is $result<br />";


// not
-
equal
-
to operator

// returns true if left side is not equal to right

// returns false here

$result = ($mean != $mode);

print "result is $result<br />";


//
inequality operator

// returns true if left side is not equal to right

16


// returns false here

$result = ($mean <> $mode);

print "result is $result";


?>

The result of a comparison test is always Boolean: either true (1) or false (0
-

which doesn't pri
nt
anything). This makes comparison operators an indispensable part of your toolkit, as you can use
them in combination with a conditional statement to send a script down any of its multiple action
paths.

PHP 4.0 also introduced a
new

comparison operator, which allows you to test both for equality
and type: the
===

operator. The following example demonstrates it:


<?php


/* define two variables */

$str = '10';

$int = 10;


/* returns true, since both variables contain the same value

*/

$result = ($str == $int);

print "result is $result<br />";


/* returns false, since the variables are not of the same type even though
they have the same value */

$result = ($str === $int);

print "result is $result<br />";


/* returns true, since

the variables are the same type and value */

$anotherInt = 10;

$result = ($anotherInt === $int);

print "result is $result";


?>

Read more about PHP's comparison operators at
http://www.php.net/manual/en/language.operators.comparison.php
.

A Question of Logic

In addition to the comparison operators I used so liberally above, PHP also provides four logical
operators, which are designed to group conditional expressions together. These four operators
-

logical
AND
, logical
OR
, logical
XOR

and logical
NOT

-

are ill
ustrated in the following example:


<?php


/* define some variables */

$auth = 1;

$status = 1;

17


$role = 4;


/* logical AND returns true if all conditions are true */

// returns true

$result = (($auth == 1) && ($status != 0));

print "result is $resul
t<br />";


/* logical OR returns true if any condition is true */

// returns true

$result = (($status == 1) || ($role <= 2));

print "result is $result<br />";


/* logical NOT returns true if the condition is false and vice
-
versa */

// returns false

$result = !($status == 1);

print "result is $result<br />";


/* logical XOR returns true if either of two conditions are true, or returns
false if both conditions are true */

// returns false

$result = (($status == 1) xor ($auth == 1));

print "result
is $result<br />";


?>

Logical operators play an important role in building conditional statements, as they can be used
to link together related conditions simply and elegantly. View more examples of how they can be
used at
http://www.php.net/manual/en/language.operators.logical.php
.

Older But Not Wiser

Now that you've learnt all about comparison and logical operators, I can teach you about
conditional statements. As noted earlier, a conditional statement allows you to test whether a
specific condition is true or false, and perform different actions on th
e basis of the result. In PHP,
the simplest form of conditional statement is the
if()

statement, which looks something like
this:


if (condition) {


do this!

}

The argument to
if()
is a conditional expression, which evaluates to either true or false.

If the
statement evaluates to true, all PHP code within the curly braces is executed; if it does not, the
code within the curly braces is skipped and the lines following the
if()

construct are executed.

Let me show you how the
if()

statement works by com
bining it with a form. In this example,
the user is asked to enter his or her age.


<html>

18


<head></head>

<body>

<form action="ageist.php" method="post">

Enter your age: <input name="age" size="2">

</form>

</body>

</html>

Depending on whether the en
tered age is above or below 21, a different message is displayed by
the
ageist.php

script:


<html>

<head></head>

<body>


<?php

// retrieve form data

$age = $_POST['age'];

// check entered value and branch

if ($age >= 21) {


echo 'Come on in, we

have alcohol and music awaiting you!';

}

if ($age < 21) {


echo "You're too young for this club, come back when you're a little
older";

}

?>


</body>

</html>

If Not This, Then What?

In addition to the
if()

statement, PHP also offers the
if
-
else

construct, used to define a block
of code that gets executed when the conditional expression in the
if()

statement evaluates as
false.

The
if
-
else

construct looks like this:


if (condition) {


do this!


}

else {


do this!

}

This co
nstruct can be used to great effect in the last example: we can combine the two separate
if()
statements into a single
if
-
else

statement.

19



<html>

<head></head>

<body>


<?php

// retrieve form data

$age = $_POST['age'];

// check entered value and branch


if ($age >= 21) {


echo 'Come on in, we have alcohol and music awaiting you!';


}

else {


echo "You're too young for this club, come back when you're a little
older";

}

?>


</body>

</html>

Spreading Confusion

If the thought of confusing people who read your code makes you feel warm and tingly, you're
going to love the ternary operator, represented by a question mark (?). This operator, which lets
you make your conditional statements almost unintelligible, provi
des shortcut syntax for creating
a single
-
statement
if
-
else

block. So, while you could do this:


<?php


if ($numTries > 10) {


$msg = 'Blocking your account...';


}

else {


$msg = 'Welcome!';

}


?>

You could also do this, which is equiva
lent (and a lot more fun):


<?php


$msg = $numTries > 10 ? 'Blocking your account...' : 'Welcome!';


?>

PHP also lets you "nest" conditional statements inside each other. For example, this is perfectly
valid PHP code:

20



<?php


if ($day == 'Thursday')
{


if ($time == '0800') {


if ($country == 'UK') {


$meal = 'bacon and eggs';


}


}

}


?>

Another, more elegant way to write the above is with a series of logical operators:


<?php


if ($day == 'Thursday' && $time =
= '0800' && $country == 'UK') {


$meal = 'bacon and eggs';

}


?>

The Daily Special

PHP also provides you with a way of handling multiple possibilities: the
if
-
elseif
-
else

construct. A typical
if
-
elseif
-
else

statement block would look like this:


if (first condition is true) {


do this!


}

elseif (second condition is true) {


do this!


}

elseif (third condition is true) {


do this!


}


... and so on ...

else {


do this!

}

And here's an example that demonstrates how to use it:


<html>

<head></head>

<body>

<h2>Today's Special</h2>

<p>

<form method="get" action="cooking.php">

21


<select name="day">

<option value="1">Monday/Wednesday

<option value="2">Tuesday/Thursday

<op
tion value="3">Friday/Sunday

<option value="4">Saturday

</select>

<input type="submit" value="Send">

</form>

</body>

</html>

As you can see, this is simply a form which allows you to pick a day of the week. The real work
is done by the PHP script
cooking.php
:


<html>

<head></head>

<body>


<?php

// get form selection

$day = $_GET['day'];

// check value and select appropriate item

if ($day == 1) {


$special = 'Chicken in oyster sauce';


}

elseif ($day == 2) {


$special = 'French o
nion soup';


}

elseif ($day == 3) {


$special = 'Pork chops with mashed potatoes and green salad';


}

else {


$special = 'Fish and chips';

}

?>


<h2>Today's special is:</h2>

<?php echo $special; ?>

</body>

</html>

In this case, I'v
e used the
if
-
elseif
-
else

control structure to assign a different menu special to
each combination of days. Note that as soon as one of the
if()

branches within the block is
found to be true, PHP will execute the corresponding code, skip the remaining
if()

statements
in the block, and jump immediately to the lines following the entire
if
-
elseif
-
else

block.

And that's it for now. To view more examples of conditional statements in action, visit
http://www.php.net/manual/en/language.control
-
structures.php
. In
Part Three
, I'll be bringing
you more control structures, more operators and more strange and wacky scripts
-

so make sure
you don't miss it!



22


PHP 101 (part 3): Looping The Loop

Vikram Vaswani

|
33 comments
| Monday, July 19, 2004


Going Deeper

Switching Things Around

Creative Conditionals

On
e by One

Being Square

Loop First, Ask Questions Later

Doing it by Numbers

Turning the Tables



Going Deeper

If you've been paying attention, you remember that in
Part Two

I gave you a quick crash course
in PHP's basic control structures and operators. I also showed you how PHP can be used to
process the data entered into a Web form. In this tutorial, I'm go
ing to delve deeper into PHP's
operators and control structures, showing you two new operators, an alternative to the
if
-
else()

family of conditional statements, and some of PHP's more interesting loops. So keep
reading... this is just about to get interes
ting!

Switching Things Around

An alternative to the
if
-
else()

family of control structures is PHP's
switch
-
case()

statement,
which does almost the same thing. It looks like this:

switch (decision
-
variable) {


case first condition is true:


do t
his!


case second condition is true:


do this!


... and so on...

}

Depending on the value of the decision variable, the appropriate
case()

block is executed. A
default

block can also be created, to handle all those occasions when the value of the decision
variable does not match any of the listed
case()

conditions.

I'll make this a little clearer by re
-
writing one of my earlier examples in terms of the
switch()

stateme
nt:

<html>

<head></head>

23


<body>


<?php


// get form selection

$day = $_GET['day'];

// check value and select appropriate item

switch ($day) {


case 1:


$special = 'Chicken in oyster sauce';


break;


case 2:


$special = 'French o
nion soup';


break;


case 3:


$special = 'Pork chops with mashed potatoes and green salad';


break;


default:


$special = 'Fish and chips';


break;

}


?>


<h2>Today's special is:</h2>

<?php echo $special ?>

</body>

</html>

There are a couple of important keywords here:



The
break

keyword is used to break out of the
switch()

statement block and move
immediately to the lines following it.



The
default

keyword is used to execute a default set of statements when the variable
passed to
switch()

does not satisfy any of the conditions listed within the block.

A common newbie mistake here is to forget the
break

at the end of every
case()

block.
Remember that

if you forget to break out of a
case()

block, PHP will continue executing the
code in all the subsequent
case()

blocks it encounters.

For more on the
switch()

statement, see
http://www.php.net/manual/en/control
-
structures.switch.php
.

Creative Conditionals

Normally, when creating and processing forms in PHP, you would place the HTML form in one

file, and handle form processing through a separate PHP script. However, with the power of
conditional statements at your disposal, you can combine both pages into one.

How do you do this? Simple. All you need to do is assign a name to the form
submit

co
ntrol,
and then check whether the special
$_POST

container variable contains that name when the script
24


first loads up. If it does, the form has already been submitted, and you can process the data; if it
does not, that the user has not submitted the form a
nd you therefore need to generate the initial,
unfilled form. Thus, by testing for the presence or absence of this
submit

variable, a clever PHP
programmer can use a single PHP script to generate both the initial form, and the output after it
has been subm
itted, as appropriate.

Here's a simple example:

<html>

<head></head>

<body>


<?php

/* if the "submit" variable does not exist, the form has not been submitted
-

display initial page */

if (!isset($_POST['submit'])) {

?>



<form action="<?php echo $_SE
RVER['PHP_SELF']; ?>" method="post">


Enter your age: <input name="age" size="2">


<input type="submit" name="submit" value="Go">


</form>


<?php


}

else {

/* if the "submit" variable exists, the form has been submitted
-

look for
and process f
orm data */


// display result


$age = $_POST['age'];


if ($age >= 21) {


echo 'Come on in, we have alcohol and music awaiting you!';


}


else {


echo 'You're too young for this club, come back when you're a little
older';


}

}

?>


</body>

</html>

As you can see, the script contains two pages: the initial, empty form and the result page
generated after hitting the
submit

button. In order to decide which page to display, the script first
tests for the presence of the
$_POS
T['submit']

variable. If it doesn't find it, it assumes that the
form has yet to be submitted, and displays the initial list of days. Once the form has been
submitted, the same script will be called to process the form input. This time, however, the
$_POST
['submit']

variable
will

be set, and so PHP will not display the initial page, but rather
the page containing the result message.

25


Note that for this to work, your
submit

button must have a value assigned to its "name" attribute,
and you must check for tha
t value in the primary conditional statement. And in case you were
wondering, the
$_SERVER

array is a special PHP variable which always holds server information,
including the path and name of the currently executing script.

Next up, loops.

One by One

Fo
r those of you unfamiliar with the term, a loop is a control structure that enables you to repeat
the same set of php

statements or commands over and over again (the actual number of repetitions can be a number
you specify, or depend on the fulfillment of
one or more conditions).

Now, last time out you saw a few comparison and logical operators, which help in building
conditional statements. Since this segment of the tutorial is going to focus on loops, this is an
appropriate time to introduce you to PHP's

auto
-
increment and auto
-
decrement operators, which
see a lot of use in this context.

The auto
-
increment operator is a PHP operator designed to automatically increment the value of
the variable it is attached to by 1. It is represented by two "plus" signs

(++). This snippet of code
should explain it:

<?php


// define $total as 10

$total = 10;

// increment it

$total++;

// $total is now 11

echo $total;


?>

Thus,
$total++

is functionally equivalent to
$total = $total + 1
.

There's a corresponding auto
-
decrement operator (
--
), which does exactly the opposite:

<?php


// define $total as 10

$total = 10;

// decrement it

$total
--
;

// $total is now 9

echo $total;


?>

26


These operators are frequently used in loops, to update the val
ue of the loop counter, speaking of
which...

Being Square

The first
-

and simplest
-

loop to learn in PHP is the so
-
called
while()

loop, which looks like
this:

while (condition is true) {


do this!

}

In this case, so long as the condition specified evaluates as true
-

remember what you learned in
Part Two
?
-

the PHP statements within the curly braces will continue to execute. As soon as
the
condition becomes false, the loop will be broken and the statements following it will be
executed.

Here's a quick example which demonstrates the
while()

loop:

<html>

<head></head>

<body>

<form action="squares.php" method="POST">

Print all the squares

between 1 and <input type="text" name="limit" size="4"
maxlength="4">

<input type="submit" name="submit" value="Go">

</form>

</body>

</html>

This is a simple form which asks the user to enter a number. When the form is submitted, the
PHP script that is invoked should take this number and print the squares of all the numbers
between 1 and the entered value. With a
while()

loop, this is simplicit
y itself:

<html>

<head></head>

<body>


<?php


// set variables from form input

$upperLimit = $_POST['limit'];

$lowerLimit = 1;

// keep printing squares until lower limit = upper limit

while ($lowerLimit <= $upperLimit) {


echo ($lowerLimit * $lowerLimi
t).'&nbsp;';


$lowerLimit++;

}

// print end marker

echo 'END';


27


?>


</body>

</html>

This script uses a
while()

loop to count forwards from 1 until the values of
$lowerLimit

and
$upperLimit

are equal.

Loop First, Ask Questions Later

The
while()

loop exe
cutes a set of statements while a specified condition is true. But what
happens if the condition is true on the first iteration of the loop itself? In the previous example, if
you were to enter the value 0in the form, the
while()

loop would not execute eve
n once. Try it
yourself and you'll see what I mean.

If you're in a situation where you need to execute a set of statements *at least* once, PHP offers
you the
do
-
while()

loop. Here's what it looks like:

do {


do this!

} while (condition is true)

Let's

take a quick example to better understand the difference between
while()

and
do
-
while()
:

<?php


$x = 100;

// while loop

while ($x == 700) {


echo "Running...";


break;

}


?>

In this case, no matter how many times you run this PHP script, you will get no output at all,
since the value of
$x

is not equal to 700. But, if you ran this version of the script:

<?php


$x = 100;

// do
-
while loop

do {


echo "Running...";


break;

} while ($x == 700);


?>

28


you would see
one

line of output, as the code within the
do()

block would run once.

Let's now revise the previous PHP script so that it runs at least once, regardless of what value is
entered into the form:

<html>

<head></head>

<
body>


<?php


// set variables from form input

$upperLimit = $_POST['limit'];

$lowerLimit = 1;

// keep printing squares until lower limit = upper limit

do {


echo ($lowerLimit * $lowerLimit).'&nbsp;';


$lowerLimit++;

} while ($lowerLimit <= $upperLim
it);

// print end marker

echo ' END';


?>


</body>

</html>

Thus, the construction of the
do
-
while()

loop is such that the statements within the loop are
executed first, and the condition to be tested is checked afterwards. This implies that the
statements within the curly braces would be executed at least once.

Read more about the
while()

and
do
-
while(
)

loops at
http://www.php.net/manual/en/control
-
structures.while.php

and
http://www
.php.net/manual/en/control
-
structures.do.while.php
.

Doing it by Numbers

Both the
while()

and
do
-
while()

loops continue to iterate for as long as the specified
conditional expression remains true. But what if you need to execute a certain set of statements

a
specific number of times
-

for example, printing a series of thirteen sequential numbers, or
repeating a particular set of
<td>

cells five times? In such cases, clever programmers reach for
the
for()

loop...

The
for()

loop typically looks like this:


for (initial value of counter; condition; new value of counter) {


do this!

}

29


Looks like gibberish? Well, hang in there for a minute...the "counter" here is a PHP variable that
is initialized to a numeric value, and keeps track of the number of times th
e loop is executed.
Before each execution of the loop, the "condition" is tested. If it evaluates to true, the loop will
execute once more and the counter will be appropriately incremented; if it evaluates to false, the
loop will be broken and the lines fo
llowing it will be executed instead.

Here's a simple example that demonstrates how this loop can be used:

<html>

<head>

<basefont face="Arial">

</head>

<body>


<?php


// define the number

$number = 13;

// use a for loop to calculate tables for that
number

for ($x = 1; $x <= 10; $x++) {


echo "$number x $x = ".($number * $x)."<br />";

}


?>


</body>

</html>

The first thing I've done here is define the number to be used for the multiplication table. I've
used 13 here
-

for no reason other than that
it rhymes with "green".

Next, I've constructed a
for()

loop with
$x

as the counter variable, initialized it to 1. and
specified that the loop should run no more than 10 times. The auto
-
increment operator (discussed
earlier) automatically increments the co
unter by 1 every time the loop is executed. Within the
loop, the counter is multiplied by the number, to create the multiplication table, and
echo()

is
used to display the result on the page.

Turning the Tables

As you just saw, a
for()

loop is a very inte
resting
-

and useful
-

programming construct. The
next example illustrates its usefulness in a manner that should endear it to any HTML
programmer.

<html>

<head></head>

<body>

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

Enter number
of rows <input name="rows" type="text" size="4"> and columns
<input name="columns" type="text" size="4"> <input type="submit"
name="submit" value="Draw Table">

</form>

30



<?php


if (isset($_POST['submit'])) {


echo "<table width = 90% border = '1' cellspa
cing = '5' cellpadding =
'0'>";


// set variables from form input


$rows = $_POST['rows'];


$columns = $_POST['columns'];


// loop to create rows


for ($r = 1; $r <= $rows; $r++) {


echo "<tr>";


// loop to create columns



for ($c = 1; $c <= $columns;$c++) {


echo "<td>&nbsp;</td> ";


}

echo "</tr> ";


}


echo "</table> ";

}


?>


</body>

</html>

As you'll see if you try coding the same thing by hand, PHP's
for()

loop just saved you a whole
lot of work! And it looks good too
-

take a look at the source code of the dynamically generated
table, and you'll see that it's nicely formatted, with line breaks at the end of every table cell and
row. This magic is accomplis
hed by forcing a carriage return with in every call to
echo()
.

For more examples of the
for()

loop in action, visit
http://www.php.net/manual/en/control
-
structures.for.php
.


Loops are frequently used in combination with one of PHP's more complex data types, the
animal known as the array. That's a whole topic in itself, and in fact I'm going to discuss it in
detail in the next segment of this tutorial. Then I'm going to show
you how arrays, loops and
forms all work together to make the creation of complex Web forms as easy as eating pie. All
that and more in
Part Four
!



31


PHP 101 (part 4): The Food Factor

Vikram Vaswani

|
12 comments
| Tuesday, July 20, 2004


A Big Mistake

Fruity Pizza

Eating Italian

Push And Pull

Looping the Loop

What's That No
ise?

Music for the Masses


A Big Mistake

Having spent lots of time travelling around the outer landscape of PHP
-

learning all about
control structures, operators and variables
-

you'r
e probably bored. You might even be thinking
of dropping out right now, and instead spending your time more constructively (or so you think)
in front of the idiot box.

That would be a big mistake. And when I say big, I mean humongous.

You see, if you for
ego this segment of the tutorial for the dubious charms of Ally McBeal, you're
going to miss out on one of PHP's coolest variable types. It's a little thing called an array, and I'm
not exaggerating when I tell you that once you're on speaking terms with i
t, you're never going to
look at a PHP script the same way again. But hey, don't take my word for it... toss that remote
aside and come see for yourself!

Fruity Pizza

Thus far, the variables we've discussed contained only a single value, such as:


<?php


$i = 5;


?>

However, array variables are a different kettle of fish altogether. An array is a complex variable
that allows you to store multiple values in a single variable (which is handy when you need to
store and represent related information). Think of the array v
ariable as a "container" variable,
which can contain one or more values. For example:


<?php

32



// define an array

$pizzaToppings = array('onion', 'tomato', 'cheese', 'anchovies', 'ham',
'pepperoni');

print_r
($pizzaToppings);


?>

Here,
$pizzaToppings

is an array variable, which contains the values
'onion'
,
'tomato'
,
'cheese'
,
'anchovies'
,
'ham'

and
'pepperoni'
. (Array variables are particularly useful for
grouping related val
ues together.)

print_r()

is a special function that allows you to take a sneak peek inside an array. It's more
useful for debugging (finding out why your script doesn't work) than it is for display purposes,
but I'll use it here so you can see what's goin
g on under the surface. You do have your server
running and your browser open, right?

The various elements of the array are accessed via an index number, with the first element
starting at zero. So, to access the element
'onion'
, you would use the notatio
n
$pizzaToppings[0]
, while
'anchovies'

would be
$pizzaToppings[3]

-

essentially, the array
variable name followed by the index number enclosed within square braces.

PHP also allows you to replace indices with user
-
defined "keys", in order to create a slig
htly
different type of array. Each key is unique, and corresponds to a single value within the array.


<?php


// define an array

$fruits = array('red' => 'apple', 'yellow' => 'banana', 'purple' => 'plum',
'green' => 'grape');

print_r
($fruits);


?>

In this case,
$fruits

is an array variable containing four key
-
value pairs. (The
=>

symbol is used
to indicate the association between a key and its value.) In order to access the

value
'banana'
,
you would use the notation
$fruits['yellow']
, while the value
'grape'

would be accessible
via the notation
$fruits['green']
.

This type of array is sometimes referred to as a "hash" or "associative array". If you've ever used
Perl, you'll see the similarities to the Perl hash variable.

Eating Italian

The simplest was to define an array variable is the
array()

function. Here's ho
w:


<?php

33



// define an array

$pasta = array('spaghetti', 'penne', 'macaroni');


?>

The rules for choosing an array variable name are the same as those for any other PHP variable:
it must begin with a letter or underscore, and can optionally be followe
d by more letters,
numbers and underscores.

Alternatively, you can define an array by specifying values for each element in the index
notation, like this:


<?php


// define an array

$pasta[0] = 'spaghetti';

$pasta[1] = 'penne';

$pasta[2] = 'macaroni';



?>

If you're someone who prefers to use keys rather than default numeric indices, you might prefer
the following example:


<?php


// define an array

$menu['breakfast'] = 'bacon and eggs';

$menu['lunch'] = 'roast beef';

$menu['dinner'] = 'lasagna';


?>

You can add elements to the array in a similar manner. For example, if you wanted to add the
element '
green olives'

to the
$pizzaToppings

array, you would use something like this:


<?php


// add an element to an array

$pizzaToppings[3] = 'green oli
ves';


?>

In order to modify an element of an array, simply assign a new value to the corresponding scalar
variable. If you wanted to replace
'ham'

with
'chicken'
, you'd use:


<?php

34



// modify an array

$pizzaToppings[4] = 'chicken';


?>

You can do the same using keys. The following statement modifies the element with the key
'lunch' to a different value:


<?php


// modify an array

$menu['lunch'] = 'steak with mashed potatoes';


?>

Push And Pull

You can also add an element to the end o
f an existing array with the
array_push()

function:


<?php


// define an array

$pasta = array('spaghetti', 'penne', 'macaroni');


// add an element to the end

array_push
($pasta, 'tagliatelle');


print_r
($pasta);


?>

And you can remove an element from the end of an array using the interestingly
-
named
array_pop()

function.


<?php


// define

an array

$pasta = array('spaghetti', 'penne', 'macaroni');


// remove an element from the end

array_pop
($pasta);


print_r
($pasta);


?>

If you need to pop an element off the top of the array, you can use the
array_shift()

function:

35



<?php


// define an array

$pasta = array('spaghetti', 'p
enne', 'macaroni');


// take an element off the top

array_shift
($pasta);


print_r
($pasta)
;


?>

And the
array_unshift()

function takes care of adding elements to the beginning of the array.


<?php


// define an array

$pasta = array('spaghetti', 'penne', 'macaroni');


// add an element to the beginning

array_unshift
($pasta, 'tagliatelle');


print_r
($pasta);


?>

The
array_push()

and
array_unshift()

functions don't work with a
ssociative arrays; to add
elements to these arrays, it's better to use the $arr[$key] = $value notation to add new values to
the array.

The
explode()

function splits a string into smaller components, based on a user
-
specified
delimiter, and returns the pie
ces as elements as an array.


<?php


// define CSV string

$str = 'red, blue, green, yellow';


// split into individual words

$colors =
explode
(', ', $str);


print_r
($colors);


?>

To do the reverse, you can use the
implode()

function, which creates a single string from all the
elements of an array by joining them together with a use
r
-
defined delimiter. Reversing the
example above, we have:

36



<?php


// define array

$colors = array ('red', 'blue', 'green', 'yellow');


// join into single string with 'and'

// returns 'red and blue and green and yellow'

$str =
implode
(' and ', $colors);


print $str;


?>

Finally, the two examples below show how the
sort()

and
rsort()
functions can be used to sort
an array alphabetically (or numerically), in ascending and
descending order respectively:


<?php


// define an array

$pasta = array('spaghetti', 'penne', 'macaroni');


// returns the array sorted alphabetically

sort
($pasta);

print_r
($pasta);

print "<br />";


// returns the array sorted alphabetically in reverse

rsort
($pasta);

print_r
($pasta);


?>

Looping the Loop

So that takes care of putting data inside an array. Now, how about getting it out?

Retrieving data from an array is pretty simple: all

you need to do is access the appropriate
element of the array using its index number. To read an entire array you simply loop over it,
using any of the loop constructs you learned about in
Part Thre
e

of this tutorial.

How about a quick example?


<html>

<head></head>

<body>

My favourite bands are:

<ul>


<?php


37


// define array

$artists = array('Metallica', 'Evanescence', 'Linkin Park', 'Guns n Roses');

// loop over it and print array elements

for ($x = 0; $x <
sizeof
($artists); $x++) {


echo '<li>'.$artists[$x];

}


?>


</ul>

</body>

</html>

When you run this script, here's what you'll see:

My favourite ba
nds are:



Metallica



Evanescence



Linkin Park



Guns n Roses

In this case, I've defined an array, and then used the
for()

loop to: run through it, extract the
elements using the index notation, and display them one after the other.

I'll draw your attention here to the
sizeof()

function. This function is one of the most important
and commonly used array functions. It returns the size of (read: number of elements within) the
array. It is mostly used in loop counters to ensure that the
loop iterates as many times as there are
elements in the array.

If you're using an associative array, the
array_keys()

and
array_values()
functions come in
handy, to get a list of all the keys and values within the array.


<?php


// define an array

$menu

= array('breakfast' => 'bacon and eggs', 'lunch' => 'roast beef',
'dinner' => 'lasagna');


/* returns the array ('breakfast', 'lunch', 'dinner') with numeric indices */

$result =
array_keys
($menu);

print_r
($result);

print "<br />";


/* returns the array ('bacon and eggs', 'roast beef', 'lasagna') with numeric
indices */

$result =
array_values
($menu);

print_r
($result);


?>

38


What's That Noise?

There is, however, a simpler way of extracting all the elements of an array. PHP 4.0 introduced a
spanking
-
new loop type designed specifically for the purpose of iterating over an array: the
foreach()

loop. (It is similar in syntax to the Perl construct of

the same name.) Here's what it
looks like:


foreach ($array as $temp) {


do this!

}

A
foreach()

loop runs once for each element of the array passed to it as argument, moving
forward through the array on each iteration. Unlike a
for()

loop, it doesn
't need a counter or a
call to
sizeof()
, because it keeps track of its position in the array automatically. On each run,
the statements within the curly braces are executed, and the currently
-
selected array element is
made available through a temporary loo
p variable.

To better understand how this works, consider this rewrite of the previous example, using the
foreach()

loop:


<html>

<head></head>

<body>

My favourite bands are:

<ul>


<?php


// define array

$artists = array('Metallica', 'Evanescence',

'Linkin Park', 'Guns n Roses');

// loop over it

// print array elements

foreach ($artists as $a) {


echo '<li>'.$a;

}


?>


</ul>

</body>

</html>

Each time the loop executes, it places the currently
-
selected array element in the temporary
vari
able
$a
. This variable can then be used by the statements inside the loop block. Since a
foreach()

loop doesn't need a counter to keep track of where it is in the array, it is lower
-
maintenance and also much easier to read than a standard
for()

loop. Oh ye
ah... and it also
works with associative arrays, with no extra programming needed.

39


Music for the Masses

In addition to their obvious uses, arrays and loops also come in handy when processing forms in
PHP. For example, if you have a group of related checkboxes or a multi
-
select list, you can use
an array to capture all the selected form values in a single var
iable, to simplify processing.
Consider the following example, which illustrates this:


<html>

<head></head>

<body>


<?php

// check for submit

if (!isset($_POST['submit'])) {


// and display form


?>



<form action="<?php echo $_SERVER['PH
P_SELF']; ?>" method="POST">


<input type="checkbox" name="artist[]" value="Bon Jovi">Bon Jovi


<input type="checkbox" name="artist[]" value="N'Sync">N'Sync


<input type="checkbox" name="artist[]" value="Boyzone">Boyzone


<input type="check
box" name="artist[]" value="Britney Spears">Britney
Spears


<input type="checkbox" name="artist[]" value="Jethro Tull">Jethro Tull


<input type="checkbox" name="artist[]" value="Crosby, Stills &
Nash">Crosby, Stills & Nash


<input type="submit"

name="submit" value="Select">


</form>


<?php


}

else {


// or display the selected artists


// use a foreach loop to read and display array elements


if (
is_array
($_POST['artist'])) {


echo 'You selected: <br />';


foreach ($_POST['artist'] as $a) {


echo "<i>$a</i><br />";


}


}


else {


echo 'Nothing selected';


}

}

?>


</body>

</html>

When the above form is submitted, PHP will automatically create an array variable, and populate
it with the items selected. This array can then be processed with a
foreach()

loop, and the
selected items retrieved from it.

40


You can do this with a multi
-
sel
ect list also, simply by using array notation in the select control's
"name" attribute. Try it out for yourself and see... and make sure you tune in for
the next PHP
101 tutorial
, same time, same cha
nnel.



PHP 101 (part 5): Rank and File

Vikram Vaswani

|
29 comments
| Wednesday, July 21, 2004


Back to School

Handle With Care



Open the file and assign it a file handle



Interact with the file via its handle and extract its contents into a PHP variable



Close the file

Different Strokes

When Lazin
ess is a Virtue

Writing to Ma

Information is Power

Breaking Eggs


Back to School

When you first started reading this series, I promised you that you'd have a whole lot of fun. If
you're the cynical type, you may be feeling

that I didn't keep my promise. After all, how much
fun have you
really

had so far? All you've done is learn a bunch of theoretical rules, added and
subtracted numbers from each other, learnt primitive decision
-
making and gone round and round
in the circul
ar funhouse of loops. Heck, if this wasn't a PHP tutorial, it would be kindergarten...

I hear you.

In this segment of our ongoing saga, I'm going to teach you how to do something that's definitely
not for kids. It involves getting down and dirty with fil
es on the disk: meeting them (shock!),
reading their contents (shriek!) and (horror of horrors!) writing data to them. All of these exciting
activities will take place under the aegis of PHP's very cool file manipulation API, which allows
you to view and m
odify file attributes, read and list directory contents, alter file permissions,
retrieve file contents into a variety of native data structures, and search for files based on specific
patterns.

41


Let's get started!

Handle With Care

I'll begin with somethi
ng simple: opening a file and reading its contents. Let's assume that
somewhere on your disk, hidden under /usr/local/stuff/that/should/be/elsewhere/recipes/, you
have a text file containing the recipe for the perfect Spanish omelette. You now wish to read

the
contents of this file into a PHP script.

In order to do this, there are three distinct steps to be followed:



Open the file and assign it a file handle.



Interact with the file, via its handle, and extract its contents into a PHP variable.



Close the f
ile.

Here's a PHP script that does just that:


<?php


// set file to read

$file = '/usr/local/stuff/that/should/be/elsewhere/recipes/omelette.txt' or
die('Could not open file!');

// open file

$fh =
fopen
($file, 'r') or die('Could not open file!');

// read file contents

$data =
fread
($fh,
filesize
($file)) or die('Could not read file!');

// close file

fclose
($fh);

// print file conte
nts

echo $data;


?>

Run this script through your Web browser, and PHP should return the contents of the file.

Now let me explain each of the three steps above in detail:

Open the file and assign it a file handle

PHP needs a file handle to read data fr
om a file. This file handle can be created with the
fopen()

function, which accepts two arguments: the name and path to the file, and a string indicating the
"mode" in which the file is to be opened (
'r'

for read).

Three different modes are available for
use with the
fopen()

function. Here's the list:

'r'

-

opens a file in read mode

42


'w'

-

opens a file in write mode, destroying existing file contents

'a'

-

opens a file in append mode, preserving existing file contents

Interact with the file via its hand
le and extract its contents into a PHP variable

If the
fopen()

function is successful, it returns a file handle,
$fh
, which can be used for further
interaction with the file. This file handle is used by the
fread()

function, which reads the file
and places its contents into a variable.

The second argument to
fread()

is the number of bytes to be read. You can usually obtain this
information through the
filesize()

function, which
-

who'd have guessed it?!
-

returns th
e size
of the file in bytes.

Close the file

This last step is not strictly necessary as PHP closes the file automatically once it reaches the end
of the script, but it's a good habit to develop. Explicitly closing the file with
fclose()

has two
advantages
: it ties up loose ends in your script, and it wins you lots of good karma from the PHP
community.

You probably haven't see the
die()

function before, either. This function is mostly used as a
primitive error
-
handling mechanism. In the event of a fatal er
ror, such as the file path being
invalid or the file permissions being such that PHP cannot read it,
die()

terminates script
processing and optionally displays a user
-
specified error message indicating why it committed
suicide.

Different Strokes

An altern
ative method of reading data from a file is the very cool
file()

function, which reads
the entire file into an array (remember them?) with one line of code. Each element of the array
then contains one line from the file. To display the contents of the file
, simply iterate over the
array in a
foreach()

loop and print each element.

The following example demonstrates:


<?php


// set file to read

$file = '/usr/local/stuff/that/should/be/elsewhere/recipes/omelette.txt' or
die('Could not read file!');

// read file into array

$data =
file
($file) or die('Could not read file!');

// loop through array and print each line

foreach ($data as $line) {


echo $line;

43


}


?>

In t
his example, the
file()

command opens the file, reads it into an array and closes the file
-

all
in one, single, elegant movement. Each element of the array now corresponds to a line from the
file. It's easy to print the file's contents now
-

just reach fo
r that mainstay of array processing, the
foreach()

loop.

Don't want the data in an array? Try the
file_get_contents()

function, new in PHP 4.3.0 and
PHP 5.0, which reads the entire file into a string:


<?php


// set file to read

$file = '/usr/local/stuf
f/that/should/be/elsewhere/recipes/omelette.txt' ;

// read file into string

$data =
file_get_contents
($file) or die('Could not read file!');

// print contents

ech
o $data;


?>

Who am I kidding? I always use the one
-
line functions noted above instead of the three
-
line
sequence of
fopen()
,
fread()

and
fclose()
. Laziness conquers all.

When Laziness is a Virtue

PHP also offers two very useful functions to import file
s into a PHP script: the
include()

and
require()
functions. These functions can be used to suck external files lock, stock and barrel
into a PHP script, which is very handy if, for example, you have a modular application which has
its code broken down acros
s files in separate locations.

The best way to understand the utility of the
include()

and
require()

functions is with an
example. Assume that on your Web site you have a standard menu bar at the top of every page,
and a standard copyright notice in the b
ottom. Instead of copying and pasting the header and
footer code on each individual page, PHP gurus simply create separate files for the header and
footer, and import them at the top and bottom of each script. This also makes a change to the site
design ea
sier to implement: instead of manually editing a gazillion files, you simply edit two,
and the changes are reflected across your entire site instantaneously.

Let's see a real live example of this in action. Create the header in one file, called
header.php
:


<html>

<head>

<title><?php echo $page['title'];?></title>

</head>

44


<body>

<!
--

top menu bar
--
>

<table width="90%" border="0" cellspacing="5" cellpadding="5">

<tr>

<td><a href="#">Home</a></td>

<td><a href="#">Site Map</a></td>

<td><a href="#"
>Search</a></td>

<td><a href="#">Help</a></td>

</tr>

</table>

<!
--

header ends
--
>

Next, create the footer with the copyright notice in a second file,
footer.php
:


<!
--

footer begins
--
>

<br />

<center>Your usage of this site is subject to its publi