Трябва да използвате bindValue вместо bindParam .
Когато използвате bindParam, той свързва предоставената променлива с параметъра, а не стойността на променливата.
Така че, ако го направите:
$x = 5;
$stmt->bindParam(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 6 instead of 5
Всъщност се изпълнява с 6, а не с 5. За да направите това, методът трябва да има препратка към променливата. Не можете да имате препратка към литерал, така че това означава, че bindParam не може да се използва с литерали (или всичко, към което не можете да имате препратка).
$x = 5;
$stmt->bindValue(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 5 instead of 6
След това:
$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