PDO connection / prep and execute in their own functions
Here are a few things I noticed.


If you are going to catch a possible exception when you connect to your MySQL DB you want to include the PDO instantiation in the try block.

try {  
    $db = new PDO('mysql:host=' . $config['db']['host'] . ';dbname=' . $config['db'}['dbname'], $config['db']['username'], $config['db']['password']);
    $db-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db-&gt;exec("SET CHARACTER SET utf8");
}  catch(PDOException $e) {  
    print "Error!: " . $ex-&gt;getMessage() . "&lt;br/&gt;";
    die(); 
}

The arguments $vlue and $response don't do anything in your update function. You probably want to get rid of those.
You can use a quicker syntax for binding parameters by defining an array that holds the values and passing it to PDOStatement::execute(). This has the benefit of less function calls. Doing it this way will default all parameter value datatypes to be PDO::PARAM_STR, which matches what you are doing currently.

$parameters = array(
    ':fname'  =&gt; $fn,
    ':lname'  =&gt; $ln,
    ':email'  =&gt; $email,
    ':signup' =&gt; $offers
);
$stmt-&gt;execute($parameters);

The point of exceptions is to be able to handle, on your own terms, exceptional events. If a PDO exception occurs in your update function, more than likely it won't/shouldn't know how to handle it. It makes more sense for the code that calls update to take care of that situation. So I would suggest moving the try/catch block to wherever the update function is called.

   try {
       update($db, $fn, $ln, $email, $offers, $vlue, $response)
   } catch (PDOException $e) {
       echo "no update there is a slight problem " . $e-&gt;getMessage();
   }