Chapter 5 PHP for Server-Side Programming
Except where otherwise noted, the contents of this presentation are Copyright 2009 Marty Stepp and Jessica Miller.
5.1: Server-Side Basics
5.1: Server-Side Basics
5.2: PHP Basic Syntax
5.3: Embedded PHP
5.4: Advanced PHP Syntax
URLs and web servers
http://server /path /file
usually when you type a URL in your browser:
your computer looks up the server's IP address using DNS
your browser connects to that IP address and requests the given file
the web server software (e.g. Apache) grabs that file from the server's local file system, and sends back its contents to you
Server-Side web programming
server-side pages are programs written using one of many web programming languages/frameworks
the web server contains software that allows it to run those programs and send back their output as responses to web requests
each language/framework has its pros and cons
we use PHP for server-side programming in this textbook
What is PHP?
(5.1.2)
PHP stands for "PHP Hypertext Preprocessor"
a server-side scripting language
used to make web pages dynamic:
provide different content depending on context
interface with other services: database, e-mail, etc
authenticate users
process form information
PHP code can be embedded in XHTML code
Lifecycle of a PHP web request
(5.1.1)
browser requests a .html
file (static content ): server just sends that file
browser requests a .php
file (dynamic content ): server reads it, runs any script code inside it, then sends result across the network
script produces output that becomes the response sent back
Why PHP?
There are many other options for server-side languages: Ruby on Rails, JSP, ASP.NET, etc. Why choose PHP?
free and open source : anyone can run a PHP-enabled server free of charge
compatible: supported by most popular web servers
simple: lots of built-in functionality; familiar syntax
available: still most commonly installed, ROC web servers and most commercial web hosts
Hello, World!
The following contents could go into a file hello.php
:
<?php
print "Hello, world!";
?>
Hello, world!
a block or file of PHP code begins with <?php
and ends with ?>
PHP statements, function declarations, etc. appear between these endpoints
Viewing PHP output
you can't view your .php
page on your local hard drive; you'll either see nothing or see the PHP source code
if you upload the file to a PHP-enabled web server, requesting the .php
file will run the program and send you back its output
5.2: PHP Basic Syntax
5.1: Server-Side Basics
5.2: PHP Basic Syntax
5.3: Embedded PHP
5.4: Advanced PHP Syntax
Console output: print
(5.2.2)
print "text ";
print "Hello, World!\n";
print "Escape \"chars\" are the SAME as in Java!\n";
print "You can have
line breaks in a string.";
print 'A string can use "single-quotes". It\'s cool!';
Hello, World!
Escape "chars" are the SAME as in Java!
You can have
line breaks in a string.
A string can use "single-quotes". It's cool!
some PHP programmers use the equivalent echo
instead of print
$name = expression ;
$user_name = "PinkHeartLuvr78";
$age = 16;
$drinking_age = $age + 5;
$this_class_rocks = TRUE;
names are case sensitive; separate multiple words with _
names always begin with $
, on both declaration and usage
always implicitly declared by assignment (type is not written)
a loosely typed language (like JavaScript or Python)
+ - * / % . ++ --
= += -= *= /= %= .=
== != === !== > < >= <=
&& || !
==
just checks value ("5.0" == 5
is TRUE
)
===
also checks type ("5" === 5
is FALSE
)
many operators auto-convert types: 5 < "7"
is TRUE
int
and float
types
$a = 7 / 2;
$b = (int) $a;
$c = round($a);
$d = "123";
$e = (int) $d;
int
for integers and float
for reals
division between two int
values can produce a float
$a = 3;
$b = 4;
$c = sqrt(pow($a, 2) + pow($b, 2)) ;
math constants
M_PI
M_E
M_LN2
the syntax for method calls, parameters, returns is the same as Java
Comments
(5.2.7)
like Java, but #
is also allowed
a lot of PHP code uses #
comments instead of //
we recommend #
and will use it in our examples
String
type
(5.2.6)
$favorite_food = "Ethiopian";
print $favorite_food[2];
zero-based indexing using bracket notation
string concatenation operator is .
(period), not +
5 + "2 turtle doves" === 7
5 . "2 turtle doves" === "52 turtle doves"
can be specified with ""
or ''
String
functions
$name = "Kenneth Kuan";
$length = strlen ($name);
$cmp = strcmp ($name, "Jeff Prouty");
$index = strpos ($name, "e");
$first = substr ($name, 8, 4);
$name = strtoupper ($name);
Interpreted strings
$age = 16;
print "You are " . $age . " years old.\n";
print "You are $age years old.\n";
for
loop
(same as Java)
(5.2.9)
for (initialization ; condition ; update ) {
statements ;
}
for ($i = 0; $i < 10; $i++) {
print "$i squared is " . $i * $i . ".\n";
}
bool (Boolean) type
(5.2.8)
$feels_like_summer = FALSE;
$php_is_rad = TRUE;
$student_count = 217;
$nonzero = (bool) $student_count;
the following values are considered to be FALSE
(all others are TRUE
):
0
and 0.0
(but NOT 0.00
or 0.000
)
""
, "0"
, and NULL
(includes unset variables)
arrays with 0 elements
can cast to boolean using (bool)
FALSE
prints as an empty string (no output); TRUE
prints as a 1
TRUE
and FALSE
keywords are case insensitive
if (condition ) {
statements ;
} elseif (condition ) {
statements ;
} else {
statements ;
}
NOTE: although elseif
keyword is much more common, else if
is also supported
while
loop
(same as Java)
while (condition ) {
statements ;
}
do {
statements ;
} while (condition );
NULL
$name = "Victoria";
$name = NULL ;
if (isset($name) ) {
print "This line isn't going to be reached.\n";
}
a variable is NULL
if
it has not been set to any value (undefined variables)
it has been assigned the constant NULL
it has been deleted using the unset
function
can test if a variable is NULL
using the isset
function
NULL
prints as an empty string (no output)
5.3: Embedded PHP
5.1: Server-Side Basics
5.2: PHP Basic Syntax
5.3: Embedded PHP
5.4: Advanced PHP Syntax
Embedding code in web pages
most PHP programs actually produce HTML as their output
dynamic pages; responses to HTML form submissions; etc.
an embedded PHP program is a file that contains a mixture of HTML and PHP code
A bad way to produce HTML in PHP
<?php
print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\n";
print " \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n";
print "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
print " <head>\n";
print " <title>My web page</title>\n";
...
?>
printing HTML code with print
statements is ugly and error-prone:
must quote the HTML and escape special characters, e.g. \"
must insert manual \n
line breaks after each line
don't print
HTML; it's bad style!
Syntax for embedded PHP
(5.3.1)
HTML content
<?php
PHP code
?>
HTML content
any contents of a .php
file that are not between <?php
and ?>
are output as pure HTML
can switch back and forth between HTML and PHP "modes"
Embedded PHP example
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>CSE 190 M: Embedded PHP</title></head>
<body>
<h1>Geneva's Counting Page</h1>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
print "$i\n";
}
?>
</p>
</body>
</html>
the above code would be saved into a file such as count.php
How many lines of numbers will appear? (View Source!)
Embedded PHP + print
= bad
...
<h1>Geneva's Counting Page</h1>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
print "$i\n";
}
?>
</p>
best PHP style is to use as few print
/echo
statements as possible in embedded PHP code
but without print
, how do we insert dynamic content into the page?
PHP expression blocks
(5.3.2)
<?= expression ?>
<h2>The answer is <?= 6 * 7 ?> </h2>
The answer is 42
PHP expression block : a small piece of PHP that evaluates and embeds an expression's value into HTML
Expression block example
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>CSE 190 M: Embedded PHP</title></head>
<body>
<?php
for ($i = 99; $i >= 1; $i--) {
?>
<p><?= $i ?> bottles of beer on the wall, <br />
<?= $i ?> bottles of beer. <br />
Take one down, pass it around, <br />
<?= $i - 1 ?> bottles of beer on the wall.</p>
<?php
}
?>
</body>
</html>
this code could go into a file named beer.php
Common error: unclosed braces
...
<body>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
?>
<?= $i ?>
</p>
</body>
</html>
if you open a {
brace, you must have a matching }
brace later
</body>
and </html>
above are inside the for
loop, which is never closed
if you forget to close your braces, you'll see an error about 'unexpected $end
'
Common error fixed
...
<body>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
?>
<?= $i ?>
<?php
}
?>
</p>
</body>
</html>
Common error: Missing =
sign
...
<body>
<p>Watch how high I can count:
<?php
for ($i = 1; $i <= 10; $i++) {
?>
<? $i ?>
<?php
}
?>
</p>
</body>
</html>
a block between <?
... ?>
is often interpreted the same as one between <?php
... ?>
PHP evaluates the code, but $i
does not produce any output
Complex expression blocks
...
<body>
<?php
for ($i = 1; $i <= 3; $i++) {
?>
<h<?= $i ?> >This is a level <?= $i ?> heading.</h<?= $i ?> >
<?php
}
?>
</body>
This is a level 1 heading.
This is a level 2 heading.
This is a level 3 heading.
expression blocks can even go inside HTML tags and attributes
5.4: Advanced PHP Syntax
5.1: Server-Side Basics
5.2: PHP Basic Syntax
5.3: Embedded PHP
5.4: Advanced PHP Syntax
Functions
(5.4.1)
function name (parameterName , ... , parameterName ) {
statements ;
}
function quadratic($a, $b, $c) {
return -$b + sqrt($b * $b - 4 * $a * $c) / (2 * $a);
}
parameter types and return types are not written
Calling functions
name (parameterValue , ... , parameterValue );
$x = -2;
$a = 3;
$root = quadratic(1, $x, $a - 2) ;
if the wrong number of parameters are passed, it's an error
Default parameter values
function name (parameterName , ... , parameterName ) {
statements ;
}
function print_separated($str, $separator = ", " ) {
if (strlen($str) > 0) {
print $str[0];
for ($i = 1; $i < strlen($str); $i++) {
print $sep . $str[$i];
}
}
}
print_separated("hello");
print_separated("hello", "-" );
if no value is passed, the default will be used (defaults must come last)
Variable scope: global and local vars
$school = "Rochester";
...
function downgrade() {
global $school;
$suffix = "Institute of Technology";
$school = "$school $suffix";
print "$school\n";
}
variables declared in a function are local to that function
variables not declared in a function are global
if a function wants to use a global variable, it must have a global
statement
It's ok RIT, because...
VIDEO
Including files: include()
(5.4.2)
include("filename ");
include("header.php");
inserts the entire contents of the given file into the PHP script's output page
encourages modularity
useful for defining reused functions like form-checking
$name = array();
$name = array(value0 , value1 , ... , valueN );
$name [index ]
$name [index ] = value ;
$name [] = value ;
$a = array();
$a[0] = 23;
$a2 = array("some", "strings", "in", "an", "array");
$a2[] = "Ooh!";
to append, use bracket notation without specifying an index
element type is not specified; can mix types
Array functions
function name(s)
description
count
number of elements in the array
print_r
print array's contents
array_pop
,
array_push
,
array_shift
,
array_unshift
using array as a stack/queue
in_array
,
array_search
,
array_reverse
,
sort
,
rsort
,
shuffle
searching and reordering
array_fill
,
array_merge
,
array_intersect
,
array_diff
,
array_slice
,
range
creating, filling, filtering
array_sum
,
array_product
,
array_unique
,
array_filter
,
array_reduce
processing elements
Array function example
$tas = array("MD", "BH", "KK", "HM", "JP");
for ($i = 0; $i < count ($tas); $i++) {
$tas[$i] = strtolower($tas[$i]);
}
$morgan = array_shift ($tas);
array_pop ($tas);
array_push ($tas, "ms");
array_reverse ($tas);
sort ($tas);
$best = array_slice ($tas, 1, 2);
the array in PHP replaces many other collections in Java
list, stack, queue, set, map, ...
The foreach
loop
(5.4.4)
foreach ($array as $variableName ) {
...
}
$stooges = array("Larry", "Moe", "Curly", "Shemp");
for ($i = 0; $i < count($stooges); $i++) {
print "Moe slaps {$stooges[$i]}\n";
}
foreach ($stooges as $stooge) {
print "Moe slaps $stooge\n";
}
a convenient way to loop over each element of an array without indexes
Splitting/joining strings
$array = explode(delimiter , string );
$string = implode(delimiter , array );
$s = "CSE 190 M";
$a = explode(" ", $s);
$s2 = implode("...", $a);
explode
and implode
convert between strings and arrays
for more complex string splitting, we'll use regular expressions (later)
Unpacking an array: list
list($var1 , ..., $varN ) = array ;
$line = "stepp:17:m:94";
list($username, $age, $gender, $iq) = explode(":", $line);
the list
function accepts a comma-separated list of variable names as parameters
assign an array (or the result of a function that returns an array) to store that array's contents into the variables
Non-consecutive arrays
$autobots = array("Optimus", "Bumblebee", "Grimlock");
$autobots[100] = "Hotrod";
the indexes in an array do not need to be consecutive
the above array has a count
of 4, with 97 blank elements between "Grimlock"
and "Hotrod"
PHP file I/O functions
(5.4.5)
reading/writing entire files:
file_get_contents
,
file_put_contents
asking for information:
file_exists
,
filesize
,
fileperms
,
filemtime
,
is_dir
,
is_readable
,
is_writable
,
disk_free_space
manipulating files and directories:
copy
,
rename
,
unlink
,
chmod
,
chgrp
,
chown
,
mkdir
,
rmdir
reading directories:
scandir
,
glob
Reading/writing files
$text = file_get_contents("schedule.txt") ;
$lines = explode("\n", $text);
$lines = array_reverse($lines);
$text = implode("\n", $lines);
file_put_contents("schedule.txt", $text) ;
file_get_contents
returns entire contents of a file as a string
if the file doesn't exist, you'll get a warning
file_put_contents
writes a string into a file, replacing any prior contents
Reading files example
function count_blank_lines($file_name) {
$text = file_get_contents($file_name) ;
$lines = explode("\n", $text) ;
$count = 0;
foreach ($lines as $line) {
if (strlen(trim($line)) == 0) {
$count++;
}
}
return $count;
}
...
print count_blank_lines("ch05-php.html") ;
Reading directories
$folder = "images";
$files = scandir($folder) ;
foreach ($files as $file) {
if ($file != "." && $file != "..") {
print "I found an image: $folder/$file\n";
}
}
scandir
returns an array of all files in a given directory
annoyingly, the current directory ("."
) and parent directory (".."
) are included in the array; you probably want to skip them