PDO не се обърква от въпросителния знак в кавичките. Просто тествам това с 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());
Работи добре, без грешка за грешен брой параметри. Вашата грешка е причинена от начина, по който обвързвате параметри, а не от SQL синтаксиса.
Подозирам, че не сте ни показали цялата SQL заявка, защото WHERE без FROM така или иначе е синтактична грешка. Така че трябва да имате допълнителни контейнери за параметри, които не сте ни показали. Също така би било полезно, ако ни покажете начина, по който обвързвате параметри (или предавате параметри на execute()).