插入NULL而不是带有PDO的空字符串


Insert NULL instead of empty string with PDO

我有一个表,它有一些可以为NULL的字段,当用户在HTML表单字段中不输入任何内容时,我想在该字段中插入NULL,而不是空字符串(这很重要,因为我在这些表上的一些SELECT稍后会使用WHERE x is not NULL等条件)。

但是,此版本的bindParam代码在可为NULL的字段中插入一个空字符串,而不是NULL。

$stmt2->bindParam(':title', $title, PDO::PARAM_STR);

我读了很多书,发现这是在字段中插入null的答案:

$stmt2->bindParam(':title', $title, PDO::PARAM_NULL);

但这意味着我需要预先检查传递给可为null字段的所有参数,以确定它们是否为空,如果为空,则传递PDO::PARAM_NULL而不是PDO::PARAM_STR。我当然可以这样做,但我希望可能有一个设置,它只会告诉PDO,如果它遇到空字符串,请插入null。

我偶然发现了这个

$this->dbh->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);

但它没有影响,随着进一步的研究,我认为这只会影响退出的记录,而不会影响进入的记录

除了预先检查变量之外,还有其他选择吗?

如果想要null,只需插入null而不是空字符串。

$stmt2->bindValue(':title', $title === '' ? null : $title, PDO::PARAM_STR);

除了xdazz更合适的答案外,您通常可以在SQL中解决类似的问题:只需将查询INSERT INTO ... VALUES (?)重新表述为类似INSERT INTO ... VALUES (NULLIF(?, ''))的内容。

这非常有效。另一种选择是

IF $val == null || $val == 'null' || $vall ==''
BindValue with PDO::PARAM_NULL
ELSE
BindValue with PDO::PARAM_STR