Rozważ użycie wartości bindValue zamiast przekazywania tablicy do wykonania. Jak mówi tutaj :
Powinno być możliwe uczynienie tego całkiem przezroczystym dla reszty aplikacji, ponieważ masz już wartości, które chcesz UPDATE jako tablicę. Spróbuj np. coś takiego:
<?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);
?>
Jak zauważyłeś, że używanie bindParam w przeszłości powodowało bóle głowy, pamiętaj o subtelnej różnicy między bindValue i bindParam . Osobiście nigdy nie używam bindParam z powodu efektów ubocznych, które utrudniają zrozumienie skryptów, chociaż oczywiście są przypadki, w których te efekty mogą się przydać.
EDYCJA:Możesz oczywiście jeszcze bardziej uprościć funkcję i pozbyć się potrzeby określania typu jako dodatkowego klucza w przekazywanej tablicy, wykonując coś takiego:
$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;
}
i określ typ na podstawie typu wartości przekazanej w tablicy; jest to jednak bardziej podatne na błędy, ponieważ m.in. zmiennoprzecinkowe są również numeryczne, co prowadziłoby do błędnej decyzji w powyższym poleceniu switch, ale pomyślałem, że wspomnę o tym ze względu na kompletność.