sql >> Databáze >  >> RDS >> Mysql

Spusťte PDO s polem obsahujícím hodnoty null

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.



  1. Jak vytvořit tabulku pomocí GUI v SQL Server - SQL Server / Výukový program T-SQL, část 37

  2. Co se stane s nepotvrzenou transakcí, když je spojení uzavřeno?

  3. Chyba syntaxe SQL při vytváření uložené procedury v MySQL

  4. klauzule WHERE před INNER JOIN