On ne peut pas utiliser des bindValue() et un tableau dans execute() en même temps.
On ne peut pas placer les limites (et offset) pour LIMIT dans le tableau envoyé à la fonction execute() car MySQL veut des paramètres INT, et execute() envoie des paramètres STR)
use \PDO;
$db = new PDO(...);
$stmt = $db->prepare('SELECT col1, col2, col3 FROM table WHERE col1 = :test' LIMIT :limit');
// ces deux lignes ne fonctionnent pas, le type de LIMIT doit être un PARAM_INT
$params = array(':test' => 'val1', ':limit' => 10);
$stmt->execute($params); // ne fonctionne pas
// ces trois lignes ne fonctionnent pas, il manque des paramètres dans $params
$stmt->bindValue(':limit', 10, PDO::PARAM_INT);
$params = array(':test' => 'val1');
$stmt->execute($params); // ne fonctionne pas
// mais ceci fonctionne
$params = array(':test' => 'val1');
foreach ($params as $key => $value) {
$stmt->bindValue($key, $value);
}
$stmt->bindValue(':limit', 10, PDO::PARAM_INT);
$stmt->execute(); // fonctionne