无法使用PDO设置NULL

时间:2014-09-29 14:19:57

标签: mysql pdo

我知道此主题还有其他帖子,但他们没有回答基本问题。以前的答案都说要使用PDO :: PARAM_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。

2 个答案:

答案 0 :(得分: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而且不会为你做这件事。

我还将bindParam()替换为bindValue(),以使其更加简洁。

答案 1 :(得分:1)

使用PARAM_NULL插入null值或您已有的其他参数:

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