PDO n'est pas confondu par le point d'interrogation à l'intérieur des guillemets. Je viens de tester cela avec 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());
Cela fonctionne bien, sans erreur sur un mauvais nombre de paramètres. Votre erreur est causée par la façon dont vous liez les paramètres, et non par la syntaxe SQL.
Je soupçonne que vous ne nous avez pas montré toute la requête SQL, car WHERE sans FROM est de toute façon une erreur de syntaxe. Vous devez donc avoir des paramètres fictifs supplémentaires que vous ne nous avez pas montrés. Il serait également utile que vous nous montriez la façon dont vous liez les paramètres (ou transmettez les paramètres à execute()).