実行する配列を渡す代わりに、bindValueの使用を検討してください。 ここ にあるように :
更新する値が配列として既にあるため、これをアプリケーションの他の部分に対してかなり透過的にすることができるはずです。たとえば、試してみてください。このようなもの:
<?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
および
編集:もちろん、関数をさらに単純化し、次のような操作を行うことで、渡された配列の追加キーとして型を指定する必要をなくすことができます。
$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ステートメントで誤った決定につながる可能性がありますが、完全を期すために言及したいと思いました。