Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Führen Sie PDO mit einem Array aus, das Nullwerte enthält

Bitte erwägen Sie die Verwendung von binValue, anstatt das Array zur Ausführung zu übergeben. Wie es hier steht :

Es sollte möglich sein, dies für den Rest Ihrer Anwendung ziemlich transparent zu machen, da Sie bereits die Werte haben, die Sie als Array AKTUALISIEREN möchten. Versuchen Sie z. etwa so:

<?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 Sie bemerkt haben, dass Ihnen die Verwendung von bindParam in der Vergangenheit Kopfschmerzen bereitet hat, beachten Sie bitte den feinen Unterschied zwischen bindValue und bindParam . Ich persönlich verwende bindParam nie wegen Nebeneffekten, die das Verständnis von Skripten erschweren, obwohl es natürlich Fälle gibt, in denen diese Effekte nützlich sind.

BEARBEITEN:Sie könnten die Funktion natürlich noch weiter vereinfachen und die Notwendigkeit beseitigen, den Typ als zusätzlichen Schlüssel im übergebenen Array anzugeben, indem Sie Folgendes tun:

$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;
}

und den Typ basierend auf dem Typ des im Array übergebenen Werts zu bestimmen; das ist aber fehleranfälliger, da z.B. Floats sind auch numerisch und das würde zu einer falschen Entscheidung in der obigen switch-Anweisung führen, aber ich dachte, ich erwähne es der Vollständigkeit halber.