実行する配列を渡す代わりに、bindValue の使用を検討してください。ここで言うように:
すべての値は PDO::PARAM_STR として扱われます。
UPDATE したい値を配列としてすでに持っているので、アプリケーションの残りの部分に対してこれをかなり透過的にすることができるはずです。たとえば、次のようなものを試してください。
<?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);
?>
過去に bindParam を使用すると頭痛の種だったと指摘したように、bindValueとbindParamの微妙な違いに注意してください。個人的には、スクリプトの理解を難しくする副作用があるため、bindParam を使用することはありませんが、もちろんこれらの効果が役立つ場合もあります。
編集:もちろん、次のようなことを行うことで、関数をさらに単純化し、渡された配列の追加のキーとして型を指定する必要をなくすことができます。
$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;
}
配列に渡された値の型に基づいて型を決定します。ただし、フロートも数値であり、上記のswitchステートメントで間違った決定につながるため、エラーが発生しやすくなりますが、完全を期すために言及したいと思いました。