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

标签 php mysql pdo null

<分区>

我需要更新一个数据库,我通过给它一个数组作为参数来使用 PDO 的 execute() 方法。

我的想法是,当我尝试插入一个 NULL 值时它会给我一个错误...

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

生成的查询:

UPDATE table SET name=?, id_extra1=?, id_extra2=? WHERE id_something=?

参数数组:

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

所以 NULL 值是 id_extra2

id_extra2 的代码中,我有这样的条件 (想法是我有一个 ID 或 0,然后我必须用 NULL 更新 DB 值):

if ($_POST['id_extra2']==0) {
    $_POST['id_extra2'] = null;
}

我尝试将 $_POST['id_extra2'] 设置为 ''NULL 以及 'null' 但它仍然无法正常工作。

最佳答案

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

All values are treated as 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);
?>

正如您指出的那样,过去使用 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;
}

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

关于php - 使用包含空值的数组执行 PDO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17723839/

相关文章:

mysql - INSERT INTO SELECT WHERE,检查重复条目

php - SQL/PHP : Calling unique ID

php - 如何实现mongo集合和mysql表之间的连接

php - mysql , PDO 和 php 多选搜索

java - 从java程序执行php

PHP 邮件显示错误 "unexpected_data_after_address@.syntax-error"

mysql - 使用内连接SQL语句时未定义索引

javascript - 通过 $post 在 jquery 中发布隐藏的输入值

php - 我想添加来自不同列的值

php - 从 XML 文件更新 MySQL 数据库