Vous devez utiliser bindValue au lieu de bindParam .
Lorsque vous utilisez bindParam, il lie la variable fournie au paramètre, pas la valeur de la variable.
Donc, si vous le faites :
$x = 5;
$stmt->bindParam(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 6 instead of 5
Il est en fait exécuté avec 6 au lieu de 5. Pour ce faire, la méthode doit avoir une référence à la variable. Vous ne pouvez pas avoir de référence à un littéral, cela signifie donc que bindParam ne peut pas être utilisé avec des littéraux (ou quoi que ce soit auquel vous ne pouvez pas avoir de référence).
$x = 5;
$stmt->bindValue(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 5 instead of 6
Ensuite :
$stmt->bindParam(1, 1, PDO::PARAM_INT);
//invalid because there's no way to pass a literal 1 by reference
$stmt->bindValue(1, 1, PDO::PARAM_INT);
//valid