Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Execute o PDO com um array contendo valores nulos


Por favor, considere usar bindValue em vez de passar o array para executar. Como diz aqui :

Deve ser possível tornar isso bastante transparente para o resto do seu aplicativo, já que você já tem os valores que deseja ATUALIZAR como um array. Tente, por exemplo algo assim:
<?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 você notou que o uso de bindParam lhe deu dores de cabeça no passado, esteja ciente da sutil diferença entre bindValue e bindParam . Pessoalmente, eu nunca uso bindParam por causa dos efeitos colaterais que dificultam a compreensão dos scripts, embora haja casos, é claro, em que esses efeitos serão úteis.

EDIT:Você pode simplificar ainda mais a função e se livrar da necessidade de especificar o tipo como chave adicional na matriz passada, fazendo 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;
}

e determine o tipo baseado no tipo do valor passado no array; no entanto, isso é mais propenso a erros, pois, por exemplo, floats também são numéricos e isso levaria a uma decisão errada na instrução switch acima, mas pensei em mencioná-lo por uma questão de integridade.