Hi I am hoping someone can help me figure out why this script is not wokring .... its been driving me crazy

This code is to update an existing record in the datbase.

When I run it I get the following error ... i also echoed the SQL statement being passed (the column names are correct) - in this particular example I was trying to update only the 4 fields listed

Array
(
[0] =>
[1] =>
[2] =>
)

UPDATE `investigations` SET `site` = ?, `revenue_potential` = ?, `revenue_billed` = ?, `revenue_claimed` = ? WHERE `investigation_id` = ?


here is my code that is causing the problem ....
I have also included th ecode that works (which only updates data from one array vs. the two that I need)
hope someone can point me in the rigth direction

PHP Code:
<?php
//Connect to the database
$dbh = new PDO('mysql:host=localhost;dbname=testdb''root''');
//Set the default fetch mode to be an associative array.
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,  PDO::FETCH_ASSOC);

//Define the fields 
$fields = array(
    
'site'=>'Site',
    
'tour'=>'Tour',
    
'customer'=>'Customer',
    
'date_started'=>'Date Started',
    
'date_closed'=>'Date Closed',
    
'investigated_by'=>'Investigated By'
);

$dropfields = array(
    
'revenue_potential'=>'RP',
    
'revenue_billed'=>'RB',
    
'revenue_claimed'=>'RC'
);



/* Using $_REQUEST as a shortcut - when we first access
the page, the contact_id will be in the URL/$_GET array.
When we submit the form it will then be in $_POST. */
if(isset($_REQUEST['investigation_id'])){
    
$fields_str '`investigation_id`, `'.implode(array_merge(array_keys($fields), array_keys($dropfields)), '`, `').'`';
    
$sql "SELECT {$fields_str} FROM `investigations` WHERE investigation_id = ?";
    
$stmt $dbh->prepare($sql);
    
$stmt->execute(array($_REQUEST['investigation_id']));
    
$values $stmt->fetch();
    if(!
$values){
        
$error 'Invalid ID provided';
    }
}else{
    
$error 'No ID provided';
}


//If the form has been submitted, validate it.
if(isset($_POST['submit'])){
    
    
//We require the contact ID be submitted.
    
if(isset($_POST['investigation_id'])){
        
        
//Create an array to hold the values we want to update.
        
$update_values = array();
        
$update_values2 = array();

        
//For each of the fields we want, check if the field was posted, and if so compare it to the previous value
        
foreach($fields AS $field=>$label){
            if(isset(
$_POST[$field])){
                
//trim the whitepace
                
$value trim($_POST[$field]);
                
//If it's different than what we had stored before, update it.
                
if($value != $values[$field]){
                    
//Add it to the array of values to update
                    
$update_values[$field] = $value;
                    
//Add the value to the values array, so it will show up in the form as well.
                    
$values[$field] = $value;
                }
            }
        }
        
        
        foreach(
$dropfields AS $dropfield=>$droplabel){
            if(isset(
$_POST[$dropfield])){
                
//trim the whitepace
                
$dropvalue trim($_POST[$dropfield]);
                
//If it's different than what we had stored before, update it.
                
if($dropvalue != $dropvalues[$dropfield]){
                    
//Add it to the array of values to update
                    
$update_values2[$dropfield] = $dropvalue;
                    
//Add the value to the values array, so it will show up in the form as well.
                    
$dropvalues[$dropfield] = $dropvalue;
                }
            }
        }
        
        
        
        
$errors = array();
        
/*
        First and Last Names are required. strlen will return the string's length
        Since this time we are UPDATING, we only need to check if the strlen is > 0
        if the field has actually changed. Compare this code carefully to the add code,
        now we are checking if the field was sent AND doesn't have a length.
        */
        
if(isset($update_values['site']) && !strlen($update_values['site'])){
            
$errors['site'] = 'Please Enter a Site';
        }
        if(isset(
$update_values['customer']) && !strlen($update_values['customer'])){
            
$errors['customer'] = 'Please Enter a Customer';
        }
        
        
//If there are not and there are fields to update, update the data.
        
if(!count($errors) && (count($update_values) || count($update_values2))){
            
$sql "UPDATE `investigations` SET ";
            foreach(
array_keys($update_values) AS $field){
                
$sql .= "`{$field}` = ?, ";
            }
            foreach(
array_keys($update_values2) AS $dropfield){
                
$sql .= "`{$dropfield}` = ?, ";
            }
            
//Trim the trailing comma.
            
$sql trim($sql', ');
            
//Add the WHERE clause
            
$sql .= ' WHERE `investigation_id` = ?';
            
            
//Prepare the statement
            
$stmt $dbh->prepare($sql);
            
            
/* The values to put in the prepared statement will be the update values, with the contact ID at the end.
            array_values() will pull just the array's values, without the string keys. 
            The positional placeholder requires a numeric key. */
            
$update_values array_values($update_values);
            
$update_values[] = $values['investigation_id'];
            
            
$update_values2 array_values($update_values2);
            
$update_values2[] = $dropvalues['investigation_id'];
            
            
$result $stmt->execute($update_values$update_values2);
        }
    }else{
        
$error 'No ID provided';
    }
}
?>


<style>
label{
    display: block;
    margin: 5px 0;
}

.error{
    font-weight: bold;
    color: #BB0000;
}
</style>

<?php

//If there was an error, display it. Otherwise display the form.
if(isset($error) && $error){
    echo 
$error;
}else{
    
//If the form was submitted and an UPDATE was attempted, display a message.
    
if(isset($result)){
        if(
$result){
            echo 
'<b>Successfully Updated!</b>';
        }else{
            echo 
'<b>Unable to Update</b>';
            print 
'<pre>'.print_r($stmt->errorInfo(), true);
            echo 
$sql;
        }
    }
    
    require_once(
'menu.php');
    
?>
    
    <h1>Update Contact</h1>
    <form method="post" action="edit.php">
        <?php
        
foreach($fields AS $field=>$label){
            
//Print the form element for the field.
            
echo "<label>{$label}:<br>";
            
//If the field had an error, display it.
            
if(isset($errors[$field])){
                echo 
' <span class="error">'.$errors[$field].'</span><br>';
            }
            
//Echo the actual input. If the form is being displayed with errors, we'll have a value to fill in from the user's previous submission.
            
echo '<input type="text" name="'.$field.'"';
            if(isset(
$values[$field])){
                echo 
' value="'.$values[$field].'"';
            }
            echo 
'/></label>';
        }
        
        
        
        foreach(
$dropfields AS $dropfield=>$droplabel){
            
//Print the form element for the field.
            
echo "<label>{$droplabel}:<br>";

            
//Echo the actual input. If the form is being displayed with errors, we'll have a value to fill in from the user's previous submission.
            
echo '<input type="text" name="'.$dropfield.'"';
            if(isset(
$dropvalues[$dropfield])){
                echo 
' value="'.$dropvalues[$dropfield].'"';
            }
            echo 
'/></label>';
        }
        
        
        
        
//Add the hidden input for the investigation id.
        
echo '<input type="hidden" name="investigation_id" value="'.$values['investigation_id'].'" />';
        
?>
        <input type="submit" name="submit" value="Edit" />
    </form>
<?php
}
?>


When I use the same code but only update data from one array it works no problem ...
This is the code that works (again, not updateding all the fields I need - it does not include data from the $dropfields array.... which is what I need)


PHP Code:
<?php
//Connect to the database
$dbh = new PDO('mysql:host=localhost;dbname=testdb''root''');
//Set the default fetch mode to be an associative array.
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,  PDO::FETCH_ASSOC);

//Define the fields for our CRUD application
$fields = array(
    
'site'=>'Site',
    
'tour'=>'Tour',
    
'customer'=>'Customer',
    
'date_started'=>'Date Started',
    
'date_closed'=>'Date Closed',
    
'investigated_by'=>'Investigated By'
);

$dropfields = array(
    
'revenue_potential'=>'RP',
    
'revenue_billed'=>'RB',
    
'revenue_claimed'=>'RC'
);


/* Using $_REQUEST as a shortcut - when we first access
the page, the contact_id will be in the URL/$_GET array.
When we submit the form it will then be in $_POST. */
if(isset($_REQUEST['investigation_id'])){
    
$fields_str '`investigation_id`, `'.implode(array_keys($fields), '`, `').'`';
    
$sql "SELECT {$fields_str} FROM `investigations` WHERE investigation_id = ?";
    
$stmt $dbh->prepare($sql);
    
$stmt->execute(array($_REQUEST['investigation_id']));
    
$values $stmt->fetch();
    if(!
$values){
        
$error 'Invalid ID provided';
    }
}else{
    
$error 'No ID provided';
}


//If the form has been submitted, validate it.
if(isset($_POST['submit'])){
    
    
//We require the contact ID be submitted.
    
if(isset($_POST['investigation_id'])){
        
        
//Create an array to hold the values we want to update.
        
$update_values = array();
        
        
//For each of the fields we want, check if the field was posted, and if so compare it to the previous value
        
foreach($fields AS $field=>$label){
            if(isset(
$_POST[$field])){
                
//trim the whitepace
                
$value trim($_POST[$field]);
                
//If it's different than what we had stored before, update it.
                
if($value != $values[$field]){
                    
//Add it to the array of values to update
                    
$update_values[$field] = $value;
                    
//Add the value to the values array, so it will show up in the form as well.
                    
$values[$field] = $value;
                }
            }
        }
        
        
$errors = array();
        
/*
        First and Last Names are required. strlen will return the string's length
        Since this time we are UPDATING, we only need to check if the strlen is > 0
        if the field has actually changed. Compare this code carefully to the add code,
        now we are checking if the field was sent AND doesn't have a length.
        */
        
if(isset($update_values['site']) && !strlen($update_values['site'])){
            
$errors['site'] = 'Please Enter a Site';
        }
        if(isset(
$update_values['customer']) && !strlen($update_values['customer'])){
            
$errors['customer'] = 'Please Enter a Customer';
        }
        
        
//If there are not and there are fields to update, update the data.
        
if(!count($errors) && count($update_values)){
            
$sql "UPDATE `investigations` SET ";
            foreach(
array_keys($update_values) AS $field){
                
$sql .= "`{$field}` = ?, ";
            }
            
//Trim the trailing comma.
            
$sql trim($sql', ');
            
//Add the WHERE clause
            
$sql .= ' WHERE `investigation_id` = ?';
            
            
//Prepare the statement
            
$stmt $dbh->prepare($sql);
            
            
/* The values to put in the prepared statement will be the update values, with the contact ID at the end.
            array_values() will pull just the array's values, without the string keys. 
            The positional placeholder requires a numeric key. */
            
$update_values array_values($update_values);
            
$update_values[] = $values['investigation_id'];
            
            
$result $stmt->execute($update_values);
        }
    }else{
        
$error 'No ID provided';
    }
}
?>


<style>
label{
    display: block;
    margin: 5px 0;
}

.error{
    font-weight: bold;
    color: #BB0000;
}
</style>

<?php

//If there was an error, display it. Otherwise display the form.
if(isset($error) && $error){
    echo 
$error;
}else{
    
//If the form was submitted and an UPDATE was attempted, display a message.
    
if(isset($result)){
        if(
$result){
            echo 
'<b>Successfully Updated!</b>';
            echo 
$sql;
        }else{
            echo 
'<b>Unable to Update</b>';
            print 
'<pre>'.print_r($stmt->errorInfo(), true);
        }
    }
    
    require_once(
'menu.php');
    
?>
    
    <h1>Update Contact</h1>
    <form method="post" action="edit.php">
        <?php
        
foreach($fields AS $field=>$label){
            
//Print the form element for the field.
            
echo "<label>{$label}:<br>";
            
//If the field had an error, display it.
            
if(isset($errors[$field])){
                echo 
' <span class="error">'.$errors[$field].'</span><br>';
            }
            
//Echo the actual input. If the form is being displayed with errors, we'll have a value to fill in from the user's previous submission.
            
echo '<input type="text" name="'.$field.'"';
            if(isset(
$values[$field])){
                echo 
' value="'.$values[$field].'"';
            }
            echo 
'/></label>';
        }
        
//Add the hidden input for the contact id.
        
echo '<input type="hidden" name="investigation_id" value="'.$values['investigation_id'].'" />';
        
?>
        <input type="submit" name="submit" value="Edit" />
    </form>
<?php
}
?>
Any suggestions are greatly appritiated
Thanks