PDO není zmaten otazníkem uvnitř uvozovek. Právě jsem to testoval s 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());
Funguje to dobře, bez chyby o špatném počtu parametrů. Vaše chyba je způsobena způsobem, jakým vážete parametry, nikoli syntaxí SQL.
Mám podezření, že jste nám neukázali celý SQL dotaz, protože WHERE bez FROM je stejně syntaktická chyba. Takže musíte mít další zástupné symboly parametrů, které jste nám neukázali. Také by bylo užitečné, kdybyste nám ukázali způsob, jakým vážete parametry (nebo předáváte parametry do execute()).