sql >> Base de Datos >  >> RDS >> Mysql

Ejecutar PDO con una matriz que contiene valores nulos

Considere usar bindValue en lugar de pasar la matriz para ejecutar. Como dice aquí :

Debería ser posible hacer esto bastante transparente para el resto de su aplicación, ya que ya tiene los valores que desea ACTUALIZAR como una matriz. Prueba, p. algo como esto:

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

Como notó que usar bindParam le dio dolores de cabeza en el pasado, tenga en cuenta la sutil diferencia entre valor de enlace y bindParam . Personalmente, nunca uso bindParam debido a los efectos secundarios que dificultan la comprensión de los scripts, aunque, por supuesto, hay casos en los que estos efectos serán útiles.

EDITAR:por supuesto, podría simplificar la función aún más y deshacerse de la necesidad de especificar el tipo como clave adicional en la matriz pasada haciendo algo como:

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

y determine el tipo según el tipo del valor pasado en la matriz; sin embargo, eso es más propenso a errores, ya que p. los flotantes también son numéricos y eso conduciría a una decisión incorrecta en la instrucción de cambio anterior, pero pensé en mencionarlo para completarlo.