2015-11-23 82 views
1

數據庫中,有一個名爲「數據包」表,該表中有像「ID」,「用戶ID」等,和一列名爲「用法」列(我知道它的名字很差,因爲用法是一個保留字,但遺憾的是我可能不會改變表中的任何內容),這個列的類型是3個值(「教育」,「學習」和「高級培訓」 )以「education」作爲默認值,值可以爲NULL。NULL插入與我一起工作的數據庫PDO

我寫了一個類包的getter/setter方法像set_usage($usage)/get_usage()和類Packet_dao使用PDO訪問數據庫:

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

so f阿,這麼好,一切工作正常。

現在,另一種使用情況「fullversion」應添加的,而是增加一個新值枚舉,他們決定使用NULL作爲它的完整版包使用的價值。現在我遇到了一個問題:當我嘗試使用$packet->set_usage(NULL)來設置使用價值時,它將被解釋爲與未設置該值並且默認值(「education」)將在此情況下設置相同。我該怎麼辦?

+0

如果值是'null',那麼對於'bindValue'或'bindParam'應該是'\ PDO :: PARAM_NULL'第三個參數。這意味着在將其添加到'bindParam'之前,您必須檢查該值。 –

+0

INSERT INTO數據包(userId,number,...,'usage')'如果這是你使用'usage'列''引用的實際代碼,那麼你需要使用ticks \ ''。那些是兩種不同的動物,會引發語法錯誤。如果你正在使用蜱蟲,那麼你應該修改你的問題,以避免混淆那些可能認爲這是問題的人,並且可能想單獨發表一個答案。 –

+0

@fred:是啊,我知道,我只是不知道如何逃生'這裏,編輯 – yangsunny

回答

0

顯然,當我將Coalesce(:usage, default(usage))更改爲:usage後,Coalesce()的第二個參數強制它在沒有設置(或NULL)時採用默認值。它的工作