Mysql
 sql >> Base de données >  >> RDS >> Mysql

Exécuter PDO avec un tableau contenant des valeurs nulles

Veuillez envisager d'utiliser bindValue au lieu de transmettre le tableau à exécuter. Comme il est dit ici :

Il devrait être possible de rendre cela assez transparent pour le reste de votre application, puisque vous avez déjà les valeurs que vous souhaitez mettre à jour sous forme de tableau. Essayez par ex. quelque chose comme ça :

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

Comme vous avez noté que l'utilisation de bindParam vous donnait des maux de tête dans le passé, veuillez être conscient de la différence subtile entre bindValue et bindParam . Personnellement, je n'utilise jamais bindParam à cause d'effets secondaires qui rendent plus difficile la compréhension des scripts, bien qu'il y ait bien sûr des cas où ces effets seront utiles.

EDIT :Vous pouvez bien sûr simplifier encore plus la fonction et vous débarrasser de la nécessité de spécifier le type en tant que clé supplémentaire dans le tableau passé en faisant quelque chose comme :

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

et déterminer le type en fonction du type de la valeur passée dans le tableau ; cependant, c'est plus sujet aux erreurs, car par ex. les flottants sont également numériques et cela conduirait à une mauvaise décision dans l'instruction switch ci-dessus, mais j'ai pensé que je le mentionnerais par souci d'exhaustivité.