Mysql
 sql >> Database >  >> RDS >> Mysql

Esegui PDO con un array contenente valori null

Si prega di considerare l'utilizzo di bindValue invece di passare l'array da eseguire. Come si dice qui :

Dovrebbe essere possibile renderlo abbastanza trasparente per il resto dell'applicazione, poiché hai già i valori che desideri AGGIORNARE come array. Prova ad es. qualcosa del genere:

<?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);
?>

Poiché hai notato che l'utilizzo di bindParam in passato ti ha dato mal di testa, tieni presente la sottile differenza tra bindValore e bindParam . Personalmente, non uso mai bindParam a causa degli effetti collaterali che rendono più difficile la comprensione degli script, anche se ovviamente ci sono casi in cui questi effetti torneranno utili.

EDIT:ovviamente potresti semplificare ulteriormente la funzione ed eliminare la necessità di specificare il tipo come chiave aggiuntiva nell'array passato facendo qualcosa del tipo:

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

e determinare il tipo in base al tipo del valore passato nell'array; tuttavia, è più soggetto a errori, poiché ad es. anche i float sono numerici e ciò porterebbe a una decisione sbagliata nell'istruzione switch sopra, ma ho pensato di menzionarlo per completezza.