Cuando construya la cadena SQL (creo que prepare_update_string), así como en ambos bucles foreach donde vincula datos, ejecute un conteo incremental y agréguelo al valor de vinculación. Entonces ":estado" se convierte en ":estado1".
Algo como:
$i = 1;
foreach ($data as $k => $v) {
$this->_sth->bindValue(":{$k.$i}", $v);
$i++;
}
Esto resolverá el problema de las palabras clave reservadas.
También resuelve el problema (que estoy seguro de que encontrará en el futuro) en el que necesita enlazar al mismo marcador de posición más de una vez.
p.ej. en lugar de lo siguiente, que arroja un error debido a dos enlaces en el :marcador de posición de estado
SELECT * from table WHERE `status` = :status AND `otherfield` = :status
Con un conteo incremental, esto se convierte en:
SELECT * from table WHERE `status` = :status1 AND `otherfield` = :status2
Disfruta.