Zvažte prosím použití bindValue místo předávání pole ke spuštění. Jak se píše zde :
Mělo by být možné, aby to bylo docela transparentní pro zbytek vaší aplikace, protože již máte hodnoty, které chcete AKTUALIZOVAT jako pole. Zkuste např. něco takového:
<?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 jste si všimli, že používání bindParam vám v minulosti způsobovalo bolesti hlavy, uvědomte si prosím jemný rozdíl mezi bindValue a bindParam . Osobně bindParam nikdy nepoužívám kvůli vedlejším efektům, které znesnadňují porozumění skriptům, i když samozřejmě existují případy, kdy se tyto efekty budou hodit.
EDIT:Funkci byste samozřejmě mohli ještě více zjednodušit a zbavit se potřeby specifikovat typ jako další klíč v předávaném poli tím, že uděláte něco jako:
$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;
}
a určit typ na základě typu hodnoty předávané v poli; to je však náchylnější k chybám, protože např. floats jsou také numerické a to by vedlo k nesprávnému rozhodnutí ve výše uvedeném příkazu switch, ale myslel jsem, že to zmíním pro úplnost.