Be careful in edge cases!
With MySQL native prepares your integer can be wrapped around on some machines:
<?php
$x = 2147483648;
var_dump($x); $s = $db->prepare('SELECT :int AS I, :str AS S;');
$s->bindValue(':int', $x, PDO::PARAM_INT);
$s->bindValue(':str', $x, PDO::PARAM_STR);
$s->execute();
var_dump( $s->fetchAll(PDO::FETCH_ASSOC) );
?>
Also, trying to bind PDO::PARAM_BOOL in MySQL with native prepares can make your query silently fail and return empty set.
Emulated prepares work more stable in this cases, because they convert everything to strings and just decide whenever to quote argument or not to quote.