使用 PDO::bindValue (有或没有类型标识符)与执行之间有什么区别吗?

Is there any difference between using PDO::bindValue (with or without a type identifier) vs execute?

我使用 PDO 至少两年了,我注意到所有这三种方法都可用于将值绑定到查询。

是否有任何区别、失败或反对执行这三项中的任何一项的理由。它们是否都正确并且可以随意使用而不产生任何后果?

使用带有类型标识符的 BindValue

$query = $pdo->prepare("INSERT INTO `cake` (`name`) VALUES(:name)");
$query->bindValue(":name", $cakeName, PDO::PARAM_STR);
$query->execute();

使用不带类型标识符的 BindValue

$query = $pdo->prepare("INSERT INTO `cake` (`name`) VALUES(:name)");
$query->bindValue(":name", $cakeName);
$query->execute();

在执行值中使用数组绑定值

$query = $pdo->prepare("INSERT INTO `cake` (`name`) VALUES(:name)");
$query->execute([":name"=>$cakeName]); // shorthand array from PHP 5.4

我知道之前有人问过这个问题,但我还没有看到应该使用哪个以及如何处理它。我也没有看到有人解释不使用类型标识符的后果,这就是为什么我觉得 post 没问题。不设置它会占用更多的资源所以它可以尝试自己判断,不设置它是不是不好的做法?只是好奇。

唯一的区别是 bindValue 允许您传递第三个参数:类型。使用 execute 所有值都绑定为字符串。使用 bindValue,您可以将值绑定为整数、布尔值、blob 或其他类型。有时这是绝对必要的,例如对于斑点。在其他情况下,它并没有太大的区别,例如MySQL 将处理 WHERE foo = '42'(绑定为字符串)与 WHERE foo = 42(绑定为 int)相同。