C.11 Chapter 12
C.11.1 Exercise 1:
The
error message looks like: 
Parse error: parse error, unexpected T_GLOBAL in exercise-12-1.php on line 6  
The global declaration has to be on a line by
itself, not inside the print statement. To fix the
program, separate the two: 
<?php
$name = 'Umberto';
function say_hello( ) {
    global $name;
    print 'Hello, ';
    print $name;
}
say_hello( );
?> 
C.11.2 Exercise 2:
function validate_form( ) {
    $errors = array( );
    // Capture the output of var_dump( ) with output buffering
    ob_start( );
    var_dump($_POST);
    $vars = ob_get_contents( );
    ob_end_clean( );
    // Send the output to the error log
    error_log($vars);
    // operand 1 must be numeric
    if (! strlen($_POST['operand_1'])) {
        $errors[  ] = 'Enter a number for the first operand.';
    } elseif (! floatval($_POST['operand_1']) =  = $_POST['operand_1']) {
        $errors[  ] = "The first operand must be numeric.";
    }
    // operand 2 must be numeric
    if (! strlen($_POST['operand_2'])) {
        $errors[  ] = 'Enter a number for the second operand.';
    } elseif (! floatval($_POST['operand_2']) =  = $_POST['operand_2']) {
        $errors[  ] = "The second operand must be numeric.";
    }
    // the operator must be valid
    if (! in_array($_POST['operator'], $GLOBALS['ops'])) {
        $errors[  ] = "Please select a valid operator.";
    }
    return $errors;
} 
C.11.3 Exercise 3:
Change the beginning of the program to: 
<?php
require 'DB.php';
require 'formhelpers.php';
// Connect to the database
$db = DB::connect('mysql://hunter:w)mp3s@db.example.com/restaurant');
if (DB::isError($db)) { die ("Can't connect: " . $db->getMessage( )); }
function db_error_handler($error) {
    error_log('DATABASE ERROR: ' . $error->getDebugInfo( ));
    die('There is a ' . $error->getMessage( ));
}
// Set up automatic error handling
$db->setErrorHandling(PEAR_ERROR_CALLBACK,'db_error_handler'); 
C.11.4 Exercise 4:
Here are the errors in the program: 
Line 5: Two colons are needed between DB and
connect. Lines 9 and 10: The fetch mode should be set to
DB_FETCHMODE_ASSOC since rows are treated as
arrays in the rest of the program. (Alternatively, you could change
lines 15 and 25-28 so that they treat rows as objects.) Line 15: There is an extra closing square bracket after
$row['dish_id']. Line 17: This should be a call to $db->query(
), not $db->getAll( ), because
fetchRow( ) is used in line 23 to retrieve each
row. The SQL query is also wrong: it should be SELECT * FROM
customers ORDER BY customer_name (only one asterisk after
SELECT and customer_name, not
phone DESC, after ORDER BY). Line 18: The method name that returns the number of rows retrieved by
query( ) is numRows( ), not
num_rows( ). Line 22: The string has mismatched delimiters. Either change the
opening quote to a double quote or the closing quote to a single
quote. Line 26: The array key is misspelled. It should be
customer_name, not
cutsomer_name. Line 28: $customer['favorite_dish_id'] is the
integer ID of the favorite dish. To display the dish name, you need
to look up the appropriate element in $dish_names.
Instead of $customer['favorite_dish_id'], it
should be $dish_names[ $customer['favorite_dish_id']
]. Line 31: The curly brace to end the else code
block is missing.  
Here is the complete corrected program: 
<?php
require 'DB.php';
require 'formhelpers.php';
// Connect to the database
$db = DB::connect('mysql://hunter:w)mp3s@db.example.com/restaurant');
if (DB::isError($db)) { die ("Can't connect: " . $db->getMessage( )); }
// Set up automatic error handling
$db->setErrorHandling(PEAR_ERROR_DIE);
// Set up fetch mode: rows as associative arrays
$db->setFetchMode(DB_FETCHMODE_ASSOC);
// get the array of dish names from the database
$dish_names = array( );
$res = $db->query('SELECT dish_id,dish_name FROM dishes');
while ($row = $res->fetchRow( )) {
    $dish_names[ $row['dish_id'] ] = $row['dish_name'];
}
$customers = $db->query('SELECT * FROM customers ORDER BY customer_name');
if ($customers->numRows( ) =  = 0) {
    print "No customers.";
} else {
    print '<table>';
    print '<tr><th>ID</th><th>Name</th><th>Phone</th><th>Favorite Dish</th></tr>';
    while ($customer = $customers->fetchRow( )) {
        printf('<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td></tr>',
               $customer['customer_id'],
               htmlentities($customer['customer_name']),
               $customer['phone'],
               $dish_names [ $customer['favorite_dish_id'] ]);
    }
    print '</table>';
}
?> 
 |