使用PDO准备SQL查询时,应该/必须
$query->bindValue('column', $value, is_null($value) ? PDO::PARAM_NULL : PDO::PARAM_STR);
或者我可以直接使用PDO::PARAM_INT
或PDO::PARAM_STR
,因为PDO会自行解决这个问题? (因为它确实应该在我看来)
作为一个好奇心的后续问题,如果我不必须使用PDO::PARAM_NULL
,那它实际上是什么?
答案 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_STR
,PDO_PARAM_INT
和PDO_PARAM_BOOL
。其他的只是转换为字符串。
通过在查询中添加PDO::PARAM_NULL
,只能确保如果您要使用不同的驱动程序(可能甚至不存在)以不同的方式处理它们,您就不需要更改代码,也许只是查询。
答案 2 :(得分:0)
在理论中 PDO应该识别
$value = NULL;
$query->bindValue('column', $value, PDO::PARAM_STR);
并将NULL
(不是字符串'NULL'
或''
)存储到语句中。特别是,它应该能够生成
UPDATE ... SET `column` = NULL;
来自上面的绑定。
在这种情况下,您的代码“过度杀伤”。