Command line interpreter: php not interactive must enclose executable statements in <?php ... ?> --one exception is if you want to interpolate a variable's value into the web page. Then you can write: <?=$varname?> Note the '=' sign in front of the variable name if you run on the UTK system, use web.eecs.utk.edu --it will not report syntax errors --use the command line interpreter if you get no output to check your syntax and to see if your program is producing the output you expect it to Variables Do not have to be declared Start with $ Strings: $vars inside double quotes are interpolated while they are literal inside single quotes e.g. $a = 20 "$a" = "20" '$a' = '$a' If there is no space between the variable name and the text that follows it, then put curly braces around the name to indicate where it begins and ends e.g.; "{$a}lbs" = "20lbs" // ambiguous without the {}'s "a = $a b = $b" // no {}'s necessary because no ambiguity Concatenation operator is . casts ints and doubles to strings String comparison is same as numeric comparison: ==, !=, <, >, etc. Useful functions strip_tags($string): strips all html and php tags from the string a) this function is useful for "disinfecting" a string since a hacker might try to insert malicious code using php tags substr($str, position, length) position starts at 0 if position is negative then substr counts from the end of the string if length is omitted then you get the rest of the string starting from position strlen($str): returns the length of the string strpos($str, $substr): returns the position of the first occurrence of $substr or NULL trim($string, "charlist"): returns a string with all characters in charlist stripped from the beginning and end of string. If "charlist" is omitted, then trim strips whitespace (blankspaces, tabs, newlines, return characters (\r), and null characters (\0)). a. ltrim: strips only leftmost characters b. rtrim: strips only rightmost characters c. unlike chomp, trim does not do inplace editing of the string. You must write: $line = trim($line); $array = explode(char, $string): returns an array that splits the string based on the delimiter character. It will not collapse white space. For example: $array = explode(" ", "a b") returns the array ("a", "", "b") $array = preg_split("/perl_pattern/", $string): returns an array that splits the string based on the given perl pattern $array = preg_split("/\s+/", a b") returns ("a", "b") explode is faster if you have a simple delimiter Data Types boolean: TRUE/FALSE or true/false null (case insensitive, so Null and NULL work equally well): A variable is considered to be null if: 1) it has been assigned the value null 2) it is undefined gettype($var): returns the type of the variable legitimate types: integer boolean double string array e.g., $a = 6.2; if (gettype($a) == double) ... settype($var, "type"): coerces value of $var to that type a) Example: $a = "10"; settype($a, "integer"); // $a = 10 b) returns true on success and false on failure. For example, if $a were "brad" in the above example, settype would return false c) I can also cast variables to new types using C-style casting. For example: $a = (int)$a; Casting has the same effect as settype, but you will not know whether or not the cast succeeded. d) When either settype or casting fails, the variable will be left with the failed result. For example, if $a were "brad", then both settype and casting will assign the value 0 to $a. Conditionals 2 versions for and/or and/&&: && has higher precedence than and or/||: || has higher precedence than or elseif used instead of "else if" but "else if" works too switch: works with numbers and strings use multiple case statements if multiple cases for the same code use break to avoid executing the next case code default keyword: executes the default code Functions introduced with function keyword use global keyword to declare a variable global within a function e.g., function change_value() { global $value; $value = $value * 2; arguments are passed by value. If you want to modify an object, such as an array, you can pass it by reference by prefixing the variable name with an &. For example: function changeValue(&$myArray) { $myArray[1] = 50; } include keyword include "tax.php"; // includes this file include_once "tax.php"; // guarantees that the code for tax.php // is only loaded once include_once should be placed in front of a file every time it is loaded. include_once checks to see if the file has already been loaded and, if so, does nothing. However, suppose you try something like: include_once "tax.php"; include "tax.php"; In this case tax.php gets reloaded because the second include does not check whether or not tax.php has already been loaded useful numeric functions floor ceil max min rand(min,max): numbers between min/max inclusive printf place ' before padding char for a decimal number e.g., printf("%'05d", $a); // pads with 0's instead of spaces sprintf fct returns a string: $a = sprintf(...)
file I/O: similar to C for file I/O and similar to Perl for directory
	operations (many of these commands will not work on our
	servers because they are too dangerous, so do not be surprised
	if you try to use one of them and it fails. They will work if
	you run the file from the command line, but not from within the
	browser.).
    a fairly complete list of file commands can be found
	at http://www.w3schools.com/PHP/php_ref_filesystem.asp.
    $contents = file_get_contents(filename): returns entire file as a string
    $lines = file(filename): reads an entire file into an array, one line
	per entry
    file_put_contents(filename, string/array): writes the entire string/array
        to the file, and creates the file if necessary (identical to calling
	fopen, fwrite, and fclose)
    $file_handle = fopen(filename, "mode"): opens a file and returns either
	a file handle on success or false on failure.
	"r": read
	"w": write, overwrite existing file
	"a": append
	"x": write, signal error if file already exists
	--The return result of fopen shows the advantage of dynamic typing.
	  If you query the type of $file_handle using the gettype function,
	  you will find it is a resource if fopen succeeds
	  and a boolean (with the value false) if the fopen fails
    fclose($file_handle): closes a file
    reading input
        string fgets($file_handle): returns the next line of input with the
	    newline character attached or the boolean false if the read
	    fails. 
	    a) use the trim() function to strip the newline character, as 
		well as leading and trailing whitespace.
            b) fgets(STDIN): reads from stdin
	    c) there is no gets function: PHP was originally intended for
		server-side scripting from a browser, not a command line. Hence
		it was not set up to easily access a keyboard (i.e., STDIN).
	    d) to read one line at a time and process it:
                while ($line = fgets($file_handle)) {
                    ... process $line ...
                }
 	fscanf($file_handle, format_string, variables) 
	    a) unlike C, fscanf reads an entire line of input and 
		discards the unused part
	    b) if there are too few fields provided, then the extra variables
		retain their old values
	    c) fscanf(STDIN, ...): reads from stdin. Like gets, there is no
		scanf in php
    writing output
	fprintf($filehandle, format_string, variables): writes a formatted
		string to a file
	fputs($filehandle, $string): writes a string to a file
		
    bool rename(string $oldname, string $newname): moves a file from
	$oldname to $newname and returns true/false depending on whether
	the move succeeds
    bool unlink(string $name): deletes a file and returns true/false depending
	on whether it succeeds
    bool mkdir(string $path, string $permissions): creates a directory in
	the specified path. 
	a. returns true/false depending on whether it succeeds
        b. permissions are in UNIX form and should be in 
             octal format e.g., "0644"
    bool chdir(string $path): changes to the indicated directory, returning
	true/false depending on whether it succeeds
    getcwd(): returns current directory path 
arrays numeric arrays ways to create 1) $names = array("Peter","Quagmire","Joe"); 2) $names[0] = "Peter"; $names[1] = "Quagmire"; 3) $names[] = "Peter"; $names[] = "Quagmire"; --array[] = value: appends value to the array 4) $names = [ "Peter", "Quagmire", "Joe" ]; --since version 5.4 associative arrays ways to create 1) $ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34); 2) $ages['Peter'] = "32"; $ages['Quagmire'] = 30; multi-dimensional arrays ways to create 1) $families = array("Griffin"=>array("Peter","Lois","Megan"), "Quagmire"=>array("Glenn","Joe"), "Seuss"=>array("Mary","Nicole","Sue","Frank")); access: $families['Griffin'][0]; useful functions print_r($array): prints the elements of the array in a nice format count($array): number of elements in the array array_key_exists(): Checks if the specified key exists in the array in_array($value, $array): Checks if the designated value is in the array, regardless of whether it is a numeric array or an associative array array_push: Inserts one or more elements to the end of an array e.g., array_push($a, 10, 20, 30); array_shift(): Removes the first element from an array and returns the value of the removed element (not the key) array_unshift: Inserts one or more elements at the front of the array e.g., $a[0] = 10; array_unshift($a, 1, 2, 3); print_r($a); output: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 10 ) The following 3 sort methods use built-in comparison functions that work for either numbers or strings sort($array,[sorttype]), rsort($array,[sorttype]): sorts an indexed array based on element value in ascending/descending order --sorttype is optional and may be either the constant SORT_NUMERIC or --sort is done in place SORT_STRING asort($array,[sorttype]), arsort($array,[sorttype]): sorts an associative array based on element value in ascending/descending order. --sort is done in place. --sorttype is optional and may be either the constant SORT_NUMERIC or SORT_STRING ksort($array,[sorttype]), krsort($array,[sorttype]): sorts an associative array based on key value in ascending/descending order. --sorttype is optional and may be either the constant SORT_NUMERIC or SORT_STRING --sort is done in place. The following 3 sort methods allow the user to provide a comparison function that takes two values, a and b, as parameters and returns -1, 0, or 1 depending on whether a &lt; b, a == b, or a &gt; b. usort, uasort, uksort(array, comparisonFunction) Loops while, for, and do..while are same as C foreach($array as $value): assigns each element of a numeric array or each key of an associative array to $value foreach($array as $key=>$value): binds each value in an associative array to its key. The key and value are assigned to $key and $value Regular Expressions preg_match("/perl pattern/", $string, $array): returns true if the given pattern matches any subexpression in the string --first entry in $array is the full match --remaining entries contain matches for the parenthesized expressions Example: preg_match("/\b(\d{1,2})\/\d{1,2}\/(\d{4})\b/", "brad 2/3/1964 42", $matches); $matches = (2/3/1964, 2, 1964) preg_match_all("/perl pattern/", $string, $array): Searches string for all matches to the given pattern and puts them in $array. --returns the number of matches found --first entry in $array is an array of all matches --remaining entries in $array are arrays containing matches for the first, second, third, etc. parenthesized expressions. Example: preg_match_all("/\b(\d{1,2})\/\d{1,2}\/(\d{4})\b/", "1/3/1964 2/3/1964 9/8/1965 10/28/1930", $matches); $matches Array ( [0] => Array ( [0] => 1/3/1964 [1] => 2/3/1964 [2] => 9/8/1965 [3] => 10/28/1930 ) [1] => Array ( [0] => 1 [1] => 2 [2] => 9 [3] => 10 ) [2] => Array ( [0] => 1964 [1] => 1964 [2] => 1965 [3] => 1930 ) ) preg_replace($pattern, $replacement, $string, $limit): replaces with $replacement all subexpressions in $string that match $pattern --if limit is specified then the number of replaced subexpressions is limited to the value of limit --$string can be an array of strings in which case all strings in $string are searched and replaced --$pattern and $replacement can also be arrays in which case the pattern at $pattern[i] is replaced with $replacement[i] Example: $pattern = "/\b(\d{1,2})\/(\d{1,2})\/\d{2}(\d{2})\b/"; $replace = "$1/$2/$3"; $s = preg_replace($pattern, $replace, "brad 2/3/1964 42"); print($s)."\n"; Result: brad 2/3/64 42 --$0 contains the entire matched pattern --note the lack of delimiters for the replacement pattern Retrieving Form Data $_POST and $_GET contain keyword/value pairs for post and get methods $_REQUEST contains contents of $_GET, $_POST, and $_COOKIE Functions for Validating Form Data empty($var): returns true if variable is 0 or an empty string--useful for checking that text boxes haven't been left blank isset($var): returns true if variable has a value, including 0 or an empty string--useful for checking to ensure that the user entered a value for a form element. Unfortunately, isset will always return true for textboxes. You need to check whether it works with other form elements. It does work with radio buttons and checkboxes. e.g., isset($_POST['age']) is_numeric($var): returns true if variable is numeric or can be converted to a number. If the value is a string then the entire string must be a number for is_numeric to return true. For example, is_numeric('10cubs') returns false. CGI stuff id attribute: The ID attribute is used to explicitly associate the specific Input tag with a specific LABEL tag. ID attributes are unique within a page. --see ~bvanderz/webhome/cgi-bin/upload.html for an example label element: Used to provide a label for an input element in the browser Note the following things about the upload.html file: 1) The enctype attribute of the <form> tag specifies which content-type to use when submitting the form. "multipart/form-data" is used when a form requires binary data, like the contents of a file, to be uploaded 2) The type="file" attribute of the <input> tag specifies that the input should be uploaded as a file. When viewed in a browser, there will be a browse-button next to the input field Uploading a File: The $_FILES array is an associative array. --Each entry corresponds to the name of an input tag in the submitted form. --Each entry contains an associative array that has five keys: name: the name of the uploaded file type: the type of the uploaded file size: the size in bytes of the uploaded file tmp_name: the name of the temporary copy of the file stored on the server error: the error code resulting from the file upload
bool move_uploaded_file ( string $filename , string $destination ) 
   --checks to ensure that filename is a valid uploaded file (i.e., uploaded
	via PHP's POST upload mechanism). This check is important to make
	sure that no spoofing can occur.
   --moves filename to destination if the file is valid
   --this command will fail on our server because of the danger of 
     uploading a trojan horse file.