2014-09-29 87 views
0

我知道有关于此主题的其他帖子,但他们不回答基本问题。以前的答案都说使用PDO :: PARAM_NULL,但是这并不能消除使用PDO的全部原因吗?无法设置NULL与PDO

这里是我的代码:

$sql = "INSERT INTO users_address (uid,street1,street2,city,state,region,postalcode,country) VALUES (?,?,?,?,?,?,?,?)"; 
    $stmt = $this->db->conn_id->prepare($sql); 
    $stmt->bindParam(1, $uid, PDO::PARAM_INT); 
    $stmt->bindParam(2, $street1, PDO::PARAM_STR); 
    $stmt->bindParam(3, $street2, PDO::PARAM_STR); 
    $stmt->bindParam(4, $city, PDO::PARAM_STR); 
    $stmt->bindParam(5, $state, PDO::PARAM_STR); 
    $stmt->bindParam(6, $region, PDO::PARAM_STR); 
    $stmt->bindParam(7, $postalcode, PDO::PARAM_STR); 
    $stmt->bindParam(8, $country, PDO::PARAM_STR); 
    $stmt->execute(); 

并非所有这些值都必需的,这样有时候他们是空的。 varchar和int数据库字段都有default = null。我怎样才能做到这一点,以便如果变量恰好为null,那么null会被插入?我见过的所有其他答案都为第二个参数传递了NULL,但是我怎么知道它在运行时是空的?

要清楚。我不想隐式插入null。如果用户没有完成表单,我想要插入一个可能为null的变量。并非所有字段都需要在表单上。例如,在这个例子中,$ street2。

+0

你究竟想要插入什么(即'$ street1','$ city' ...包含什么?),你会得到什么? – 2014-09-29 14:22:01

+0

可能重复[如何使用PDO插入NULL值?](http://stackoverflow.com/questions/1391777/how-do-i-insert-null-values-using-pdo) – DanFromGermany 2014-09-29 14:24:09

+0

不是重复丹和我解释了为什么。 :) 这些字段来自已发布的表单。并非所有字段都是必需的,所以有些可能为空。我收到一个错误,说不能处理空值。 – 2014-09-29 14:26:52

回答

3

在SQL,或者至少标准的SQL和是啊,我看你最SQL口味,Oracle- NULL是一个与空字符串完全不同的特殊值。在SQL代码中,您使用关键字NULL来表示前者和后者的空引号。

您的输入来自HTML表单。 HTML表单总是以纯文本形式提交:您没有其他任何东西,没有数字,没有日期......当然也没有空值。每当你需要一个实际的NULL,你需要一些后处理。令人高兴的是,PDO将PHP空值转换为SQL空值:

$stmt->bindValue(6, $region!='' ? $region : null, PDO::PARAM_STR); 

PDO(和SQL),只是不知道HTML和你不会做。

我也用bindValue()取代了bindParam(),使它更加简洁。

+0

我这样做,甚至设置$ mynull = null并将其作为$ mynull传递,但得到此警告: “只能通过引用传递变量”。 这只是一个警告,但我更喜欢更干净的代码没有警告。我是否需要在绑定之外完成所有的任务? – 2014-09-29 15:49:19

+1

是的,你正在使用bindParam(),所以你需要传递一个实际的变量。也许你只是想使用bindValue()。 – 2014-09-29 15:52:57

1

使用PARAM_NULL插入null值或其他PARAMS你已经有:

if (!isset($uid) || strlen($uid) == 0) { 
    $stmt->bindParam(1, null, PDO::PARAM_NULL); 
} else { 
    $stmt->bindParam(1, $uid, PDO::PARAM_INT); 
} 
+0

我可以在变量行上使用三元运算符吗?我想这会起作用。 $ stmt-> bindParam(1,($ uid)?$ uid:null,PDO :: PARAM_INT); – 2014-09-29 14:30:03

+0

我认为应该有效。我读过'PARAM_INT'与空作品。 – DanFromGermany 2014-09-29 14:31:52

+0

为什么在没有提供信息时不插入空字符串而不是空字符? – DanFromGermany 2014-09-29 14:34:15