Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wykonaj PDO z tablicą zawierającą wartości null

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ść.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zwróć domyślny wynik dla wartości IN niezależnie od

  2. Połącz się ze zdalną bazą danych MySQL za pomocą Pythona

  3. jak pobrać dane z dwóch tabel w mysql?

  4. Wyślij e-mail z wyzwalacza MySQL po aktualizacji tabeli

  5. Jak używać DELETE ON CASCADE w relacji wiele do jednego?