Prepare/Execute

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