2015-11-23 2 views
1

dans la base de données avec laquelle je travaille, il y a une table nommée "paquets", dans cette table il y a des colonnes comme "id", "userid" etc. Je sais que c'est un mauvais choix de nom car l'utilisation est un mot réservé, mais malheureusement je ne peux rien changer dans le tableau), le type de cette colonne est enum avec 3 valeurs ("éducation", "étude" et "formation avancée") avec "education" comme valeur par défaut et la valeur peut être NULL.Insérez NULL dans la base de données avec pdo

j'ai écrit un paquet de classe avec getters/setters comme set_usage($usage)/get_usage() et une classe Packet_dao pour la base de données accès à l'aide 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; 
    } 

requête INSERT ressemble

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

donc si je veux ajouter un paquet en db, le code ressemblerait à:

$packet = new Packet(); 
$packet_dao = new Packet_dao(); 
$packet->set_stuff("stuff"); 
$packet_dao->persist($packet); 

ainsi f ar, tout va bien, tout va bien.

maintenant, un autre cas d'utilisation "fullversion" devrait être ajouté, et au lieu d'ajouter une nouvelle valeur à l'énumération, ils ont décidé d'utiliser NULL comme valeur d'utilisation pour les paquets qui sont en version complète. Maintenant, j'ai un problème: quand j'essaie de définir la valeur pour l'utilisation en utilisant $packet->set_usage(NULL), il sera interprété comme si la valeur n'était pas définie et la valeur par défaut ("éducation") sera définie dans ce cas. Que devrais-je faire?

+0

Si une valeur est 'null', alors le troisième paramètre pour' bindValue' ou 'bindParam' devrait être' \ PDO :: PARAM_NULL'. Cela signifie que vous devrez vérifier la valeur avant de l'ajouter à 'bindParam'. –

+0

'INSERT INTO paquets (userId, number, ..., 'usage')' Si c'est votre code actuel que vous utilisez avec les guillemets '' 'autour de la colonne' usage', alors vous devez utiliser des ticks '\ ''. Ce sont 2 animaux différents et vont lancer une erreur de syntaxe. Si vous utilisez des ticks, vous devez alors modifier votre question, afin d'éviter toute confusion pour les personnes qui pourraient penser que c'est le problème et qui voudraient afficher une réponse en ce qui concerne cela seul. –

+0

@fred: ouais je sais, je ne savais pas comment échapper 'ici, édité – yangsunny

Répondre

0

Apparemment, le deuxième paramètre de Coalesce() l'oblige à prendre la valeur par défaut lorsque rien n'est défini (ou NULL), après avoir changé Coalesce(:usage, default(usage)) en :usage. Cela a fonctionné