PDO nie jest mylony ze znakiem zapytania w cudzysłowie. Po prostu testuję to z PHP 5.5.15.
$sql = "SELECT CONCAT('path/to/page/?id=', id) AS link FROM foo WHERE name = ?;";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, 'name');
$stmt->execute();
print_r($stmt->fetchAll());
Działa dobrze, bez błędu o nieodpowiedniej liczbie parametrów. Twój błąd jest spowodowany sposobem wiązania parametrów, a nie składnią SQL.
Podejrzewam, że nie pokazałeś nam całego zapytania SQL, bo GDZIE bez FROM i tak jest błąd składniowy. Musisz więc mieć dodatkowe symbole zastępcze parametrów, których nam nie pokazałeś. Byłoby również pomocne, gdybyś pokazał nam, w jaki sposób łączysz parametry (lub przekazujesz parametry do funkcji execute()).