Моля, помислете за използването на 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 и 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;
}
и определяне на типа въз основа на типа на стойността, предадена в масива; това обаче е по-податливо на грешки, тъй като напр. float също са числови и това би довело до грешно решение в горния оператор switch, но реших да го спомена за пълнота.