Vänligen överväg att använda bindValue istället för att skicka den array som ska köras. Som det står här :
Det borde vara möjligt att göra detta ganska transparent för resten av din applikation, eftersom du redan har de värden du vill UPPDATERA som en array. Prova t.ex. något sånt här:
<?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);
?>
Eftersom du noterade att användningen av bindParam gav dig huvudvärk tidigare, var medveten om den subtila skillnaden mellan bindValue och bindParam . Personligen använder jag aldrig bindParam på grund av biverkningar som gör det svårare att förstå skript, även om det naturligtvis finns fall där dessa effekter kommer till användning.
EDIT:Du kan naturligtvis förenkla funktionen ännu mer och bli av med behovet av att specificera typen som ytterligare nyckel i den passerade arrayen genom att göra något i stil med:
$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;
}
och bestämma typen baserat på typen av värdet som skickas i arrayen; det är dock mer felbenäget, eftersom t.ex. flöten är också numeriska och det skulle leda till ett felaktigt beslut i ovanstående switch-sats, men jag tänkte nämna det för fullständighetens skull.