Possivelmente o $id está vazio. Você suprime o output do erro com @, mas ele quebra a query.
Você precisa de um valor padrão para o caso de não receber o valor. Ou executar uma outra query.
De qualquer forma, uma dica importante para atribuição de variáveis dinâmicas, é usar o ternário. Fica mais fácil de controlar o valor que ela recebe e fazer verificações. Ex:
$id = isset($_POST['id']) ? $_POST['id'] : null;
Espero ter ajudado.
Abs