使用pdo将NULL插入数据库

时间:2015-11-23 15:15:59

标签: php database pdo

在我正在使用的数据库中,有一个名为“packets”的表,在这个表中有像“id”,“userid”等列和一个名为“usage”的列(我知道这是一个糟糕的选择名称原因用法是一个保留字,但遗憾的是我可能不会改变表中的任何内容),此列的类型是枚举的3个值(“教育”,“学习”和“高级培训”),“教育”为default-value,值可以为NULL。

我用类似set_usage($usage)/get_usage()的getter / setter和使用pdo访问数据库的Packet_dao类写了一个类Packet:

class Packet_dao {
    private m_insert_query;
    ...
    public function persist($data)
    {
        $query = $this->m_insert_query;
        try
        {
           $stmt = $this->bind_param($data, $query);
           $stmt->execute();
           return true;
        }
        catch (PDOException $ex)
        {
           $this->m_error_message = $ex->getMessage();
           return false;
        }
    }

    private function bind_param($packet, $query)
    {
       $stmt = $this->m_pdo->prepare($query);
       $stmt->bindParam(':userId', $packet->get_user_id());
       ...
       $stmt->bindParam(':usage', $packet->get_usage());
       return $stmt;
    }

插入查询看起来像

INSERT INTO packets (userId, number, ..., `usage`) 
VALUES (:userId, Coalesce(:number, default(number)), Coalesce(:usage, default(`usage`)))

所以,如果我想将数据包添加到db中,代码将如下所示:

$packet = new Packet();
$packet_dao = new Packet_dao();
$packet->set_stuff("stuff");
$packet_dao->persist($packet);
到目前为止,这么好,一切都很好。

现在,应该添加另一个用例“fullversion”,而不是向枚举添加新值,他们决定使用NULL作为完整版数据包的使用值。现在我遇到了一个问题:当我尝试使用$packet->set_usage(NULL)设置使用值时,它将被解释为与未设置值相同,并且将在此设置默认值(“education”)案件。我该怎么办?

0 个答案:

没有答案