Should/Must 我在绑定一个空值时使用 PDO::PARAM_NULL?
Should/Must I use PDO::PARAM_NULL when binding a value that is null?
在使用 PDO 准备 SQL 查询时,should/must 我这样做
$query->bindValue('column', $value, is_null($value) ? PDO::PARAM_NULL : PDO::PARAM_STR);
或者我可以直接使用 PDO::PARAM_INT
或 PDO::PARAM_STR
,因为 PDO 会自己算出来? (在我看来真的,真的应该)
作为一个好奇的后续问题,如果我 不必 必须使用 PDO::PARAM_NULL
,它究竟有什么用?
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_STR
、PDO_PARAM_INT
和 PDO_PARAM_BOOL
。其他的只是转换成字符串。
通过将 PDO::PARAM_NULL
添加到查询仅确保如果您要使用不同的驱动程序(可能甚至还不存在)以不同的方式处理它们,您不需要更改代码,也许只有查询。
在理论上 PDO 应该承认
$value = NULL;
$query->bindValue('column', $value, PDO::PARAM_STR);
并将 NULL
(不是字符串 'NULL'
,也不是 ''
)存储到语句中。特别是,它应该能够生成
UPDATE ... SET `column` = NULL;
来自上面的绑定。
在这种情况下,您的代码是 'overkill'。
不,您不需要使用 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);
在使用 PDO 准备 SQL 查询时,should/must 我这样做
$query->bindValue('column', $value, is_null($value) ? PDO::PARAM_NULL : PDO::PARAM_STR);
或者我可以直接使用 PDO::PARAM_INT
或 PDO::PARAM_STR
,因为 PDO 会自己算出来? (在我看来真的,真的应该)
作为一个好奇的后续问题,如果我 不必 必须使用 PDO::PARAM_NULL
,它究竟有什么用?
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_STR
、PDO_PARAM_INT
和 PDO_PARAM_BOOL
。其他的只是转换成字符串。
通过将 PDO::PARAM_NULL
添加到查询仅确保如果您要使用不同的驱动程序(可能甚至还不存在)以不同的方式处理它们,您不需要更改代码,也许只有查询。
在理论上 PDO 应该承认
$value = NULL;
$query->bindValue('column', $value, PDO::PARAM_STR);
并将 NULL
(不是字符串 'NULL'
,也不是 ''
)存储到语句中。特别是,它应该能够生成
UPDATE ... SET `column` = NULL;
来自上面的绑定。
在这种情况下,您的代码是 'overkill'。
不,您不需要使用 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);