在绑定值为null时应该/必须使用PDO :: PARAM_NULL吗?

时间:2017-02-04 01:22:18

标签: php pdo mariadb

使用PDO准备SQL查询时,应该/必须

$query->bindValue('column', $value, is_null($value) ? PDO::PARAM_NULL : PDO::PARAM_STR);

或者我可以直接使用PDO::PARAM_INTPDO::PARAM_STR,因为PDO会自行解决这个问题? (因为它确实应该在我看来)

作为一个好奇心的后续问题,如果我必须使用PDO::PARAM_NULL,那它实际上是什么?

3 个答案:

答案 0 :(得分:2)

不,您不需要使用 PDO::PARAM_NULL。如果您将 NULL 与任何类型绑定,那么 PDO 将在内部使用 NULL。该值不会转换为字符串、数字或任何其他类型。 NULL 将保持 NULL。

当您将类型设置为 PDO::PARAM_NULL 时,相当于将值设置为 NULL。有人可能会争辩说 PDO::PARAM_NULL 没有用,因为将 NULL 与任何其他类型绑定时可以获得相同的结果。

以下语句都将绑定文字 NULL 值。

$str = 'someString';
$stmt->bindParam(1, $str, PDO::PARAM_NULL); 

$str = null;
$stmt->bindParam(1, $str, PDO::PARAM_STR);

$stmt->bindValue(1, null); 

答案 1 :(得分:0)

PDO的想法是,您可以使用1个API与不同的数据库进行通信,这意味着可以使用不同于另一个的方式处理值。例如, MySQL 可以将整数类型列的值作为整数和字符串处理:

INSERT INTO table (col_type_int) VALUES (1)
INSERT INTO table (col_type_int) VALUES ('1')

此查询将在MySQL中正确执行两种方式,但不同的数据库可能更具体。

因此PDO::PARAM_TYPE只是为查询添加了另一级严格性,以确保为不同的数据库类型正确转换查询。目前,source code中使用的唯一值包括PDO_PARAM_STRPDO_PARAM_INTPDO_PARAM_BOOL。其他的只是转换为字符串。

通过在查询中添加PDO::PARAM_NULL,只能确保如果您要使用不同的驱动程序(可能甚至不存在)以不同的方式处理它们,您就不需要更改代码,也许只是查询。

答案 2 :(得分:0)

理论中 PDO应该识别

$value = NULL;
$query->bindValue('column', $value, PDO::PARAM_STR);

并将NULL(不是字符串'NULL''')存储到语句中。特别是,它应该能够生成

UPDATE ... SET `column` = NULL;

来自上面的绑定。

在这种情况下,您的代码“过度杀伤”。