Devi usare bindValue invece di bindParam .
Quando usi bindParam, associa la variabile fornita al parametro, non il valore della variabile.
Quindi, se lo fai:
$x = 5;
$stmt->bindParam(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 6 instead of 5
In realtà viene eseguito con 6 anziché 5. Per fare ciò, il metodo deve avere un riferimento alla variabile. Non puoi avere un riferimento a un valore letterale, quindi questo significa che bindParam non può essere utilizzato con valori letterali (o qualsiasi cosa a cui non puoi avere un riferimento).
$x = 5;
$stmt->bindValue(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 5 instead of 6
Quindi:
$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