Por favor, considere usar bindValue em vez de passar o array para executar. Como diz aqui :
Deve ser possível tornar isso bastante transparente para o resto do seu aplicativo, já que você já tem os valores que deseja ATUALIZAR como um array. Tente, por exemplo algo assim:
<?php
function executeWithDataTypes(PDOStatement $sth, array $values) {
$count = 1;
foreach($values as $value) {
$sth->bindValue($count, $values['value'], $values['type']);
$count++;
}
return $sth->execute();
}
$sth = $handle->prepare("UPDATE table SET name = ?, id_extra1 = ?, id_extra2 = ? WHERE id_something = ?");
$values = array();
$values[] = array('value' => 'testing', 'type' => PDO::PARAM_STR);
$values[] = array('value' => 2, 'type' => PDO::PARAM_INT);
$values[] = array('value' => null, 'type' => PDO::PARAM_NULL);
$values[] = array('value' => 1958, 'type' => PDO::PARAM_INT);
$result = executeWithDataTypes($sth, $values);
?>
Como você notou que o uso de bindParam lhe deu dores de cabeça no passado, esteja ciente da sutil diferença entre bindValue e bindParam . Pessoalmente, eu nunca uso bindParam por causa dos efeitos colaterais que dificultam a compreensão dos scripts, embora haja casos, é claro, em que esses efeitos serão úteis.
EDIT:Você pode simplificar ainda mais a função e se livrar da necessidade de especificar o tipo como chave adicional na matriz passada, fazendo algo como:
$type = PDO::PARAM_STR;
switch(true) {
case is_null($value): $type = PDO::PARAM_NULL; break;
case is_numeric($value): $type = PDO::PARAM_INT; break;
// ...
default: break;
}
e determine o tipo baseado no tipo do valor passado no array; no entanto, isso é mais propenso a erros, pois, por exemplo, floats também são numéricos e isso levaria a uma decisão errada na instrução switch acima, mas pensei em mencioná-lo por uma questão de integridade.