sql >> Database >  >> RDS >> Mysql

Voer PDO uit met een array die null-waarden bevat

Overweeg om bindValue te gebruiken in plaats van de uit te voeren array door te geven. Zoals het zegt hier :

Het zou mogelijk moeten zijn om dit vrij transparant te maken voor de rest van je applicatie, aangezien je al de waarden hebt die je wilt UPDATEN als een array. Probeer bijv. zoiets als dit:

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

Zoals je hebt opgemerkt dat het gebruik van bindParam je in het verleden hoofdpijn heeft bezorgd, wees je bewust van het subtiele verschil tussen bindValue en bindParam . Persoonlijk gebruik ik bindParam nooit vanwege bijwerkingen die het moeilijker maken om scripts te begrijpen, hoewel er natuurlijk gevallen zijn waarin deze effecten van pas komen.

EDIT:Je zou de functie natuurlijk nog meer kunnen vereenvoudigen en de noodzaak om het type op te geven als extra sleutel in de doorgegeven array wegnemen door iets te doen als:

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

en bepaal het type op basis van het type waarde dat in de array is doorgegeven; dat is echter foutgevoeliger, aangezien b.v. floats zijn ook numeriek en dat zou leiden tot een verkeerde beslissing in de bovenstaande switch-statement, maar ik dacht om het voor de volledigheid te vermelden.



  1. 5 functies om het weeknummer van een datum in MariaDB te extraheren

  2. Orakel:LANG of CLOB?

  3. SQL Server - parameter snuiven

  4. Trek kolommen uit een afgeleide tabel en som ze op in één MySQL SELECT-instructie