Overvej venligst at bruge bindValue i stedet for at sende det array, der skal udføres. Som der står her :
Det burde være muligt at gøre dette ret gennemsigtigt for resten af din applikation, da du allerede har de værdier, du ønsker at OPDATERE, som et array. Prøv f.eks. noget som dette:
<?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);
?>
Da du bemærkede, at brugen af bindParam gav dig hovedpine tidligere, skal du være opmærksom på den subtile forskel mellem bindValue og bindParam . Personligt bruger jeg aldrig bindParam på grund af bivirkninger, som gør det sværere at forstå scripts, selvom der selvfølgelig er tilfælde, hvor disse effekter vil være nyttige.
EDIT:Du kan selvfølgelig forenkle funktionen endnu mere og slippe for behovet for at angive typen som ekstra nøgle i det beståede array ved at gøre noget som:
$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;
}
og bestemme typen baseret på typen af den værdi, der sendes i arrayet; det er dog mere fejlbehæftet, da f.eks. flydere er også numeriske, og det ville føre til en forkert beslutning i ovenstående switch-sætning, men jeg tænkte, at jeg ville nævne det for fuldstændighedens skyld.