使用PDO将空字符串替换为NULL

7

我有一张表格,其中有一些可为空的字段。当用户在HTML表单字段中没有输入任何内容时,我希望将NULL插入该字段,而不是空字符串(这很重要,因为我稍后对这些表格进行的某些SELECT使用条件,如WHERE x IS NOT NULL)。

然而,这个bindParam代码版本会将空字符串插入可为空字段中,而不是NULL。

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

我阅读了很多资料,发现以下方法可以将 null 插入字段中:
$stmt2->bindParam(':title', $title, PDO::PARAM_NULL);

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

我偶然发现了这个问题。

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

但是它没有效果,经过进一步的研究,我认为这只影响了记录输出时,而不是输入时。

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


3个回答

9
如果您想要 null 值,只需在空字符串的位置插入 null
$stmt2->bindValue(':title', $title === '' ? null : $title, PDO::PARAM_STR);

谢谢,这个显而易见的问题一直在我面前(看不到树木只看到森林……) - Alpaus

2
除了xdazz的更恰当的答案外,您还可以经常在SQL中解决这类问题:只需将查询INSERT INTO ... VALUES (?)重新表述为INSERT INTO ... VALUES (NULLIF(?, ''))

-1

这个非常有效。另一个选择是使用

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接