Dovresti impostare in maniera diversa il tuo script.
Una soluzione molto comune e valida è quella di usare un'unica pagina (magari con una statica html a cui reindirizzare l'utente quando ha inviato i dati con successo).

Codice PHP:
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['nome_tasto_submit']) ){
    
//ha inviato il form. Verifica i dati.
    
$errori = array();
    if(
strlen($_POST['username']) < 5){
        
$errori['username'] = 'Il campo username deve contenere almeno 5 caratteri.';
    }
    if(
$_POST['password'] != $_POST['conferma_password']){
        
$errori['password'] = 'Le due password non coincidono';
    }
    
//ecc.
    //se il form è corretto, ovviamente l'array $errori è rimasto vuoto...
    
if(!empty($errori)){
        
//esegue quello che deve eseguire (ad esempio inserire l'username nel database)
        
header("Location: pagina-di-success.html");
        die();
    }
    else{
        
//inizializza i dati con quelli già passati via POST, cosi puo pre-impostare il form
        
$dati_precedenti $_POST;
    }
}
else{ 
//non ha ancora inviato il form. Inizializza i dati con valori vuoti. Volendo, se ad esempio è una pagina di modifica dati, è possibile inizializzare questi valori con quelli ricavati dal database.
    
$dati_precedenti = array('username'=>'Infocurci''citta'=>'Roma''professione'=>'Programmatore php'); //ecc ecc
}
//se arriva fin qui, vuol dire che NON è passato per l'header() inviato in occasione del form inviato con successo. Può quindi procedere direttamente alla stampa del form.
?>
<form>
    <input type="text" name="username" size="20" value="<?php echo $dati_precedenti['username'];?>" />
    <?php
        
if(isset($errori['username'])){
            echo 
'<span class="error">'.$errori['username'].'</span>';
        }
    
?>
</form>