使用包含空值的数组执行PDO

chr*_*_so 5 php mysql null pdo

我需要更新数据库,并execute()通过将数组作为参数使用PDO的方法。

这个想法是当我尝试插入一个NULL值时给我一个错误...

这是发送查询/参数的示例:

生成的查询:

UPDATE table SET name=?, id_extra1=?, id_extra2=? WHERE id_something=?
Run Code Online (Sandbox Code Playgroud)

参数数组:

array (size=8)
  'name' => string 'testing' (length=6)
  'id_extra1' => string '2' (length=1)
  'id_extra2' => null
  'id_something' => string '1958' (length=4)
Run Code Online (Sandbox Code Playgroud)

所以NULL值是id_extra2

在代码中,id_extra2我遇到了这样的情况(想法是我有一个ID,或者为0,然后必须使用来更新DB值NULL):

if ($_POST['id_extra2']==0) {
    $_POST['id_extra2'] = null;
}
Run Code Online (Sandbox Code Playgroud)

我试着设置$_POST['id_extra2']到''和NULL和'null',但它仍然没有工作...

任何想法表示赞赏!谢谢!

ste*_*f77 2

请考虑使用bindValue而不是传递数组来执行。正如这里所说:

所有值都被视为 PDO::PARAM_STR。

应该可以使这对应用程序的其余部分非常透明,因为您已经拥有想要以数组形式更新的值。尝试例如这样的事情:

<?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);
?>
Run Code Online (Sandbox Code Playgroud)

正如您指出的那样,使用 bindParam 过去会让您感到头疼,请注意bindValue和bindParam之间的细微差别。就我个人而言,我从不使用bindParam,因为副作用会使脚本变得更难理解,尽管当然在某些情况下这些效果会派上用场。

编辑:您当然可以进一步简化函数,并通过执行以下操作来消除将类型指定为传递数组中的附加键的需要:

$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;
}
Run Code Online (Sandbox Code Playgroud)

并根据数组中传入的值的类型确定类型;然而,这更容易出错,因为例如浮点数也是数字,这会导致上述 switch 语句中的错误决定,但我想为了完整性而提及它。