A Guide to PHP

Embed Size (px)

Citation preview

  • 8/14/2019 A Guide to PHP

    1/184

    A guide to PHP

    Part 1:

    The Only Acronym You'll Ever NeedIf 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 information 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

    reallyneed to know:

    PHP

    Now, while you have almost certainly heardof 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 server-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 listof most popular Apache modules.

    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

  • 8/14/2019 A Guide to PHP

    2/184

    database support means 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 developercommunity 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 using 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.

    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 transmitting 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 just 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/

    http://www.php.net/manual/en/installation.phphttp://www.php.net/manual/en/installation.phphttp://www.php.net/manual/en/installation.phphttp://www.php.net/manual/en/installation.php
  • 8/14/2019 A Guide to PHP

    3/184

    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 successfully 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 endtags, like this:

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

    combined:

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


    http://www.php.net/http://www.php.net/http://www.php.net/http://www.php.net/http://www.php.net/http://www.php.net/manual/en/installation.phphttp://www.php.net/manual/en/installation.php
  • 8/14/2019 A Guide to PHP

    4/184

    Not quite your traditional "Hello, World" program... but then again, I alwaysthought 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 this:

    Look at the HTML source:

  • 8/14/2019 A Guide to PHP

    5/184

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


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

    What just happened? When you requested the script above, Apache

    intercepted your request and handed it off to PHP. PHP then parsed the

    script, executing the code between the 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 output contained valid HTML,

    the browser was able to render it for display to the user.

    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, and 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 lastline of a PHP block. The PHP closing tag

    includes a semi-colon, therefore the following is perfectly valid PHP code:

    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

    blocks:

  • 8/14/2019 A Guide to PHP

    6/184

    /* 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 programming language... and

    PHP has them too. A variable can be thought of as a programming constructused to store both numeric and non-numeric data; the contents of a variable

    can be altered during program execution. Finally, variables can be compared

    with 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 type 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 letter 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.

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

    $Me or $ME.

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

  • 8/14/2019 A Guide to PHP

    7/184

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

    Here, the variables $name, $rank and $serialNumber are first defined withstring 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

    variable (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:

  • 8/14/2019 A Guide to PHP

    8/184

    Interestingly, you can also perform more than one assignment at a time.

    Consider the following example, which assigns three variables the same

    value simultaneously:

    Not My Type

    Every language has different types of variable - and PHP is no exception. 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.

    Integer: An integer is a plain-vanilla whole number like 75, -95, 2000

    or 1.

  • 8/14/2019 A Guide to PHP

    9/184

    Floating-point: A floating-point number is typically a fractional

    number such as 12.5 or 3.141592653589. Floating point numbers may

    be specified using either decimal or scientific notation.

    String: A string is a sequence of characters, like "hello" or

    "abracadabra". String values may 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

    variable names; if these are found, they are replaced with the

    appropriate value. Here's an example:

    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 alreadyseen one example of an operator - the assignment operator -, which lets you

    assign a value to a variable. Since PHP believes in spoiling you, it also comes

    with operators for arithmetic, string, comparison and logical operations.

    http://www.php.net/manual/en/language.types.phphttp://www.php.net/manual/en/language.types.phphttp://www.php.net/manual/en/language.types.phphttp://www.php.net/manual/en/language.types.phphttp://www.php.net/manual/en/language.types.phphttp://www.php.net/manual/en/language.types.phphttp://www.php.net/manual/en/language.types.php
  • 8/14/2019 A Guide to PHP

    10/184

    A good way to get familiar with operators is to use them to perform

    arithmetic operations on variables, as in the following example:

    Quantity

    Cost price

    Current price

    Absolute change in price

    Percent change in price

  • 8/14/2019 A Guide to PHP

    11/184

    %

    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 assignment, by using the two operators together. The two code

    snippets below are equivalent:

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

    Stringing Things Along

  • 8/14/2019 A Guide to PHP

    12/184

    Why stop with numbers? PHP also allows you to add strings with the string

    concatenation operator, represented by a period (.). Take a look:

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

  • 8/14/2019 A Guide to PHP

    13/184

    To learn more about PHP's arithmetic and string operators, 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 buildingblocks 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.

    Part 2:

    Not What You ExpectedIn 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 retrieveform values in your CGI scripts, PHP's simpler 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

    your 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 two scripts, one containing an HTML

    form (named form.htm) and the other containing the form processing logic

    (message.php). Here's form.htm:

    http://devzone.zend.com/node/view/id/php101-1.phphttp://devzone.zend.com/node/view/id/626http://www.php.net/manual/en/language.operators.string.phphttp://www.php.net/manual/en/language.operators.string.phphttp://devzone.zend.com/node/view/id/php101-1.phphttp://devzone.zend.com/node/view/id/php101-1.phphttp://devzone.zend.com/node/view/id/626http://devzone.zend.com/node/view/id/626http://www.php.net/manual/en/language.operators.string.phphttp://www.php.net/manual/en/language.operators.string.phphttp://www.php.net/manual/en/language.operators.string.phphttp://www.php.net/manual/en/language.operators.string.phphttp://www.php.net/manual/en/language.operators.arithmetic.phphttp://www.php.net/manual/en/language.operators.arithmetic.phphttp://www.php.net/manual/en/language.operators.arithmetic.phphttp://www.php.net/manual/en/language.operators.arithmetic.php
  • 8/14/2019 A Guide to PHP

    14/184

    Enter your message:

    The critical line in this page is the tag

    ...

    As you probably already know, the "action" attribute of the 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" attributespecifies howthe 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:

  • 8/14/2019 A Guide to PHP

    15/184

    // retrieve form data

    $input = $_POST['msg'];

    // use it

    echo "You said: $input";

    ?>

    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

    container, 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

    actually 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 makesure 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 exactly overwhelming. In order to add some intelligence toyour scripts, you need to know how to construct what geeks call a

    "conditional statement" - a statement which lets your script perform one of a

    series of possible actions based on the result of a comparison test. And since

    the basis of a conditional statement is comparison, you first need to know

  • 8/14/2019 A Guide to PHP

    16/184

    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. However,

    the language also comes with operators designed specifically to compare twovalues: the so-called "comparison operators". Here's an example that

    demonstrates them in action:

  • 8/14/2019 A Guide to PHP

    17/184

    right

    // returns true here

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

    print "result is $result
    ";

    // equality operator

    // returns true if left side is equal to right

    // returns true here

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

    print "result is $result
    ";

    // not-equal-to operator

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

    // returns false here

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

    print "result is $result
    ";

    // inequality operator

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

    // 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 print 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 newcomparison operator, which allows you to test

    both for equality and type: the === operator. The following example

    demonstrates it:

  • 8/14/2019 A Guide to PHP

    18/184

    /* define two variables */

    $str = '10';

    $int = 10;

    /* returns true, since both variables contain the same

    value */

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

    print "result is $result
    ";

    /* 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
    ";

    /* 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, logicalXOR and logical NOT - are illustrated in the following example:

  • 8/14/2019 A Guide to PHP

    19/184

    /* define some variables */

    $auth = 1;

    $status = 1;

    $role = 4;

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

    // returns true

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

    print "result is $result
    ";

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

    // returns true

    $result = (($status == 1) || ($role

    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

    http://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.phphttp://www.php.net/manual/en/language.operators.logical.php
  • 8/14/2019 A Guide to PHP

    20/184

    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 the basis of the result. In PHP, the simplest form

    of conditional statement is the if() statement, which looks something likethis:

    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 combining it with a

    form. In this example, the user is asked to enter his or her age.

    Enter your age:

    Depending on whether the entered age is above or below 21, a different

    message is displayed by the ageist.php script:

  • 8/14/2019 A Guide to PHP

    21/184

  • 8/14/2019 A Guide to PHP

    22/184

    This construct can be used to great effect in the last example: we can

    combine the two separate if()statements into a single if-else statement.

  • 8/14/2019 A Guide to PHP

    23/184

    if ($numTries > 10) {

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

    }

    else {

    $msg = 'Welcome!';}

    ?>

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

    PHP also lets you "nest" conditional statements inside each other. For

    example, this is perfectly valid PHP code:

  • 8/14/2019 A Guide to PHP

    24/184

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

    operators:

    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:

  • 8/14/2019 A Guide to PHP

    25/184

    Today's Special

    Monday/Wednesday

    Tuesday/Thursday

    Friday/Sunday

    Saturday

    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:

  • 8/14/2019 A Guide to PHP

    26/184

    elseif ($day == 3) {

    $special = 'Pork chops with mashed potatoes and green

    salad';

    }

    else {$special = 'Fish and chips';

    }

    ?>

    Today's special is:

    In this case, I've 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 inaction, 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!

    Part 3: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 going to delve deeper into PHP's operators and

    http://www.php.net/manual/en/language.control-structures.phphttp://devzone.zend.com/node/view/id/php101-2.phphttp://devzone.zend.com/node/view/id/php101-2.phphttp://devzone.zend.com/node/view/id/628http://devzone.zend.com/node/view/id/628http://www.php.net/manual/en/language.control-structures.phphttp://www.php.net/manual/en/language.control-structures.phphttp://www.php.net/manual/en/language.control-structures.phphttp://www.php.net/manual/en/language.control-structures.php
  • 8/14/2019 A Guide to PHP

    27/184

    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 interesting!

    Switching Things AroundAn 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 this!

    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() statement:

  • 8/14/2019 A Guide to PHP

    28/184

    case 1:

    $special = 'Chicken in oyster sauce';

    break;

    case 2:

    $special = 'French onion soup';break;

    case 3:

    $special = 'Pork chops with mashed potatoes and

    green salad';

    break;

    default:

    $special = 'Fish and chips';

    break;

    }

    ?>

    Today's special is:

    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.

    http://www.php.net/manual/en/control-structures.switch.phphttp://www.php.net/manual/en/control-structures.switch.phphttp://www.php.net/manual/en/control-structures.switch.phphttp://www.php.net/manual/en/control-structures.switch.phphttp://www.php.net/manual/en/control-structures.switch.phphttp://www.php.net/manual/en/control-structures.switch.phphttp://www.php.net/manual/en/control-structures.switch.phphttp://www.php.net/manual/en/control-structures.switch.phphttp://www.php.net/manual/en/control-structures.switch.php
  • 8/14/2019 A Guide to PHP

    29/184

    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 control, and then check whether the special $_POST container

    variable contains that name when the script 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 and 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 singlePHP script to generate both the initial form, and the output after it has been

    submitted, as appropriate.

    Here's a simple example:

  • 8/14/2019 A Guide to PHP

    30/184

    }

    else {

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

    submitted - look for and process form 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';

    }

    }

    ?>

    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 decidewhich page to display, the script first tests for the presence of the

    $_POST['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 willbe set, and so PHP

    will not display the initial page, but rather the page containing the result

    message.

    Note that for this to work, your submit button must have a value assigned

    to its "name" attribute, and you must check for that 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.

  • 8/14/2019 A Guide to PHP

    31/184

    Next up, loops.

    One by One

    For 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 thiscontext.

    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:

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

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

    the opposite:

  • 8/14/2019 A Guide to PHP

    32/184

    These operators are frequently used in loops, to update the value of the loop

    counter, speaking ofwhich...

    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:

    Print all the squares between 1 and

    http://devzone.zend.com/node/view/id/php101-2.phphttp://devzone.zend.com/node/view/id/php101-2.phphttp://devzone.zend.com/node/view/id/php101-2.phphttp://devzone.zend.com/node/view/id/php101-2.php
  • 8/14/2019 A Guide to PHP

    33/184

    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 simplicity itself:

    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

  • 8/14/2019 A Guide to PHP

    34/184

    The while() loop executes 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 even 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():

    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:

  • 8/14/2019 A Guide to PHP

    35/184

    echo "Running...";

    break;

    } while ($x == 700);

    ?>

    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:

    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

  • 8/14/2019 A Guide to PHP

    36/184

    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 cells five times? In such cases, clever programmers reach for thefor() loop...

    The for() loop typically looks like this:

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

    counter) {

    do this!

    }

    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 the 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 following it will be executed instead.

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

    http://www.php.net/manual/en/control-structures.do.while.phphttp://www.php.net/manual/en/control-structures.do.while.phphttp://www.php.net/manual/en/control-structures.do.while.phphttp://www.php.net/manual/en/control-structures.do.while.phphttp://www.php.net/manual/en/control-structures.do.while.phphttp://www.php.net/manual/en/control-structures.do.while.phphttp://www.php.net/manual/en/control-structures.do.while.phphttp://www.php.net/manual/en/control-structures.while.phphttp://www.php.net/manual/en/control-structures.while.phphttp://www.php.net/manual/en/control-structures.while.phphttp://www.php.net/manual/en/control-structures.while.php
  • 8/14/2019 A Guide to PHP

    37/184

    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 counter 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 interesting - and useful -programming construct. The next example illustrates its usefulness in a

    manner that should endear it to any HTML programmer.

  • 8/14/2019 A Guide to PHP

    38/184

  • 8/14/2019 A Guide to PHP

    39/184

    formatted, with line breaks at the end of every table cell and row. This magic

    is accomplished 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!

    Part 4:A Big Mistake

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

    learning all about control structures, operators and variables - you're

    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 ofthe idiot box.

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

    You see, if you forego 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 it, 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:

    http://devzone.zend.com/node/view/id/635http://www.php.net/manual/en/control-structures.for.phphttp://www.php.net/manual/en/control-structures.for.phphttp://devzone.zend.com/node/view/id/635http://devzone.zend.com/node/view/id/635http://www.php.net/manual/en/control-structures.for.phphttp://www.php.net/manual/en/control-structures.for.phphttp://www.php.net/manual/en/control-structures.for.phphttp://www.php.net/manual/en/control-structures.for.php
  • 8/14/2019 A Guide to PHP

    40/184

    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 variable as a "container" variable, which can

    contain one or more values. For example:

    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 values 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 going 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 notation $pizzaToppings[0], while 'anchovies' would be

    http://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.php
  • 8/14/2019 A Guide to PHP

    41/184

    $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 slightly different type of array. Each key is unique, and correspondsto a single value within the array.

    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

    how:

  • 8/14/2019 A Guide to PHP

    42/184

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

    ?>

    The rules for choosing an array variable name are the same as those for anyother PHP variable: it must begin with a letter or underscore, and can

    optionally be followed by more letters, numbers and underscores.

    Alternatively, you can define an array by specifying values for each element

    in the index notation, like this:

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

  • 8/14/2019 A Guide to PHP

    43/184

    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:

    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:

    You can do the same using keys. The following statement modifies the

    element with the key 'lunch' to a different value:

    Push And Pull

  • 8/14/2019 A Guide to PHP

    44/184

    You can also add an element to the end of an existing array with the

    array_push() function:

    And you can remove an element from the end of an array using the

    interestingly-named array_pop() function.

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

    array_shift() function:

    http://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.array-pop.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.array-push.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.array-pop.phphttp://devzone.zend.com/manual/function.array-pop.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.array-push.phphttp://devzone.zend.com/manual/function.array-push.php
  • 8/14/2019 A Guide to PHP

    45/184

    And the array_unshift() function takes care of adding elements to the

    beginning of the array.

    The array_push() and array_unshift() functions don't work with

    associative 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 pieces as elements as an array.

    http://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.array-unshift.phphttp://devzone.zend.com/manual/function.array-unshift.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.array-shift.phphttp://devzone.zend.com/manual/function.array-shift.php
  • 8/14/2019 A Guide to PHP

    46/184

    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 user-defined delimiter. Reversing the example above, we have:

    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:

    http://devzone.zend.com/manual/function.implode.phphttp://devzone.zend.com/manual/function.implode.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.explode.phphttp://devzone.zend.com/manual/function.explode.php
  • 8/14/2019 A Guide to PHP

    47/184

    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 Three of this tutorial.

    How about a quick example?

    My favourite bands are:

    http://devzone.zend.com/node/view/id/628http://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.rsort.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/node/view/id/628http://devzone.zend.com/node/view/id/628http://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.rsort.phphttp://devzone.zend.com/manual/function.rsort.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.sort.phphttp://devzone.zend.com/manual/function.sort.php
  • 8/14/2019 A Guide to PHP

    48/184

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

    My favourite bands are:

    MetallicaEvanescence

    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.

    http://devzone.zend.com/manual/function.sizeof.phphttp://devzone.zend.com/manual/function.sizeof.php
  • 8/14/2019 A Guide to PHP

    49/184

    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.

    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!

    }

    http://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.array-values.phphttp://devzone.zend.com/manual/function.array-values.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.print-r.phphttp://devzone.zend.com/manual/function.array-keys.phphttp://devzone.zend.com/manual/function.array-keys.php
  • 8/14/2019 A Guide to PHP

    50/184

    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-selectedarray element is made available through a temporary loop variable.

    To better understand how this works, consider this rewrite of the previous

    example, using the foreach() loop:

    My favourite bands are:

    Each time the loop executes, it places the currently-selected array element

    in the temporary variable $a. This variable can then be used by the

  • 8/14/2019 A Guide to PHP

    51/184

    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 yeah... and it also

    works with associative arrays, with no extra programming needed.

    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 variable, to simplify processing. Consider the

    following example, which illustrates this:

  • 8/14/2019 A Guide to PHP

    52/184

    Crosby, Stills & Nash

    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.

    You can do this with a multi-select 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

    channel.

    http://devzone.zend.com/node/view/id/636http://devzone.zend.com/node/view/id/636http://devzone.zend.com/manual/function.is-array.phphttp://devzone.zend.com/manual/function.is-array.php
  • 8/14/2019 A Guide to PHP

    53/184

    Part 5: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 reallyhad 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 circular 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 files 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 modify file attributes, read and list

    directory contents, alter file permissions, retrieve file contents into a varietyof native data structures, and search for files based on specific patterns.

    Let's get started!

    Handle With Care

    I'll begin with something 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.

  • 8/14/2019 A Guide to PHP

    54/184

  • 8/14/2019 A Guide to PHP

    55/184

    'r' - opens a file in read mode

    '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 handle 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 the 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

    error, 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 alternative 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

  • 8/14/2019 A Guide to PHP

    56/184

    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:

    In this example, the file() command opens the file, reads it into an array

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

    contents now -just reach for 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:

  • 8/14/2019 A Guide to PHP

    57/184

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

    file!');

    // print contents

    echo $data;

    ?>

    Who am I kidding? I always use the one-line functions noted above instead

    of the three-line sequence offopen(), fread() and fclose(). Laziness

    conquers all.

    When Laziness is a Virtue

    PHP also offers two very useful functions to import files into a PHP script: theinclude() 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

    across 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 bottom. 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 easier 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:

    http://devzone.zend.com/manual/function.file-get-contents.phphttp://devzone.zend.com/manual/function.file-get-contents.php
  • 8/14/2019 A Guide to PHP

    58/184

    Home

    Site Map

    Search

    Help

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

    footer.php:


    Your usage of this site is subject to its published

    terms and conditions. Data iscopyright Big Company Inc, 1995-

    Finally, create a script to display the main content of your site, and

    include() the header and footer at appropriate places:

  • 8/14/2019 A Guide to PHP

    59/184

    /* once the file is imported, the variables set above will

    become available to it */

    // include the page header

    include('header.php');

    ?>

    Now, when you run the script above, PHP will automatically read in the

    header and footer files, merge them with the HTML content, and display the

    complete page to you. Simple, isn't it?

    Notice that you can even write PHP code inside the files being imported.When the file is first read in, the parser will look for tags, and

    automatically execute the code inside it. (If you're familiar with JavaScript,

    you can use this feature to replicate functionality similar to that of the

    onLoad() page event handler in JavaScript.)

    PHP also offers the require_once() and include_once()functions, which

    ensure that a file which has already been read is not read again. This can

    come in handy if you have a situation in which you want to eliminate

    multiple reads of the same include file, either for performance reasons or to

    avoid corruption of the variable space.

    A quick note on the difference between the include() and

    require()functions: the require()function returns a fatal error if the

    named file cannot be found and halts script processing, while the

  • 8/14/2019 A Guide to PHP

    60/184

    include() function returns a warning but allows script processing to

    continue.

    Writing to Ma

    After everything you've just read, you've probably realized that reading a file

    is not exactly brain surgery. So let's proceed to something slightly more

    difficult - writing to a file.

    The steps involved in writing data to a file are almost identical to those

    involved in reading it: open the file and obtain a file handle, use the file

    handle to write data to it, and close the file. There are two differences: first,

    you must fopen() the file in write mode ('w' for write), and second,

    instead of using the fread() function to read from the file handle, use thefwrite() function to write to it. Take a look:

    When you run this script, it should create a file named dump.txt in /tmp,

    and write a line of text to it, with a carriage return at the end. Notice that

    double quotes are needed to convert into a carriage return.

    http://devzone.zend.com/manual/function.fclose.phphttp://devzone.zend.com/manual/function.fwrite.phphttp://devzone.zend.com/manual/function.fopen.phphttp://devzone.zend.com/manual/function.fopen.phphttp://devzone.zend.com/manual/function.fclose.phphttp://devzone.zend.com/manual/function.fclose.phphttp://devzone.zend.com/manual/function.fwrite.phphttp://devzone.zend.com/manual/function.fwrite.phphttp://devzone.zend.com/manual/function.fopen.phphttp://devzone.zend.com/manual/function.fopen.php
  • 8/14/2019 A Guide to PHP

    61/184

    The fopen(), fwrite() and fread() functions are all binary-safe, which

    means you can use them on binary files without worrying about damage to

    the file contents. Read more about many of the issues related to binary-safe

    file manipulation on different platforms at http://www.php.net/manual/en/

    function.fopen.php.

    If I've spoiled you by showing you the one-line shortcut functions for file

    reads, let me damage you further by introducing you to the

    file_put_contents() function, new in PHP 5.0, which takes a string and

    writes it to a file in a single line of code.

    Bear in mind that the directory in which you're trying to create the file must

    exist before you can write to it. Forgetting this important step is a common

    cause of script errors.

    Information is Power

    PHP also comes with a bunch of functions that allow you to test the status of

    a file - for example to find out whether it exists, whether it's empty, whether

    it's readable or writable, and whether it's a binary or text file. Of these, themost commonly used operator is the file_exists() function, which is

    used to test for the existence of a specific file.

    Here's an example which asks the user to enter the path to a file in a Web

    form, and then returns a message displaying whether or not the file exists:

    http://devzone.zend.com/manual/function.file-put-contents.phphttp://devzone.zend.com/manual/function.file-put-contents.phphttp://www.php.net/manual/en/function.fopen.phphttp://www.php.net/manual/en/function.fopen.phphttp://www.php.net/manual/en/function.fopen.phphttp://www.php.net/manual/en/function.fopen.phphttp://devzone.zend.com/manual/function.file-put-contents.phphttp://devzone.zend.com/manual/function.file-put-contents.phphttp://www.php.net/manual/en/function.fopen.phphttp://www.php.net/manual/en/function.fopen.phphttp://www.php.net/manual/en/function.fopen.phphttp://www.php.net/manual/en/function.fopen.php
  • 8/14/2019 A Guide to PHP

    62/184

  • 8/14/2019 A Guide to PHP

    63/184

    There are many more such functions. Here's a brief list, followed by an

    example that builds on the previous one to provide more information on the

    file specified by the user.

    is_dir() - returns a Boolean indicating whether the specified path isa directory

    is_file() - returns a Boolean indicating whether the specified file is

    a regular file

    is_link() - returns a Boolean indicating whether the specified file is

    a symbolic link

    is_executable() - returns a Boolean indicating whether the

    specified file is executable

    is_readable()- returns a Boolean indicating whether the specified

    file is readable

    is_writable()- returns a Boolean indicating whether the specified

    file is writable

    filesize() - gets size of file

    filemtime() - gets last modification time of file

    filamtime() - gets last access time of file

    fileowner() - gets file owner

    filegroup() - gets file group

    fileperms() - gets file permissionsfiletype() - gets file type

    This script asks for a file name as input and uses the functions above to

    return information on it.

  • 8/14/2019 A Guide to PHP

    64/184

  • 8/14/2019 A Guide to PHP

    65/184

    echo 'File is a directory
    ';

    }

    // is it a file?

    if (is_file($_POST['file'])) {

    echo 'File is a regular file
    ';}

    // is it a link?

    if (is_link($_POST['file'])) {

    echo 'File is a symbolic link
    ';

    }

    // is it executable?

    if (is_executable($_POST['file'])) {

    echo 'File is executable
    ';

    }

    // is it readable?

    if (is_readable($_POST['file'])) {

    echo 'File is readable
    ';

    }

    // is it writable?

    if (is_writable($_POST['file'])) {

    echo 'File is writable
    ';

    }}

    else {

    echo'File does not exist!
    ';

    }

    }

    ?>

    And here's what the output might look like:

    File name: /usr/local/apache/logs/error_log

    File size: 53898 bytes

    http://devzone.zend.com/manual/function.is-writable.phphttp://devzone.zend.com/manual/function.is-writable.phphttp://devzone.zend.com/manual/function.is-readable.phphttp://devzone.zend.com/manual/function.is-readable.phphttp://devzone.zend.com/manual/function.is-executable.phphttp://devzone.zend.com/manual/function.is-executable.phphttp://devzone.zend.com/manual/function.is-file.phphttp://devzone.zend.com/manual/function.is-writable.phphttp://devzone.zend.com/manual/function.is-writable.phphttp://devzone.zend.com/manual/function.is-readable.phphttp://devzone.zend.com/manual/function.is-readable.phphttp://devzone.zend.com/manual/function.is-executable.phphttp://devzone.zend.com/manual/function.is-executable.phphttp://devzone.zend.com/manual/function.is-link.phphttp://devzone.zend.com/manual/function.is-link.phphttp://devzone.zend.com/manual/function.is-file.phphttp://devzone.zend.com/manual/function.is-file.php
  • 8/14/2019 A Guide to PHP

    66/184

    File owner: 0

    File group: 0

    File permissions: 33188

    File type: file

    File last accessed on: 2004-05-26File last modified on: 2004-06-20

    File is a regular file

    File is readable

    Breaking Eggs

    So now you know how to read a file, write to it, and test its status. Let's look

    at some examples of what you can do with this new-found power.

    Let's go back to my Spanish omelette recipe. Let's suppose I'm feeling

    generous, and I decide that I'd like to hear what people reallythink about

    my culinary skills. Since I have a bunch of recipes that I'd like to share with

    people, and since they all look something like this:

    SPANISH OMELETTE

    INGREDIENTS:

    - 1 chopped onion

    - 1 chopped tomato

    - 1/2 chopped green pepper

    - 4 beaten eggs

    - Salt and pepper to taste

    METHOD:

    1. Fry onions in a pan

    2. Pour beaten eggs over onions and fry gently

    3. Add tomatoes, green pepper, salt and pepper to taste4. Serve with toast or bread

    I need a quick way to convert them all into HTML so that they look

    presentable on my Web site. We've already established that I'm lazy, so

  • 8/14/2019 A Guide to PHP

    67/184

    fuggedaboutme re-creating the recipes in HTML. Instead, I'll have PHP do

    the heavy lifting for me:

    I've used the file() function to read the recipe into an array, and assign

    the first line (the title) to a variable. That title is then printed at the top of

    the page. Since the rest of the data is fairly presentable as is, I can simply

    print the lines to the screen one after the other. Line breaks are

    automatically handled for me by the extremely cool nl2br() function, which

    converts regular text linebreaks into the HTML equivalent, the
    tag.

    http://devzone.zend.com/manual/function.nl2br.phphttp://devzone.zend.com/manual/function.array-shift.phphttp://devzone.zend.com/manual/function.array-shift.phphttp://devzone.zend.com/manual/function.nl2br.phphttp://devzone.zend.com/manual/function.nl2br.phphttp://devzone.zend.com/manual/function.array-shift.phphttp://devzone.zend.com/manual/function.array-shift.phphttp://devzone.zend.com/manual/function.file.phphttp://devzone.zend.com/manual/function.file.php
  • 8/14/2019 A Guide to PHP

    68/184

    The end result: an HTML-ized version of my recipe that the world can marvel

    at. Take a look:

    SPANISH OMELETTE

    INGREDIENTS:

    - 1 chopped onion

    - 1 chopped tomato

    - 1/2 chopped green pepper

    - 4 beaten eggs

    - Salt and pepper to taste

    METHOD:

    1. Fry onions in a pan

    2. Pour beaten eggs over onions and fry gently

    3. Add tomatoes, green pepper, salt and pepper to

    taste

    4. Serve with toast or bread

    If the elegance and creative simplicity of my Spanish omelette recipe has left

    you speechless, I'm not surprised - many people feel that way. Until you get

    your voice back: Ciao... and make sure you come back to work through Part

    Six of PHP 101, which discusses creating your own reusable functions.

    Part 6:A Little Knowledge

    http://devzone.zend.com/node/view/id/637http://devzone.zend.com/node/view/id/637http://devzone.zend.com/node/view/id/637http://devzone.zend.com/node/view/id/637http://devzone.zend.com/node/view/id/637
  • 8/14/2019 A Guide to PHP

    69/184

    If you've been taking your regular dose of PHP 101, you know now enough

    about PHP to write simple programs of your own. However, these programs

    will be "procedural" or linear - the statements in them will be executed

    sequentially, one after another - simply because that's the only programming

    style I've used so far.

    You know what they say about a little knowledge being a dangerous thing...

    as your PHP scripts become more and more complex, it's only a matter of

    time before you bump your head against the constraints of the procedural

    method, and begin looking for a more efficient way of structuring your PHP

    programs.

    That's where Part Six of PHP 101 comes in. In this tutorial I'm going to

    introduce you to a new way of doing things, where code doesn't run in a

    straight line, but twists, leaps and bounds across the landscape of your

    script. Most of this activity is accomplished through a programming construct

    called a "function", and this tutorial teaches you how to build them (once),

    use them (many times), pass them arguments and have them return values,

    and generally make your scripts more compact, efficient and maintainable.

    In Plain English

    Ask a geek to define the term "function", and he'll probably mumble

    something about a function being "a block of statements that can be

    grouped together as a named entity." Since this is a tutorial on PHP, not an

    introductory course in Greek, I'll translate that for you: a function is simply a

    set of program statements which perform a specific task, and which can be

    "called", or executed, from anywhere in your program.

    Every programming language comes with its own built-in functions, and

    typically also allows developers to define their own functions. For example, if

    I had a profit statement for the year on my desk, and I wanted to inflate

    each number by 35%, I could call my neighborhood accounting firm and get

    them to do it for me... or I could write a simple PHP function called

  • 8/14/2019 A Guide to PHP

    70/184

    cheatTheShareholders() and have it do the work for me (it's faster, plus

    PHP doesn't bill by the hour).

    There are three important reasons why functions are a Good Thing. First:

    user-defined functions allow you to separate your code into easilyidentifiable subsections - which are easier to understand and debug. Second:

    functions make your program modular, allowing you to write a piece of code

    once and then re-use it multiple times within the same program. And third:

    functions simplify code updates or changes, because the change needs only

    to be implemented in a single place (the function definition). Functions thus

    save time, money and electrons... and I know the electrons at least will

    thank you!

    Monday Morning Blues

    To see how a function works, look at the following example:

  • 8/14/2019 A Guide to PHP

    71/184

    // at the party

    echo "Hi, haven't I seen you somewhere before?
    ";

    myStandardResponse();

    ?>

    Here's what the output might look like:

    Hey lady, can you spare a dime?

    Get lost, jerk!

    Can you handle Joe's workload, in addition to your own,

    while he's in Tahiti for a month?

    You'll probably need to come in early and work till

    midnight, but we are confident you can

    handle it. Oh, and we can't pay you extra because of

    budgetary constraints...

    Get lost, jerk!

    Hi, haven't I seen you somewhere before?

    Get lost, jerk!(Sure it's rude, but it does demonstrate how a function allows you to reuse

    pieces of code.)

    The first thing I've done in the script above is define a new function, with the

    function keyword. This keyword is followed by the name of the function,

    which in this case is myStandardResponse(). All the program code

    attached to that function is then placed within a pair of curly braces - and

    this program code can contain loops, conditional statements, calls to other

    user-defined functions, or calls to other PHP functions.

    Of course, defining a function is only half of the puzzle; for it to be of any

    use at all, you need to "invoke" it. In PHP, as in a million other languages,

    this is accomplished by calling the function by its name, as I've done in the

    example above. Calling a user-defined function is identical to calling a built-

    in PHP function like echo() or explode().

  • 8/14/2019 A Guide to PHP

    72/184

    Here's the typical format for a function:

    function function_name (optional function arguments) {

    statement 1...

    statement 2...

    .

    .

    .

    statement n...

    }

    Having an Argument... or Two

    Functions like the one you saw in the previous section print the same value

    every time you invoke them. While this is interesting the first six times, itcan get boring on the seventh. What we need to do, to make these boring,

    unintelligent functions a little more exciting, is get them to return a different

    value each time they are invoked.

    Enter arguments.

    Arguments work by using a placeholder to represent a certain variable within

    a function. Values for this variable are provided to the function at run-time

    from the main program. Since the input to the function will differ at each

    invocation, so will the output.

    To see how this works, look at the following function, which accepts a single

    argument and then prints it back after a calculation:

  • 8/14/2019 A Guide to PHP

    73/184

    // call a function with an argument

    getCircumference(10);

    // call the same function with another argument

    getCircumference(20);

    ?>

    In this example, when the getCircumference() function is called with an

    argument, the argument is assigned to the placeholder variable $radius

    within the function, and then acted upon by the code within the function

    definition.

    It's also possible to pass more than one argument to a function. This is done

    using a comma-separated list, as the following example shows:

  • 8/14/2019 A Guide to PHP

    74/184

    changeCase("Hello Sam", "L");

    ?>

    Here, depending on the value of the second argument, program flow withinthe function moves to the appropriate branch and manipulates the first

    argument.

    Note that there is no requirement to specify the data type of the argument

    being passed to a function. Since PHP is a dynamically-typed language, it

    automatically identifies the variable type and acts on it appropriately.

    Circles in the Sand

    The functions on the previous page simply printed their output to the screen.

    But what if you want the function to do something else with the result? Well,

    in PHP, you can have a function return a value, such as the result of a

    calculation, to the statement that called it. This is done using a return

    statement within the function, as shown below:

  • 8/14/2019 A Guide to PHP

    75/184

    ?>

    Here, the argument passed to the getCircumference() function is

    processed, and the result is returned to the main program, where it may becaptured in a variable, printed, or dealt with in other ways.

    You can even use the result of a function inside another function, as

    illustrated in this minor revision of the example above:

    Return values need not be numbers or strings alone: a function can just as

    easily return an array (remember them?), as demonstrated in the following

    example:

  • 8/14/2019 A Guide to PHP

    76/184

    foreach ($list as $l) {

    $arr = explode("@", $l);

    $domains[] = trim($arr[1]);

    }

    // remove duplicates and returnreturn array_unique($domains);

    }

    // read email addresses from a file into an array

    $fileContents = file("data.txt");

    /* pass the file contents to the function and retrieve the

    result array */

    $returnArray = getUniqueDomains($fileContents);

    // process the return array

    foreach ($returnArray as $d) {

    print "$d, ";

    }

    ?>

    Assuming the file looked like this,

    [email protected]

    [email protected]

    [email protected]

    [email protected]

    [email protected]

    [email protected]

    the output ofthe script above would look like this:

    test.com, x.com, deeply.bored.org, where.ami.net,

    Note that the return statement terminates program execution inside a

    function.

    Marching Order

    mailto:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]://devzone.zend.com/manual/function.file.phphttp://devzone.zend.com/manual/function.array-unique.phpmailto:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]:[email protected]://devzone.zend.com/manual/function.file.phphttp://devzone.zend.com/manual/function.file.phphttp://devzone.zend.com/manual/function.array-unique.phphttp://devzone.zend.com/manual/function.array-unique.phphttp://devzone.zend.com/manual/function.trim.phphttp://devzone.zend.com/manual/function.trim.phphttp://devzone.zend.com/manual/function.explode.phphttp://devzone.zend.com/manual/function.explode.php
  • 8/14/2019 A Guide to PHP

    77/184

    The order in which arguments are passed to a function can be important.

    The following example requires that the name is passed as the first

    argument, and the place as the second.

    This is the output:

    Hello, I am Moonface from The Faraway Tree

    In this example, if you reversed the order in which arguments were passed

    to the function, this is what you'd see:

    Hello, I am The Faraway Tree from MoonfaceAnd look what happens if you forget to pass a required argument altogether:

    Warning: Missing argument 2 for introduce() in xx.php on

    line 3

    Hello, I am Moonface from

    In order to avoid such errors, PHP allows you to specify default values for all

    the arguments in a user-defined function. These default values are used if

    the function invocation is missing some arguments. Here's an example:

  • 8/14/2019 A Guide to PHP

    78/184

    // call function

    introduce("Moonface");

    ?>

    In this case the output would be:

    Hello, I am Moonface from London

    Notice that the function has been called with only a single argument, even

    though the function definition requires two. However, since default values

    are present for each argument in the function, the missing argument is

    replaced by the default value for that argument, and no error is generated.

    The Amazing Shrinking Argument List

    All the examples on the previous page have one thing in common: the

    number of arguments in the function definition is fixed. However, PHP 4.x

    also supports variable-length argument lists, by using the

    func_num_args() and func_get_args() commands. For want of a better

    name, these functions are called "function functions". Try wrapping your

    tongue around that while you look at the next example, which demonstrates

    how they can be used:

  • 8/14/2019 A Guide to PHP

    79/184

    }

    print "
    ";

    }

    // call a function with different argumentssomeFunc("red", "green", "blue");

    someFunc(1, "soap");

    ?>

    Hmmm... if you're sneaky, you might have tried to pass someFunc() an

    array, and found that instead of displaying the elements of the array, it

    simply said "Array". You can fix this by adding a quick test for array

    arguments inside the function, as in this rewrite:

  • 8/14/2019 A Guide to PHP

    80/184

    }

    else {

    print " $args[$x] ";

    }

    }}

    // call a function with different arguments

    someFunc("red", "green", "blue", array(4,5), "yellow");

    ?>

    Going Global

    Let's now talk a little bit about the variables used within a function, and their

    relationship with variables in the outside world. Usually, the variables used

    within a function are "local" - meaning that the values assigned to them, and

    the changes made to them, are restricted to the function space alone.

    Consider this simple example:

  • 8/14/2019 A Guide to PHP

    81/184

    // print the variable

    print "It is $today outside the function";

    ?>

    When you run this script, here is what you will see:

    It is Saturday inside the function

    It is Tuesday outside the function

    In other words, the variable inside the function is insulated from the

    identically-named variable in the main program. Variables inside a function

    are thus aptly called "local" variables because they only exist within the

    function in which they are defined.

    The reverse is also true: variables defined inside a function cannot be "seen"

    outside it. To illustrate, take a look at the next example and its output (or

    the lack of it):

    Here is the output:

    Today is

    Depending on the error_reporting you have set up in php.ini, you might also

    see an error message:

  • 8/14/2019 A Guide to PHP

    82/184

    Notice: Undefined variable: today in x1.php on line 10

    However, I didn't say this can't be overcome. To have variables within a

    function accessible from outside it (and vice-versa), all you need to do isfirst declare them "global" with the - you guessed it! - global keyword.

    Here is a rewrite of the earlier example, this time declaring the $today

    variable global:

  • 8/14/2019 A Guide to PHP

    83/184

    ?>

    And here is the output:

    It is Tuesday before running the function

    It is Saturday inside the function

    It is Saturday after running the function

    Thus, once a variable is declared global, it is available at the global level,

    and can be manipulated both inside and outside a function.

    PHP also comes with so-called superglobal variables - variables that are

    always available, regardless of whether you're inside a function or outside it.

    You've already seen some of these special variables in action: the

    $_SERVER, $_POST and $_GET variables are all superglobals, which is why

    you can access things like the currently-executing script's name or form

    values even inside a function.

    Superglobals are a Good Thing, because they're always there when you

    need them, and you don't need to jump through any hoops to use the data

    stored inside them. Read more about superglobals and variable scope at

    http://www.php.net/manual/en/language.variables.predefined.php and

    http://www.php.net/manual/en/language.variables.scope.php.Checking References

    Any discussion about variables in and out of functions would be incomplete

    without some mention of the difference between "passing by reference" and

    "passing by value". So far, all the examples you've seen have involved

    passing arguments to a function "by value" - meaning that a copy of the

    variable was passed to the function, while the original variable remained

    untouched. However, PHP also allows you to pass "by reference" - meaning

    that instead of passing a value to a function, you pass a reference to theoriginal variable, and have the function act on that instead of a copy.

    Confusing? Well, this is probably easier to understand with an example. Let's

    start with this:

    http://www.php.net/manual/en/language.variables.scope.phphttp://www.php.net/manual/en/language.variables.scope.phphttp://www.php.net/manual/en/language.variables.scope.phphttp://www.php.net/manual/en/language.variables.scope.phphttp://www.php.net/manual/en/language.variables.scope.phphttp://www.php.net/manual/en/language.variables.scope.phphttp://www.php.net/manual/en/language.variables.predefined.phphttp://www.php.net/manual/en/language.variables.scope.phphttp://www.php.net/manual/en/language.variables.scope.phphttp://www.php.net/manual/en/language.variables.predefined.phphttp://www.php.net/manual/en/language.variables.predefined.php
  • 8/14/2019 A Guide to PHP

    84/184

    You've already seen this before, and you already know what the output is

    going to say:

    It is Tuesday inside the function

    It is Saturday outside the function

    This is because when the getDay() function is invoked, it passes the value

    "Saturday" to the function ("passing by value"). The original variable

    remains untouched; only its content is sent to the function. The function

    then acts on the content, modifying and displaying it.

    Now, look at how "passing by reference" works:

  • 8/14/2019 A Guide to PHP

    85/184

    function setDay(&$day) {

    $day = "Tuesday";

    print "It is $day inside the function
    ";

    }

    // call function

    setDay($today);

    // print the value of the variable

    print "It is $today outside the function";

    ?>

    Notice the ampersand (&) before the argument in the function definition.

    This tells PHP to use the variable reference instead of the variable value.

    When such a reference is passed to a function, the code inside the function

    acts on the r