< Day Day Up > |
C.9 Chapter 10C.9.1 Exercise 1:Here's a sample template file, article.html: <html> <head><title>{title}</title></head> <body> <h1>{headline}</h1> <h2>By {byline}</h2> {article} <hr/> <h4>Page generated: {date}</h4> </body> </html> Here's the program that replaces the template fields with actual values. It stores the field names and values in an array and then uses foreach( ) to iterate through that array and do the replacement: <?php $page = file_get_contents('article.html'); if ($page = = = false) { die("Can't read article.html: $php_errormsg"); } $vars = array('{title}' => 'Man Bites Dog', '{headline}' => 'Man and Dog Trapped in Biting Fiasco', '{byline}' => 'Ireneo Funes', '{article}' => "<p>While walking in the park today, Bioy Casares took a big juicy bite out of his dog, Santa's Little Helper. When asked why he did it, he said, \"I was hungry.\"</p>", '{date}' => date('l, F j, Y')); foreach ($vars as $field => $new_value) { $page = str_replace($field, $new_value, $page); } $result = file_put_contents('dog-article.html', $page); if (($result = = = false) || ($result = = -1)) { die("Couldn't write dog-article.html: $php_errormsg"); } ?> C.9.2 Exercise 2:Here's a sample addresses.txt: brilling@tweedledee.example.com slithy@unicorn.example.com uffish@knight.example.net slithy@unicorn.example.com jubjub@sheep.example.com tumtum@queen.example.org slithy@unicorn.example.com uffish@knight.example.net manxome@king.example.net beamish@lion.example.org uffish@knight.example.net frumious@tweedledum.example.com tulgey@carpenter.example.com vorpal@crow.example.org beamish@lion.example.org mimsy@walrus.example.com frumious@tweedledum.example.com raths@owl.example.net frumious@tweedledum.example.com Here's the program to count the addresses: <?php $in_fh = fopen('addresses.txt','rb'); if (! $in_fh) { die("Can't open addresses.txt: $php_errormsg"); } // We'll count addresses with this array $addresses = array( ); for ($line = fgets($in_fh); ! feof($in_fh); $line = fgets($in_fh)) { if ($line = = = false) { die("Error reading line: $php_errormsg"); } else { $line = trim($line); // Use the address as the key in $addresses // the value is the number of times that the // address has appeared $addresses[$line] = $addresses[$line] + 1; } } if (! fclose($in_fh)) { die("Can't close addresses.txt: $php_errormsg"); } $out_fh = fopen('addresses-count.txt','wb'); if (! $out_fh) { die("Can't open addresses-count.txt: $php_errormsg"); } // Reverse sort $addresses by element value arsort($addresses); foreach ($addresses as $address => $count) { // Don't forget the newline! if (fwrite($out_fh, "$count,$address\n") = = = false) { die("Can't write $count,$address: $php_errormsg"); } } if (! fclose($out_fh)) { die("Can't close addresses-count.txt: $php_errormsg"); } ?> C.9.3 Exercise 3:<?php $fh = fopen('csvdata.csv', 'rb'); if (! $fh) { die("Can't open csvdata.csv: $php_errormsg"); } print "<table>\n"; for ($line = fgetcsv($fh, 1024); ! feof($fh); $line = fgetcsv($fh, 1024)) { // Use implode as in Example 4.21 print '<tr><td>' . implode('</td><td>', $line) . "</td></tr>\n"; } print '</table>'; ?> C.9.4 Exercise 4:<?php // Load the form element helper functions require 'formhelpers.php'; if ($_POST['_submit_check']) { // If validate_form( ) returns errors, pass them to show_form( ) if ($form_errors = validate_form( )) { show_form($form_errors); } else { // The submitted data is valid, so process it process_form( ); } } else { // The form wasn't submitted, so display show_form( ); } function show_form($errors = '') { if ($errors) { print 'You need to correct the following errors: <ul><li>'; print implode('</li><li>',$errors); print '</li></ul>'; } // the beginning of the form print '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">'; // the file name print' File name: '; input_text('filename', $_POST); print '<br/>'; // the submit button input_submit('submit','Show File'); // the hidden _submit_check variable print '<input type="hidden" name="_submit_check" value="1"/>'; // the end of the form print '</form>'; } function validate_form( ) { $errors = array( ); // filename is required if (! strlen(trim($_POST['filename']))) { $errors[ ] = 'Please enter a file name.'; } else { // build the full file name from the web server document root // directory, a slash, and the submitted value $filename = $_SERVER['DOCUMENT_ROOT'] . '/' . $_POST['filename']; // Use realpath to resolve any .. sequences $filename = realpath($filename); // make sure $filename begins with the document root directory $docroot_len = strlen($_SERVER['DOCUMENT_ROOT']); if (substr($filename, 0, $docroot_len) != $_SERVER['DOCUMENT_ROOT']) { $errors[ ] = 'File name must be under the document root directory.'; } } return $errors; } function process_form( ) { // reconstitute the full file name, as in validate_form( ) $filename = $_SERVER['DOCUMENT_ROOT'] . '/' . $_POST['filename']; $filename = realpath($filename); // print the contents of the file print file_get_contents($filename); } ?> C.9.5 Exercise 5:The new validate_form( ) function that implements the additional rule: function validate_form( ) { $errors = array( ); // filename is required if (! strlen(trim($_POST['filename']))) { $errors[ ] = 'Please enter a file name.'; } else { // build the full file name from the web server document root // directory, a slash, and the submitted value $filename = $_SERVER['DOCUMENT_ROOT'] . '/' . $_POST['filename']; // Use realpath to resolve any .. sequences $filename = realpath($filename); // make sure $filename begins with the document root directory $docroot_len = strlen($_SERVER['DOCUMENT_ROOT']); if (substr($filename, 0, $docroot_len) != $_SERVER['DOCUMENT_ROOT']) { $errors[ ] = 'File name must be under the document root directory.'; } elseif (strcasecmp(substr($filename, -5), '.html') != 0) { $errors[ ] = 'File name must end in .html'; } } return $errors; } |
< Day Day Up > |