Ho analizzato il tuo codice e direi che, tra le varie cose da correggere, ce ne sono alcune fondamentali per fare in modo che il sistema possa funzionare quantomeno discretamente.
1) Allineare la gestione dei dati, tra lettura e scrittura, con la costruzione del form
Hai inserito le varie parti di PHP senza seguire una logica lineare che possa integrarsi correttamente anche col relativo HTML. Tutto il codice PHP sarebbe meglio metterlo PRIMA della creazione del form HTML in modo che le variabili, relative ai dati appena salvati o caricati, risultino disponibili e correttamente valorizzate per la creazione del form costruito a seguire.
Inoltre, se lo stesso PHP restituisce del codice HTML da mostrare a video (anche qualora fosse giusto per mostrare i risultati delle variabili, come nel tuo caso) è bene che tali risultati siano inseriti sempre dentro il body (tra i tag <body></body>). In caso contrario si otterrebbe un HTML malformato e non valido che potrebbe generare dei problemi di impaginazione o dei malfunzionamenti.
2) Salvare i dati solo quando necessario
La parte di PHP usata per salvare i dati viene eseguita ogni volta che viene caricata la pagina, anche se non avviene alcun submit.
Chiaramente questo non va bene. I dati devi salvarli solo quando avviene il submit del form, quindi quella parte di PHP va posta dentro la condizione if(isset($_POST["confirm"]))
Nel tuo codice vedo invece che sta fuori.
3) Caricare i dati solo quando necessario
La parte di PHP che legge i dati puoi invece eseguirla quando NON avviene quella condizione, cioè nel relativo else di quella stessa condizione.
Infatti, quando i dati vengono salvati perché la pagina è richiamata attraverso il submit, non hai bisogno di andare a ricaricarli; quelle variabili le hai già disponibili dal momento che le stai usando per salvare i relativi valori.
4) Impedire il ripristino dei campi attraverso l'autocomplete per evitare confusione
I moderni browser "conservano in cache", di default, le impostazioni che l'utente applica per i campi di un form, a prescindere che avvenga o meno il submit.
Se l'utente ha effettuato dei cambiamenti per quei checkbox, SENZA però eseguire il submit, è plausibile che tali scelte siano ripristinate quando la pagina viene ricaricata o riaperta successivamente; in tal caso i dati salvati non coincideranno con quelle scelte ripristinate.
Questo potrebbe generare confusione perché ci si aspetta che i il form risulti sempre configurato secondo i dati salvati, ogni qualvolta sia aperta o ricaricata quella pagina.
Per impedire che il browser peschi dalla cache, è possibile definire l'attributo autocomplete="off" per i singoli campi <input> o direttamente per il tag <form>.
5) Impedire il messaggio "Conferma reinvio modulo" al refresh della pagina
Dopo che viene eseguito il submit, per un form in cui è stato impostato il metodo POST, se si tenta di aggiornare la finestra per ricaricare la pagina, di norma sarà rieseguito il submit. Tuttavia il browser chiederà, attraverso una finestra modale, di confermare il reinvio del modulo.
Per evitare questo comportamento è possibile agire in vari modi. Ne accenno qualcuno:
- usare il metodo GET anziché POST;
- usare AJAX o sistemi affini per scrivere i dati in background;
- usare JavaScript per manipolare la cronologia di navigazione e bypassare il reinvio.
---
Per il momento integro quest'ultimo metodo JavaScript e riporto qui sotto il codice secondo quanto indicato (per sintesi ho sostituito con dei commenti le altre parti accessorie):
Codice PHP:
<!DOCTYPE HTML>
<html lang="it">
<head>
<title>Esempio</title>
<style>
/* Eventuale CSS */
</style>
<script>
// Bypass "Conferma reinvio modulo" al refresh della pagina
if (window.history.replaceState) window.history.replaceState( null, null, window.location.href );
</script>
</head>
<body>
<?php
if(isset($_POST["confirm"])){
// Se la pagina è stata richiamata tramite submit
// Recupero i valori dal form
$fixed_text_1 = isset($_POST["fixed_text_1"]) ? "1" : "0";
$checkbox1 = isset($_POST["checkbox1"]) ? "1" : "0";
// Registro i dati sul file txt
file_put_contents('data.txt', '');
$fp = fopen('data.txt', 'a');
$all_data = $fixed_text_1.";".$checkbox1;
fwrite($fp, $all_data,);
fclose($fp);
echo "--- Dati salvati ---<br><br>";
} else {
// Se invece la pagina è stata aperta normalmente
// Leggo i dati salvati nel file txt
$myfile = fopen("data.txt", "r") or die("Unable to open file!");
$read = fread($myfile, filesize("data.txt"));
$divide = explode(";", $read);
fclose($myfile);
// Riporto i valori per ripristinare il form
$fixed_text_1 = $divide[0];
$checkbox1 = $divide[1];
echo "--- Dati ripristinati ---<br><br>";
}
// Anteprima dei dati grezzi
echo $fixed_text_1."<br>".$checkbox1."<br>";
?>
<!--
Costruzione del form
NOTA: autocomplete="off" impedisce di ripristinare le ultime scelte effettuate anche se non risultano salvate
-->
<form action="index.php" method="post" autocomplete="off">
<hr><input type="checkbox" name="fixed_text_1" value="1" <?php if($fixed_text_1 == "1") echo "checked"; ?>> Example 1
<br><input type="checkbox" name="checkbox1" <?php if($checkbox1 == "1") echo "checked"; ?>>
<hr><input class="favorite styled" type="submit" name="confirm" value="Enter data">
<!--
... il resto del codice HTML
-->
</form>
</body>
</html>
Per ora è tutto, prova ad integrarlo nel tuo progetto e fai sapere.