Você precisa usar bindValue em vez de bindParam .
Quando você usa bindParam, ele associa a variável fornecida ao parâmetro, não o valor da variável.
Então, se você fizer:
$x = 5;
$stmt->bindParam(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 6 instead of 5
Na verdade, é executado com 6 em vez de 5. Para fazer isso, o método deve ter uma referência à variável. Você não pode ter uma referência a um literal, então isso significa que bindParam não pode ser usado com literais (ou qualquer coisa que você não possa ter uma referência).
$x = 5;
$stmt->bindValue(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 5 instead of 6
Então:
$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