Monday, 11 April 2011

Introduction to PHP

Introduction


When using server side scripting to generate and create dynamic web pages, all requests sent by a client machine are processed on the server. The server generates pages according to the user requests and sends these pages as a response. The internet browser on the client machine will interpret the response and display the output.  
One of the most commonly used scripting languages is PHP Hypertext Pre-Processor, also known as PHP. Un-like other scripting languages, PHP was designed and developed for web development; In-fact PHP scripting can be embedded within plain HTML markup.
Similar to other scripting languages, PHP has many built-in functions and can be used to perform most of the tasks required in web development. Amongst others, PHP can be used to process user inputs, interact with databases, and file handling on the server side and much more.
Un-like JavaScript, PHP is more secure because it resides on the server. This means that the scripting code cannot be viewed or modified by end users.
In this blog I will describe my experience and what I’ve learned while performing a task assigned by my tutor.

PHP syntax


PHP page

A PHP scripting page can be made up of both HTML markup and the PHP script. All PHP scripts are enclosed in <?php and  ?> tags and each file must have a .php extension. The following example shows some PHP scripting within an HTML <body> tag:

<body>
<?php
            //Display some text using echo()
            echo("Welcome to PHP scripting.". "<br>");
            echo("Today is ".date("l F d, Y"));
?>
</body>

Commenting

Like any other programming language, it is recommended to use inline and block commenting. PHP inline comments start with ‘//’ or ‘#’. The following example shows some inline comments:

//Display some text using echo()
echo("My name is Omar");  //Display name
echo("My surname is Zammit");  #Display surname

When a comment is made up of multiple lines, PHP enables you to add block comments. Block comments are enclosed between ‘/*’ and ‘*/’. The following is an example of a block comment:
/*
PHP is a scripting language that runs on the Server.
To write text to an HTML page use echo() or print().
Variables start with a dollar sign '$'.
*/

Always remember, a well documented block of code can be easily understood and maintained.

Variables

Similar to JavaScript, the PHP scripting syntax is case sensitive and variables are ‘loosely typed’; no need to declare and specify the data type.
Variables start with the dollar symbol ‘$’. The PHP parser allocates some memory when a variable is encountered for the first time. The memory size changes according to the data assigned to the variable. The following example shows different variables:

$name = "Omar";
$age = 31;
$male = true;
$today = date("Y/m/d");

Constants

Constants are fixed values that do not change during the execution of a program. In PHP such values are declared using the define(<Constant name>,<Constant value>). The following example shows an example:
In line 2, the currency rate is stored in a constant variable euro. Line 3 declares a new variable ($MalteseValue) and a value of 100. Line 4 is calculating and displaying the euro equivalent.

Decisions and iterations

Decisions in PHP can be achieved using the if-else and switch-case statements. Similar to other programming languages, if statements enable you to combine multiple conditions to add ranges, the syntax for an if-elseif-else statement is as follows:

if(<Condition 1>)
{
//If the Condition 1 returns true, execute code within this block.
}elseif (<Condition 2>) {
//If Condition 2 returns true, execute code within this block.
}else{
            //If all conditions return false, execute code within this block.
}

When comparing a single value with a pre-defined list, a faster approach is the switch-case. Switch enables you to compare with a list of numbers or strings, but un-like if, ranges are not supported.

Switch(<Variable>)
{
            case 1:
                                          //Do something if Variable is 1
                        break;
case 2:
                                          //Do something if Variable is 2
                        break;
case 3:
                                          //Do something if Variable is 3
                        break;
            default:
//Do something if Variable is not 1,2 or 3
}

The for-loop is used to iterate a block of code, when the number of repetitions is known. The for-loop is structured as follows:

for(<Initial value>; <Stop condition>; <Counter update>)
{
//Each iteration, execute the code in this block
}

When the number of iterations depends on a condition, the while-loop can be used. The syntax is as follows:

while(<Condition>)
{
//Repeat this block while the condition is true.
}

An alternative to the while-loop is the do-while. The main difference is that when using a do-while, the code block is always executed at least once.

do
{
//Repeat this block if the condition is true.
}while(<Condition>)

Arrays

An array is a list of elements contained in one variable; each element is made up of an index and a value. The following example shows how an array of strings can be declared:

$names = array();
$names[0] = "Omar";
$names[1] = "Christine";
$names[2] = "Eliza";

The index is enclosed within square brackets ‘[ ]’ and enables you to reference an array element. For example, to display the array elements:

echo($names[0]);
echo($names[1]);
echo($names[2]);

NOTE: Similar to other programming languages, in PHP, arrays start from zero.
You can loop through an array using one of the loop methods described previously, but the most efficient way is to use the foreach-loop. As the name implies, this loop iterates for each element in a collection. The following code shows a foreach looping through the $names array:

foreach($name as $single){
            echo($single);
}

NOTE: Each element is stored in a temporary variable ($single)
The following table shows some PHP built-in functions that can be used with arrays:
Syntax
Description
array_unshift(<Array name>,<element>,<…)
Add elements to the start of an array. Multiple elements can be added.
array_push(<Array name>,<element>,<…)
Add elements to the end of an array. Multiple elements can be added.
array_shift(<Array name>)
Remove an element from the start of an array.
array_pop(<Array name>)
Remove an element from the end of an array
sort(<Array name>)
Sort an array from lowest to highest.
shuffle(<Array name>)
Mix the elements in an array.
array_merge(<Array name>,<Array name>)
Merge two arrays in one array. This function returns a merged array.
array_slice(<Array name>,<start>,<end>)
Extract elements between the start and the end values.

Task Description


This blog describes my experience while performing a task assigned by my tutor. The task consists of the following stages:
     Verify that PHP is working on your web server.
     Create an associative array of user names and passwords and list the entire array in a table.
     Explain between the echo() and print() functions.

Task steps


Environment

To test and create PHP server side scripting, I will be using the environment described in my last blog. For more information, refer to XAMPP blog.

Test the PHP installation

To test if the PHP module in XAMPP is working on my server I performed the following steps:
1.    In my XAMPP installation htdocs folder, I created a PHP page (phptest.php) with the following script:

<body>
            <?php
                        echo("My PHP Module is working");
            ?>
</body>

2.    When accessing this page from the server (http://localhost/phptest.php) or from a remote client computer (http://<Server IP>/phptest.php), if PHP is working,  the following page should load:

Create tables dynamically

Example 1: Credentials from an array

The aim is to create an array with user accounts and display the accounts in an HTML table. To achieve this, I created a PHP page with the following code:
Line 3 is assigning a new array in variable $userarray. In lines 5 to 8, four items having different keys and values are being added to the array.
Lines 11 and 14 are using the echo(<String>) syntax to create the table HTML markup and the table headers respectively.
Line 17 is using the reset(<array>) function to move the array internal pointer to the first item in the array. The internal pointer enables you to iterate through an array using PHP build in functions.
The iteration is done in lines 19 to 21 using a while() loop and the each() function. The iteration, works as follows:
1.    The while(<condition>) will continue to iterate until the condition within the brackets is null.
2.    The each(<array>) returns the element indicated by the array internal pointer and moves the pointer to the next item. If there are no more items, the each(<array>) returns a null value and while(<condition>) will stop the iteration.
3.    The array item returned by the each(<array>) is stored in a variable $user. To be precise, this array item is another array of two items; the array key (Username) and the array value (Password).
4.    Line 20 displays the array key ($user[0]) and the array value($user[1]) into an HTML table row.
Line 24 is using the echo(<String>) to create the table HTML markup.
The following screenshot shows the output when launching the code described in this section. Please note that I added some CSS styles.

Example 2: Credentials from a text file

The aim is to collect a list of users from a text file and display the list into an HTML table. To achieve this, I created a PHP page with the following code:
Using the fopen(<File path>, <Mode>) the text file is loaded and stored in $file variable as read-only.
Lines 6 and 9 are using the echo(<String>) syntax to create the table HTML markup and the table headers respectively.
The iteration is done in lines 13 to 19 using a while() loop and the feof(). The iteration, works as follows:
1.    The while(<condition>) will continue to iterate until the end of file is reached.
2.    The feof() checks if the file pointer is located at the end of the text file. If yes, the feof() returns false and stops the while() iteration.
3.    In line 15, the fgets() gets the line indicated by the file pointer from the text file and moves the pointer to the next line. In addition, using the preg_split(<delimiter>, <String>) and the tab as a delimiter, the line is split in two and stored in an array ($SingleUser).
4.    Line 18 displays the user name ($SingleUser[0]) and the password ($SingleUser[1]) into an HTML table row.
In line 20, the text file is closed using the fclose().
Line 25 is using the echo(<String>) to create the table HTML markup.
The following screenshot shows the output when launching the code described in this section. Please note that I added some CSS styles.

Language constructs: print and echo

At first glance print() and echo() may seem the same, reason being that when used with some text they produce the same output.
Before analyzing the differences, one should be aware that both print() and echo() are Language constructs and not functions. The difference between a function and a Language construct is all in the interpretation process. In simple terms, when a function is parsed, the PHP parser first checks the syntax and then processes all the contents. Language constructs are more specific (base units) and the parser deals directly with such constructs without parsing.
NOTE: Other language constructs exist in the PHP scripting, amongst others; unset(), empty(), isset(), include(), require(),die().

Similarities

I created the following examples that shows how to use the print() and the echo() Language constructs and achieve the same results.

Example 1: Display text

print("Hello world!!");
echo("Hello world!!"); 

print "Hello world!!";
echo "Hello world!!";

Example 2: Using parameters with text

$name = "Omar";
$surname = "Zammit";
//The output is My name is Omar Zammit
print "My name is $name $surname";
echo "My name is $name $surname";

Example 3: Concatenating strings

print "My ". "name ". "is ". "Omar "."Zammit.";
print "My ". "name ". "is ". "Omar "."Zammit.";

Example 4: Using array values

$vars = array();
$vars[]="Hello";
$vars[]="World";
//The output is Hello World
print $vars[0]." ".$vars[1];
echo $vars[0]." ".$vars[1];

Differences

A difference I noticed while using these Language constructs is, echo() can display multiple parameters at once without using concatenation. When using the echo(), the following syntax is valid:

echo 'Please ', 'note ', 'that ', 'strings ', 'are ', 'parameters.';

Displaying syntax this way is much faster than the following concatenated equivalent:

echo 'Please '.'note '. 'that '. 'strings '. 'are '. 'parameters.';

NOTE: Passing multiple string parameters to a print() language construct is not supported.
Another difference between these Language constructs is, print() returns a value (always one) and can be used as a normal PHP function. When using print(), the following syntax is valid:
//This example prints Yes
((5+5) == 10) ? print 'Yes' : print 'NO'

NOTE: Using echo() in the same way is not supported.

Print or echo ?

To answer this question is a bit difficult, both are very similar and various sources state that it makes no difference which one is used. Some developers prefer echo() because it supports multiple parameters; faster than concatenation.

Conclusion


Having XAMPP installed helped me a lot to start quickly learning PHP. Following some tutorials from W3C schools and my coursework text book I managed to create some PHP pages. Comparing the time spend on other scripting languages I think that PHP it’s not difficult to learn.

Happy coding...

Tuesday, 29 March 2011

XAMPP

Introduction

In a client server environment, all client requests are handled and interpreted by a Server. In computer terms a server is a machine, connected to the network (and/or Internet) running various services.
The server continuously is listening and waiting for a client to connect/request. As soon as a client requests a service using a standard protocol, the server will interpret the request and provide a response.
Depending on the infrastructure and number of requests, a server can provide one or more services.

What types of servers exist?

Different servers exist, but the most popular are:
  • Proxy servers – Usually these are located between a group of client computers and the Internet, and is used to filter client requests and server responses. (Microsoft ISA server)
  • Mail servers – Used to store e-mails in an organisation. Nowadays, many internet service providers have their own mail servers to provide email accounts for their subscribers. (Microsoft Exchange Servers)
  • Web servers – Used to host web pages. When a user requests a web page, the web server retrieves the requested file and sends it back to the user. With the introduction of dynamic web pages, nowadays, web servers perform server side scripting. (Apache)
  • FTP servers – Usually this is a file repository (File server) that enables users to upload and download files using the File Transfer Protocol (FTP). (Filezilla server)
  • Virtualization environments – Enables users to create and manage Virtual servers. (Microsoft Hyper-V and VMware)
  • Database servers – These include a Database Management Systems (DBMS) and enables applications to connect and retrieve data remotely. (Microsoft SQL Server)
In this blog I will describe my experience and what I’ve learned while performing a task assigned by my tutor.

XAMPP


What is XAMPP?

From a personal experience, installing and configuring various services from different vendors/providers on the same machine, is a difficult job. Various issues may rise and the majorities are all related to compatibility and system requirements.
Another drawback is price. Just imagine a student web developer having to buy software licensing just to get acquainted and gain some experience with these services.  
Peace of mind, some commonly used services are free, and thanks to the Apache Friends, these can be downloaded as a bundled package.
The XAMPP package can be downloaded from Apache Friends for various operating systems, including:
  • Linux
  • Windows
  • Mac OS X
  • Solaris
Amongst others XAMPP includes the following modules:
  • Apache web server
  • MySQL
  • PHP
  • Perl
  • phpMyAdmin
  • Webalizer
  • Mercury Mail Transfer
  • Filezilla FTP Server

Why XAMPP?

“The philosophy behind XAMPP is to build an easy to install distribution for developers to get into the world of Apache. To make it convenient for developers XAMPP is configured with all features turned on.” (http://www.apachefriends.org/en/xampp.html)

While using XAMPP I noted the following advantages:
ü  One installer for multiple modules; you just need to run one setup.
ü  No special knowledge is required to get it up and running.
ü  Intuitive and easy to use control panel.
ü  Includes various tools; amongst others, XAMPP Security report, Webalizer and phpMyAdmin.
ü  Minimum system requirements.
ü  XAMPP is FREE
The only issues I had while doing this task where not directly related to XAMPP. These are described in this blog but the following is a summary:
û  To install XAMPP on Windows 7 I had to turn off the User Access Control (UAC).
û  To connect from a remote computer, I had to enable a number of ports in my server firewall.

Task Description


This blog describes my experience while performing a task assigned by my tutor. The task consists of the following stages:
  • Install XAMPP on your computer
  • Test the following functions:
    • Control panel
    • Test HTTP and HTTPS
    • Test FTP
    • Generate a XAMPP security report
    • Generate a PHPINFO report
    • Generate a visitors report
    • Test the default guestbook
  • Add and image and a style sheet to the default index page
  • Test the web services from another computer

Preparing the environment


To test XAMPP, using VMware server, I implemented the environment described in this section.

XAMPP is installed on the Server (192.168.2.6), a Windows 7 machine with Windows Firewall enabled. The Client (192.168.2.5) is used to connect to the Server and test the XAMPP services.
The first thing to check when implementing such networks is communication. Communication between Client and Server can be tested using the command line PING.
Using Internet Control Message Protocol (ICMP), the PING command sends a number of packets to a destination and waits for a reply. When using PING from a command line, the time taken for a packet from source to destination and back to source is calculated and displayed.  
Using my environment as an example, to test connectivity from my client machine I used the following command line:

ping 192.168.2.6

Important to note that PING will not work if the Windows Firewall is configured to block ICMP messages. In fact to be able to send a PING request to the server I created an inbound firewall rule that allows ICMP messages. For more information on how to create such rule, refer to Nobody Can Ping My Computer Microsoft article.

Installing XAMPP


Download XAMPP

The XAMPP installer for Windows can be downloaded from the Apache friends web site and is compatible with Windows 2000, 2003, XP, Vista, and Windows 7.

Installation

Since XAMPP needs to install and run services, it is recommended to run the XAMPP installer as an administrator. To achieve this in Windows 7, right click the XAMPP installer and select Run as administrator.

UAC problems

After selecting the installation language, I bumped into the following warning:
The problem when installing XAMPP on Windows Vista and Windows 7 is that it may conflict with Microsoft User Account Control (UAC); UAC may prevent XAMPP to work correctly. UAC was introduced in Windows Vista to provide a more secure infrastructure and monitors software applications and services. To solve this issue in my testing environment I deactivated UAC. To disable UAC:
1.    Stop the XAMPP installation.
2.    In the Start menu search box, type msconfig and press Enter.
3.    Select the Tools tab in System Configuration.
4.    From the list select Change UAC settings and click Launch.
5.    From the User Account Control Settings select Never Notify. Click OK.
6.    Restart your computer.
7.    Restart XAMPP installation.When UAC is deactivated, the XAMPP installer launches another warning stating that activating UAC may restrict XAMPP functionality. Ignore the message and continue the installation.
For more information on UAC, refer to User Account Control Step-by-Step Guide and Security Watch.

The installation wizard

Once started, the installation wizard enables you to select the language and configure where to install the XAMPP files. During the installation, the XAMPP Options dialog enables you to install all XAMPP modules as services. When installed as services, modules are started automatically when starting the Server.

The Control Panel

Upon installation, XAMPP enables you to launch the Control Panel. Amongst others, the control panel enables you to:
  • Start and stop a service
  • Configure administration settings for each module
  • View each module status
  • Quick link to the XAMPP installation folder

Testing installation


Introduction

This section describes the tests I performed to ensure that the XAMPP modules are installed and working correctly. All tests are done on the server machine.

HTTP and HTTPS

To test if HTTP and HTTPS are working on the server machine first you should try to access the XAMPP default page from a web browser.
To test HTTP, launch any Internet browser and browse to http://localhost. If the Apache service is running the following page should be displayed.
To test HTTPS, launch any Internet browser and browse to https://localhost. If the Apache service is running the following page should be displayed.
Since the server security certificate is not verified by a Certificate Authority, the Internet browser will complain that the web site is not trusted.


FTP

To test the FTP module, from the server machine I downloaded and installed Filezilla FTP client; available from FileZilla client download. Filezilla enables users to connect, browse, upload and download files from FTP servers.
When installing XAMPP, the following two FTP accounts are installed by default:
User name
Password
Root directory
newuser
wampp
<Home Directory>\xampp\htdocs\
anonymous
<No password>
<Home Directory>\xampp\anonymous\

Using Filezilla, I connected to the FTP server using the newuser credentials.

While browsing and moving files using FTP, I monitored the actions in the Filezilla server.
You can test FTP using Windows Command line as follows:
1.    Launch a command line interface.
2.    Key-in ftp 127.0.0.1 and press Enter.
3.    Key-in the username (newuser) and press Enter.
4.    Key-in the password (wampp) and press Enter.
5.    After connecting, key-in the FTP subcommand ls and press Enter to list the folder contents.
For a full list of subcommands, refer to FTP Syntax.

XAMPP Status

The XAMPP status enables you to generate a report that shows the status of all installed XAMPP modules. To generate a XAMPP status:
1.    From an internet browser connect to http://localhost/
2.    From the left panel, click Status.

NOTE: As the page suggest, generating reports over HTTPS may give false results.

XAMPP security report

The XAMPP security report enables you to generate a report that shows the security status of all installed XAMPP modules. To generate a XAMPP security status:
1.    From an internet browser connect to http://localhost/
2.    From the left panel, click Security.
The XAMPP security reported the following issues:


Issues 1 to 3

These issues are reported because of the following:
1.    XAMPP pages can be accessed by everyone over the network without a password.
2.    MySQL Root account has no password.
3.    phpMyAdmin can be accessed without a password. (phpMyAdmin is a tool that enables you to manage MySQL, for more information refer to phpMyAdmin home page)
Luckily enough, XAMPP provides a quick link that enables you to solve these issues. This can be achieved by doing the following:
1.    From an internet browser, launch http://localhost/security/xamppsecurity.php.
2.    Key-in a new Root password for MySQL and click Password Changing.
3.    Key-in a new User name and password for the XAMPP directory. Click Make safe the XAMPP directory.
NOTE: Once the XAMPP directory is configured, to access the XAMPP directory, you must provide the username and password configured in step 3.

Issue 4

To solve this issue you must change the default FTP password for newuser. To change the default password:
1.    Launch XAMPP control panel and click the Filezilla Admin button.
2.    Click OK when asked for credentials.
3.    From the Filezilla server, click the user button and select newuser from the list.
4.    Key-in a new password in the Password text box.
5.    Click OK.

Issue 5

The PHP ‘Safe Mode’ was designed to prevent unauthorized scripts to run at the operating system level; preventing hackers from accessing the server.
The problem with ‘Safe Mode’ is that innocuous script that is needed to run a web site may not function correctly. Since I’m using a virtual environment I will ignore the message and leave PHP with the default configuration.

Issue 6
Mercury is an SMTP mail server and since it is outside the scope of this task, I will not go into further details. The Security report is not identifying a security issue but is indicating that the Mercury POP3 server is not running.

PHPINFO report

The phpinfo () function enables you to generate a report and view how your PHP installation is configured. This report is useful because:
  • It helps you understand your environment.
  • Enables you to identify installed functions and modules
  • It helps when debugging and troubleshooting issues.
To generate a PHP report from your XAMPP installation:
1.    Launch an internet explorer on your server (where XAMPP is installed).
2.    Browse to http://localhost/xampp/.
3.    From the left panel, click phpinfo().
The phpinfo() function enables you to specify parameters to customize the report. The following script generates the report, showing only the General section.
<?php
phpinfo(INFO_GENERAL);
?>
For a full list of parameters, refer to phpinfo parameters.

Generate a visitors report

One of the tools available in the XAMPP package is Webalizer, a web server log that enables you to generate statistical usage reports.
To generate a usage report from your XAMPP installation:
1.    Launch an internet explorer on your server (where XAMPP is installed).
2.    Browse to http://localhost/xampp/
3.    From the left panel, click Webalizer.


Amongst others, the report shows:
  • Monthly statistics
  • Daily and hourly usage per month
  • Top visited URLs and Top visited URLs by Kbytes
  • Top visited entry and exit pages
  • Top visited sites
  • Top visitors by username
  • Top visitors by country
For more information on Webalizer, refer to the Webalizer home page and the Webalizer FAQ.

Test the default guest book

The default guest book in XAMPP is written in Perl and can be launched as follows:
1.    Launch an internet explorer on your server (where XAMPP is installed).
2.    Browse to http://localhost/xampp/
3.    From the left panel, click Guest Book.
It’s very easy to use and to add an entry you just need to key-in your name and email, add your comment and click Write.

Modify the default index page


In Apache, all web pages should be added to the htdocs folder; this is the folder that by default Apache looks for files and is located at <Home Directory>\xampp\htdocs\. When installing XAMPP, a default page is added, this enables you to test your web server. To create my custom default page I did the following:
1.    Added a folder containing some images.
2.    Modified the contents of the index.html page.
3.    Added a style sheet style.css.
From the server machine I loaded the page using http://localhost/index.html. The output is as follows:
Different sites and web applications can exist within the same htdocs folder. The following image shows a scenario where multiple web sites exist on the same server:

NOTE: You can use an FTP client to upload and modify the htdocs contents.

Test the web services from another computer


Firewall ports to enable

As described previously, I’m using Windows firewall on my server machine. To enable other computers (clients) to connect and use the XAMPP modules over the network, the firewall should allow traffic on the following ports:

Port number
Protocol
Type
Services
21
TCP
Inbound and Outbound
FTP
80
TCP
Inbound and Outbound
HTTP
443
TCP
Inbound and Outbound
HTTPS
25
TCP
Inbound and Outbound
SMTP
110
TCP
Inbound and Outbound
POP3
143
TCP
Inbound and Outbound
IMAP
3306
TCP
Inbound and Outbound
MySQL
8080
TCP
Inbound and Outbound
HTTP alternative

NOTE: For maximum security, ONLY allow the required ports. For example, since in my environment I’m going to test HTTP, HTTPS and FTP I enabled only ports 21,443 and 80.

Web Server


XAMPP default page

My XAMPP default page is password protected, so users cannot access the XAMPP configuration page from a remote computer. To test this, load an internet browser from a client machine and browse to the server XAMPP folder; for example http://192.168.2.6/xampp/


HTTP

To test HTTP, I launched the default index page in the htdocs folder using http://192.168.2.6/index.html.

HTTPS

To test HTTPS, I launched the default index page in the htdocs folder using https://192.168.2.6/index.html.


FTP Server

From my client computer, I used Filezilla and the XAMPP default account (newuser) to connect to the FTP server.

As seen in the figure below, by default the newuser account home directory is the htdocs folder.

I used this to transfer files from my client computer in the htdocs folder, and change my web page without even logging into my server.

Conclusion


XAMPP is awesome and I recommend downloading. As seen in this blog, the steps to get XAMPP modules up and running are easy to achieve and can be tested with minimal effort. I installed XAMPP on one of my personal machines at home. This is very useful for debugging and troubleshooting my web projects; main reason, I’m trying on a real, working environment.

Thanks Apache Friends...