Baumeister Mediasoft Engineering BME - Baumeister Mediasoft Engineering  PHP - PHP Hypertext Preprocessor - English Version PHP - PHP Hypertext Preprocessor - Deutsche Version
Baumeister Mediasoft Engineering
Bartels AutoEngineerCarLogServicesResourcesCompany ProfileContact Us
Baumeister Mediasoft Engineering » Resources » Web Development » PHP

PHP - PHP Hypertext Preprocessor

PHP - PHP Hypertext Preprocessor

This section provides PHP resources which you will hopefully find useful. Over time, we hope to turn this section into a comprehensive reference for both beginners and experts. We are trying to provide working solutions for professional applications. The scripts and code snippets in this section are taken from real projects. Links to external websites are hand-picked and we only recommend literature which we frequently use ourselves.

Contents

Last Change

PHP Applications 
PHP Application: Browser Check 02/10/2010
PHP Application: DNS (Domain Name System) Lookups 02/10/2010
PHP Application: Display/View Web Page Contents/Source 02/10/2010
PHP Application: File Download Utilities 31/07/2010
PHP Application: Display Web-safe Colors 02/10/2010
PHP Functions 
PHP Function phpinfo (INFO) 02/10/2010
PHP Function phpversion (INFO) 02/10/2010
PHP Literature 02/10/2010
 

PHP Application: Browser Check

PHP test page for Browser Check:

<?php
echo '<p>HTTP_USER_AGENT: '.$_SERVER['HTTP_USER_AGENT'].'</p>';
?>

Output:

HTTP_USER_AGENT: Mozilla/5.0 (compatible; NLI_IAHarvester/3.3.0 +http://www.nli.ie/)

PHP Application: DNS (Domain Name System) Lookups

IP Address Lookup

The gethostbyname() PHP function can be used to look up the IP address for a given domain name.

string gethostbyname(string hostname)

The gethostbyname() function expects a host or domain name string parameter without the http:// protocol part (e.g., www.bme.ie) and returns the IP address for the given hostname or the hostname itself if the lookup failed.

Domain Name Lookup

The gethostbyaddr() PHP function can be used to look up the host (domain) name for a given IP address.

string gethostbyaddr(string ipaddress)

The gethostbyaddr() function expects a IP address string parameter (e.g., 207.46.249.252) and returns the host or domain name for the given ipaddress or the ipaddress itself if the lookup failed.

Example

The following PHP and HTML code displays a HTML page with a form for IP address and domain name lookups:

<?php
// dnslookupip.php - DNS/IP Address Lookup
// Copyright (c) 2003-2006 by Manfred Baumeister (www.bme.ie)

// Page title
$pagetitle        'BME Resources - PHP Application: DNS Lookup';

// Prompts
$prompt_ip        'IP Address';
$prompt_dn        'Domain Name';

// Messages
$lookupfail        '<span style="color:red;">* lookup failed *</span>';

// Get submitted host/domain name
$dn    = isset($_REQUEST['dn']) ? $_REQUEST['dn'] : '';
if (
$dn == $prompt_dn)
{
    
$dn '';
}

// Get submitted ip address
$ip    = isset($_REQUEST['ip']) ? $_REQUEST['ip'] : '';
if (
$ip == $prompt_ip)
{
    
$ip '';
}

// Check if host/domain name specified
if ($dn)
{
    
// Domain name specified; IP address lookup request
    
if ($dn == 'me')
    {
        
$ip $_SERVER['REMOTE_ADDR'];
    }
    else
    {
        
// Lookup IP address by domain/host name
        
$ip = @gethostbyname($dn);
        if (
$ip == $dn)
        {
            
$ip $lookupfail;
        }
    }
    
$message $prompt_dn.' '.$dn.' :: '.$prompt_ip.' '.$ip;
}
// Check if IP address specified
else if ($ip)
{
    
// Lookup domain/host name by IP address    
    
$dn = @gethostbyaddr($ip);
    
// Check lookup
    
if ($dn == $ip)
    {
        
// IP address invalid or domain name not found
        
$dn $lookupfail;
    }
    
$message $prompt_ip.' '.$ip.' :: '.$prompt_dn.' '.$dn;
}
else
{
    
$message $prompt_dn.' '.$_SERVER['HTTP_HOST']
        .
' :: '.$prompt_ip.' '.$_SERVER['SERVER_ADDR'];
}
?>
<html>
<head>
<title><?php echo $pagetitle;?></title>
</head>
<body style="background-color:#cfcfcf;font-family:Arial;sans-serif;font-size:12px;">
<h3 style="font-size:13px;margin-bottom:0px;"><?php echo $pagetitle;?></h3>
<hr />
<p style="margin-top:4px;margin-bottom:4px;font-size:12px;">
<?php echo $message;?>
</p>
<form style="margin-top:4px;margin-bottom:4px;">
<input style="font-size:12px;" type="text" name="dn"
    value="<?php echo $prompt_dn;?>" size="30" />
<input style="font-size:12px;" type="text" name="ip" 
    value="<?php echo $prompt_ip;?>" size="15" /> 
<input style="font-size:12px;" type="submit" value="Lookup" />
</form>
<hr />
<p style="margin:0px;font-size:9px;color:#666666;">
Copyright &#169; 2003-<?php echo date('Y');?>
 by <a href="http://www.bme.ie" target="_top">Manfred Baumeister</a>
</p>
</body>
</html>

The following displays the HTML page from above using an <iframe> tag:

Click here to open the above page in its own window.

PHP Application: Display/View Web Page Contents/Source

Introduction

Most web browsers provide a function for displaying the source code of the currently loaded web page. However, sometimes it is useful to access web page source code without having to load the web page into the web browser first. Examples might be web pages which immediately redirect to other web pages, style sheets (CSS files), JavaScripts (JS files), or web pages which could contain malicious code (you might want to check the source code first before allowing your web browser to load the web page and run or download any potentially malicious code). The file_get_contents() PHP function can be used to read an entire file into a string:

string file_get_contents(string filename)

A URL can be used as a filename parameter for the file_get_contents() function if the URL-aware fopen wrappers are enabled (PHP option/variable allow_url_fopen set to 1).

PHP Script

The following PHP and HTML code displays a HTML page with a form for entering the address (URL) of a file to be displayed. The form also provides a checkbox for wrapping long lines when displaying the source code. The content of the specified web address is displayed using a form/<textarea> tag. A Select All button is provided for selecting the displayed text in JavaScript-enabled web browsers.

<?php
// viewwebpagesource.php - Display/view contents/source of URI-specified web page
// Copyright (c) 2003-2006 by Manfred Baumeister (http://www.bme.ie)

// Page title
$pagetitle  'Baumeister Mediasoft Engineering :: Resources :: '
    
.'PHP Application: Display/View Web Page Contents/Source'
    
;
// Messages
$fmturl     '<p style="margin:0px;">"%s" contents/source:</p>'."\n";
$nosource   '<span style="color:red;">* empty / not found *</span>';
// Form parameters
$url        = isset($_REQUEST['url']) ? $_REQUEST['url'] : '';
$dowrap     = isset($_REQUEST['wrapsource']) && !empty($_REQUEST['wrapsource']) && ($_REQUEST['wrapsource'] == 'on') ? 0;
?>
<html>
<head>
<title><?php echo $pagetitle;?></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body style="background-color:#cfcfcf;font-family:Arial;sans-serif;font-size:12px;">
<h3 style="font-size:13px;margin-bottom:0px;"><?php echo $pagetitle;?></h3>
<hr />
<form method="post" style="margin-top:4px;margin-bottom:4px;">
URL <input style="font-size:12px;" type="text" size="50"
 name="url" value="<?php echo empty($url) ? 'http://' $url;?>" />
<input style="font-size:12px;" type="checkbox"
 name="wrapsource"<?php if ($dowrap) { echo ' checked="checked"';}?> />Wrap
<input style="font-size:12px;" type="submit" value="Go" />
</form>
<?php
if (!empty($url))
{
    
// Start web page output
    
echo '<hr />'."\n";
    
// Display selected URL
    
echo sprintf($fmturl$url);
    
// Enable URL-aware fopen wrappers to allow for URL file reading
    
if ((double)phpversion() >= 4.2)
    {
        
ini_set('allow_url_fopen''1');
    }
    
// Read file
    
$s = @file_get_contents($url);
    if (empty(
$s))
    {
        
// Web page empty/access failure
        
echo $nosource;
    }
    else
    {
        
// Display web page contents/source using form/textarea
?>
<form name="_webpagesource_" style="margin-bottom:0px;">
<script type="text/javascript" language="JavaScript">
<!--
// Display select all button
document.write('<input style="font-size:12px;" type="button" value="Select All"'
    + ' onclick="document.forms[\'_webpagesource_\'][\'_src_\'].select();"'
    + ' />'
    );
//-->
</script>
<table width="100%" height="80%" border="0" cellspacing="0" cellpadding="0"><tr>
<td style="vertical-align:top;">
<textarea id="_src_" style="width:100%;height:100%;"
 wrap="<?php echo $dowrap 'virtual' 'off';?>">
<?php echo htmlspecialchars($s);?>
</textarea>
</td>
</tr></table>
</form>
<?php
    
}
}
?>
<hr />
<p style="margin:0px;font-size:9px;color:#666666;">
Copyright &#169; 2003-<?php echo date('Y');?>
 by <a href="http://www.bme.ie" target="_top">Manfred Baumeister</a>
</p>
</body>
</html>

Example

The following displays the HTML page from above using an <iframe> tag:

Click here to open the above page in its own window.

PHP Application: File Download Utilities

File Download Function

PHP user function for downloading files without public URL:

<?php
function DownloadFile($filename)
{
    
// Check filename
    
if (empty($filename) || !file_exists($filename))
    {
        return 
FALSE;
    }
    
// Create download file name to be displayed to user
    
$saveasname basename($filename);
    
// Send binary filetype HTTP header
    
header('Content-Type: application/octet-stream');
    
// Send content-length HTTP header
    
header('Content-Length: '.filesize($filename));
    
// Send content-disposition with save file name HTTP header
    
header('Content-Disposition: attachment; filename="'.$saveasname.'"');
    
// Output file
    
readfile($filename);
    
// Done
    
return TRUE;
}
?>

File Download Script

PHP script for downloading files without public URL:

<?php
//////////////////////////////////////////////////////////////////////
// DOWNLOAD.PHP -- Download Utility
// Copyright (c) 2001-2006 Manfred Baumeister, Dublin, Ireland
//
// AUDIT TRAIL:
//    mb (03/02/2004) Bugfix/Patch: Call to getGlobalVar('id', 1) fixed.
//    mb (26/12/2003) Modified download file id parameter access.
//    mb (26/12/2003) BUGFIX: Syntax error (missing ')' in line 13) fixed.
//    mb (15/09/2003) getGlobalVar function added/facilitated.
//    mb (05/10/2002) PHP 4.2 global variable access.
//////////////////////////////////////////////////////////////////////

// Get download file id (assume it's passed as a form or URL parameter)
$id getGlobalVar('id'1);

// Check download file id parameter, get download file name, download file
// (assuming (global) variable $id specifies download file id)
if (empty($id) || !DownloadFile(getDownloadFileName($id)))
{
    die(
"No Download!");
}

// Only functions beyond this point

function getDownloadFilename($fileid)
// Get download file pathname
// Returns: download file pathname
// Parameters:
//    $fileid : File identifier
{
    
// Download file list
    
$DLFILES = array(
        
'TOOL1' => 'download/tool1_v30.exe',
        
'PROG2' => 'download/prog2setup.exe',
        );
    
// Get/check download file name
    
if (empty($fileid) || empty($DLFILES[$fileid]))
    {
        return 
'';
    }
    
// Set base directory to document root directory
    // (could also be set to a directory outside document root!)
    
$basedir getGlobalVar('DOCUMENT_ROOT');
    
// Build and return download file name
    
return $basedir.'/'.$DLFILES[$fileid];
}

function 
DownloadFile($filename)
// Download file
// Returns: TRUE if download successfully started, FALSE if download failed
// Parameters:
//    $filename : Download file pathname
{
    
// Verify filename
    
if (empty($filename) || !file_exists($filename))
    {
        return 
FALSE;
    }
    
// Create download file name to be displayed to user
    
$saveasname basename($filename);
    
// Send binary filetype HTTP header
    
header('Content-Type: application/octet-stream');
    
// Send content-length HTTP header
    
header('Content-Length: '.filesize($filename));
    
// Send content-disposition with save file name HTTP header
    
header('Content-Disposition: attachment; filename="'.$saveasname.'"');
    
// Output file
    
readfile($filename);
    
// Download successfully started
    
return TRUE;
}

function 
getGlobalVar($g$formflag 0)
// Get global PHP variable value
// Returns: global variable value or empty string if not available
// Parameters:
//  $g        : Global PHP variable name
//  $formflag : Flag - global var from GET/POST input
{
    if (empty(
$g))
    {
        return 
0;
    }
    
// Try superglobal access (PHP 4.1.0+)
    
if ($formflag)
    {
        if (isset(
$_POST[$g]))
        {
            return 
$_POST[$g];
        }
        if (isset(
$_GET[$g]))
        {
            return 
$_GET[$g];
        }
        if (isset(
$_REQUEST[$g]))
        {
            return 
$_REQUEST[$g];
        }
    }
    else
    {
        if (isset(
$_SERVER[$g]))
        {
            return 
$_SERVER[$g];
        }
        if (isset(
$_ENV[$g]))
        {
            return 
$_ENV[$g];
        }
    }
    
// Try superglobal access (PHP 3.0.0+)
    
if (isset($GLOBALS[$g]))
    {
        return 
$GLOBALS[$g];
    }
    
// Try global variable access (PHP 3+)
    
global $$g;
    if (!empty($
$g))
    {
        return $
$g;
    }
    
// Assume global variable empty/not set
    
return '';
}
?>

The script above expects a download file id parameter for identifying the download file. The advantage of the above method/script is that no download URL has to be exposed to the user (download files can even be stored outside the webserver document root). This allows to control and monitor access to download files (webmaster notification, download access counters/statistics, user identification requests, etc.). The following link would activate the download of prog2setup.exe if the script is saved as http://www.YourDomain.com/dl.php:

<a href="http://www.YourDomain.com/dl.php?id=PROG2">Download Program 2</a>

The download can also be started through a redirect statement from PHP with a script such as:

<?php
header
("Location: http://www.YourDomain.com/dl.php?id=PROG2");
exit;
?>

The above method/script is useful for automatic download monitoring and notification. It is possible to prevent the user from directly accessing the download file, thus allowing for additional procedures such as download access counting and webmaster notifications to be triggered whenever a download file is requested. It is also possible to pass download requests through forms for user identification.

Known Problems

Using the Content-disposition: attachment HTTP header can cause a series of problems in Internet Explorer, notably IE5.5 SP1 and IE6.01. See Related Links for more information. The following PHP file download user function uses a browser check to avoid these bugs/problems:

<?php
function DownloadFile($filename)
{
    
// Check filename
    
if (empty($filename) || !file_exists($filename))
    {
        return 
FALSE;
    }
    
// Create download file name to be displayed to user
    
$saveasname basename($filename);
    
// Send binary filetype HTTP header
    
header('Content-Type: application/octet-stream');
    
// Send content-length HTTP header
    
header('Content-Length: '.filesize($filename));
    
// Send content-disposition with save file name HTTP header
    // (using workaround for MSIE 5.5 SP1 / MSIE 6.01 bugs/problems)
    
$browser getGlobalVar('HTTP_USER_AGENT');
    if (
strstr('MSIE 5.5'$browser)
     || 
strstr('MSIE 6.01'$browser))
    {
        
header('Content-Disposition: filename="'.$saveasname.'"');
    }
    else
    {
        
header('Content-Disposition: attachment; filename="'.$saveasname.'"');
    }
    
// Send Content-Transfer-Encoding HTTP header
    // (use binary to prevent files from being encoded/messed up during transfer)
    
header('Content-Transfer-Encoding: binary');
    
// Output file
    
readfile($filename);
    
// Done
    
return TRUE;
}

function 
getGlobalVar($g$formflag 0)
// Get global PHP variable value
// Returns: global variable value or empty string if not available
// Parameters:
//  $g        : Global PHP variable name
//  $formflag : Flag - global var from GET/POST input
{
    if (empty(
$g))
    {
        return 
0;
    }
    
// Try superglobal access (PHP 4.1.0+)
    
if ($formflag)
    {
        if (isset(
$_GET[$g]))
        {
            return 
$_GET[$g];
        }
        if (isset(
$_POST[$g]))
        {
            return 
$_POST[$g];
        }
        if (isset(
$_REQUEST[$g]))
        {
            return 
$_REQUEST[$g];
        }
    }
    else
    {
        if (isset(
$_SERVER[$g]))
        {
            return 
$_SERVER[$g];
        }
        if (isset(
$_ENV[$g]))
        {
            return 
$_ENV[$g];
        }
    }
    
// Try superglobal access (PHP 3.0.0+)
    
if (isset($GLOBALS[$g]))
    {
        return 
$GLOBALS[$g];
    }
    
// Try global variable access (PHP 3+)
    
global $$g;
    if (!empty($
$g))
    {
        return $
$g;
    }
    
// Assume global variable empty/not set
    
return '';
}
?>
<?php
function DownloadFile($filename)
{
    
// Check filename
    
if (empty($filename) || !file_exists($filename))
    {
        return 
FALSE;
    }
    
// Create download file name to be displayed to user
    
$saveasname basename($filename);
    
// Send binary filetype HTTP header
    
header('Content-Type: application/octet-stream');
    
// Send content-length HTTP header
    
header('Content-Length: '.filesize($filename));
    
// Send content-disposition with save file name HTTP header
    // (using workaround for MSIE 5.5 SP1 / MSIE 6.01 bugs/problems)
    
$browser getGlobalVar('HTTP_USER_AGENT');
    if (
strstr('MSIE 5.5'$browser)
     || 
strstr('MSIE 6.01'$browser))
    {
        
header('Content-Disposition: filename="'.$saveasname.'"');
    }
    else
    {
        
header('Content-Disposition: attachment; filename="'.$saveasname.'"');
    }
    
// Send Content-Transfer-Encoding HTTP header
    // (use binary to prevent files from being encoded/messed up during transfer)
    
header('Content-Transfer-Encoding: binary');
    
// Output file
    
readfile($filename);
    
// Done
    
return TRUE;
}

function 
getGlobalVar($g$formflag 0)
// Get global PHP variable value
// Returns: global variable value or empty string if not available
// Parameters:
//  $g        : Global PHP variable name
//  $formflag : Flag - global var from GET/POST input
{
    if (empty(
$g))
    {
        return 
0;
    }
    
// Try superglobal access (PHP 4.1.0+)
    
if ($formflag)
    {
        if (isset(
$_GET[$g]))
        {
            return 
$_GET[$g];
        }
        if (isset(
$_POST[$g]))
        {
            return 
$_POST[$g];
        }
        if (isset(
$_REQUEST[$g]))
        {
            return 
$_REQUEST[$g];
        }
    }
    else
    {
        if (isset(
$_SERVER[$g]))
        {
            return 
$_SERVER[$g];
        }
        if (isset(
$_ENV[$g]))
        {
            return 
$_ENV[$g];
        }
    }
    
// Try superglobal access (PHP 3.0.0+)
    
if (isset($GLOBALS[$g]))
    {
        return 
$GLOBALS[$g];
    }
    
// Try global variable access (PHP 3+)
    
global $$g;
    if (!empty($
$g))
    {
        return $
$g;
    }
    
// Assume global variable empty/not set
    
return '';
}
?>

PHP Application: Display Web-safe Colors

Web-safe color codes include the following RGB values:

  • 0x00
  • 0x33
  • 0x66
  • 0x99
  • 0xCC
  • 0xFF

The following PHP script generates a table for displaying the websafe colors:

<?php
// Color value definitions
$c = array('00','33','66','99','cc','ff');
// Start color table
echo '<table border="1" cellpadding="6">';
// Iterate R(ed) values
for ($i 0$i 6$i++)
{
    
// Iterate G(reen) values
    
for ($j 0$j 6$j++)
    {
        
// Start color table row
        
echo '<tr>';
        
// Iterate B(lue) values
        
for ($k 0$k 6$k++)
        {
            
// Get color value
            
$color $c[$i].$c[$j].$c[$k];
            
// Get "inverted" color value
            
$colorinv $c[5-$i].$c[5-$j].$c[5-$k];
            
// Display color table cell
            
echo '<th'
                
.' style="background-color:#'.$color.'; color:#'.$colorinv.';">'
                
.'#'.$color
                
.'</th>'
                
;
        }
        
// End color table row
        
echo '</tr>';
    }
}
// End color table
echo '</table>';
?>

Output/Display:

#000000#000033#000066#000099#0000cc#0000ff
#003300#003333#003366#003399#0033cc#0033ff
#006600#006633#006666#006699#0066cc#0066ff
#009900#009933#009966#009999#0099cc#0099ff
#00cc00#00cc33#00cc66#00cc99#00cccc#00ccff
#00ff00#00ff33#00ff66#00ff99#00ffcc#00ffff
#330000#330033#330066#330099#3300cc#3300ff
#333300#333333#333366#333399#3333cc#3333ff
#336600#336633#336666#336699#3366cc#3366ff
#339900#339933#339966#339999#3399cc#3399ff
#33cc00#33cc33#33cc66#33cc99#33cccc#33ccff
#33ff00#33ff33#33ff66#33ff99#33ffcc#33ffff
#660000#660033#660066#660099#6600cc#6600ff
#663300#663333#663366#663399#6633cc#6633ff
#666600#666633#666666#666699#6666cc#6666ff
#669900#669933#669966#669999#6699cc#6699ff
#66cc00#66cc33#66cc66#66cc99#66cccc#66ccff
#66ff00#66ff33#66ff66#66ff99#66ffcc#66ffff
#990000#990033#990066#990099#9900cc#9900ff
#993300#993333#993366#993399#9933cc#9933ff
#996600#996633#996666#996699#9966cc#9966ff
#999900#999933#999966#999999#9999cc#9999ff
#99cc00#99cc33#99cc66#99cc99#99cccc#99ccff
#99ff00#99ff33#99ff66#99ff99#99ffcc#99ffff
#cc0000#cc0033#cc0066#cc0099#cc00cc#cc00ff
#cc3300#cc3333#cc3366#cc3399#cc33cc#cc33ff
#cc6600#cc6633#cc6666#cc6699#cc66cc#cc66ff
#cc9900#cc9933#cc9966#cc9999#cc99cc#cc99ff
#cccc00#cccc33#cccc66#cccc99#cccccc#ccccff
#ccff00#ccff33#ccff66#ccff99#ccffcc#ccffff
#ff0000#ff0033#ff0066#ff0099#ff00cc#ff00ff
#ff3300#ff3333#ff3366#ff3399#ff33cc#ff33ff
#ff6600#ff6633#ff6666#ff6699#ff66cc#ff66ff
#ff9900#ff9933#ff9966#ff9999#ff99cc#ff99ff
#ffcc00#ffcc33#ffcc66#ffcc99#ffcccc#ffccff
#ffff00#ffff33#ffff66#ffff99#ffffcc#ffffff

PHP Function phpinfo (INFO)

phpinfo() creates a web page with comprehensive system environment information such as operating system and web server environment, PHP configuration, paths, global and local values of configuration options, HTTP headers, etc. Because every system is setup differently, phpinfo() is often used to check configuration settings and predefined system variables. phpinfo() is also a valuable debugging tool as it lists GET, POST, cookie, environment and server data.

It doesn't come as a surprise that the following script is often the first PHP script a PHP developer runs on a new client system:

<?php
phpinfo
();
?>

The above script is usually saved under a file name such as phpinfo.php. Since phpinfo() exposes information which might help hackers to break into a system, it is not recommended to provide easy and/or permanent public access to phpinfo() scripts.

PHP Function phpversion (INFO)

The phpversion() retrieves the current PHP version:

<?php
echo '<p>PHP Version: '.phpversion().'</p>';
?>

Output:

PHP Version: 5.6.31

The string returned by phpversion() can easily be converted to a numeric value:

<?php
echo '<p>PHP Version: '.phpversion().' = '.(float)phpversion().'</p>';
?>

Output:

PHP Version: 5.6.31 = 5.6

phpversion() can be used to control the execution of PHP functions with different implementations depending on the PHP version. The following code shows a version-independent application of the microtime() PHP function for retrieving the Unix timestamp with microseconds accuracy:

<?php
function getMicrotime()
{
    
// Get Unix timestamp with microseconds accuracy
    
if ((float)phpversion() >= 5.0)
    {
        return 
microtime(1);
    }
    list(
$usec$sec) = explode(' 'microtime());
    return ((float)
$sec + (float)$usec);
}
?>

PHP Literature

The literature listed in this section is hand-picked. We only recommend books which we frequently use ourselves. You can use the Amazon links provided for online ordering if you are interested in purchasing any of the books. Simply chose the link to the Amazon website closest to you. Amazon.co.uk is located in the United Kingdom, Amazon.com is located in the United States, and Amazon.de is located in Germany.

Recommended reading on PHP:

PHP Advanced for the World Wide Web: Visual Quickpro Guide (Visual QuickPro Guide) PHP Advanced for the World Wide Web: Visual Quickpro Guide (Visual QuickPro Guide)
Language: English
Author: Larry Ullman
Publisher: Peachpit Press
Published: January 2002
ISBN: 0201775972
Paperback - 511 Pages

Baumeister Mediasoft Engineering » Resources » Web Development » PHP

PHP - PHP Hypertext Preprocessor • © 2017 Manfred Baumeister • Updated: 02 October 2010, 23:36 [UTC]

Baumeister Mediasoft Engineering, Clontarf, Dublin 3, Ireland
© 2017 Manfred Baumeister

PHP - PHP Hypertext Preprocessor - English Version PHP - PHP Hypertext Preprocessor - Deutsche Version