Ciao, sto studiando PHP ma mi sono intoppato in una parte, su un libro di Kevin Yank.
Viene fatto un esempio di file index.php controller, per l'inserimento di "indovinelli" in un database, che include la funzione header('Location: .');
Riporto qui il codice dell'index e dei file inclusi:
INDEX:
Codice PHP:
<?php
if (isset($_GET['addjoke']))
{
include 'form.html.php';
exit();
}
// <- CONNETTE: non riporto il blocco di connessione try catch con PDO, al database
if (isset($_POST['joketext']))
{
// <- INSERISCE: non riporto tutto l'inserimento dei dati del form nel database
header('Location:.');
exit();
}
try
{
// <- RECUPERA DATI: non riporto tutto il recupero dei dati con select, nel try-catch
}
while($row=$result->fetch())
{
$jokes[]=$row['joketext'];
}
include 'jokes.html.php';
?>
JOKES.HTML.PHP
Codice PHP:
<!DOCTYPE html>
//<- non riporto tutte le varie intestazioni
<body>
<p><a href="?addjoke">Aggiungi un tuo joke</a></p>
<p>Ecco tutti i joke nel database:</p>
<?php foreach ($jokes as $joke): ?>
<blockquote>
<p><?php echo htmlspecialchars($joke, ENT_QUOTES, 'UTF-8'); ?></p>
</blockquote>
<?php endforeach; ?>
</body>
</html>
FORM.HTML.PHP
Codice PHP:
<!DOCTYPE html>
//<- non riporto tutte le varie intestazioni
<body>
<form action="?" method="post">
<label for="joketext">Digita il joke qui:</label>
<textarea id="joketext" name="joketext" rows="3" cols="40">
</textarea>
<input type="submit" value="Aggiungi">
</form>
</body>
</html>
Ecco qui.
Sul libro viene spiegato, in riferimento a header, questo:
"[...] Questa istruzione if presenta ancora un punto delicato. Una volta che abbiamo aggiunto il nuovo joke al database, anzichè visualizzare il template PHP come in precedenza, vogliamo reindirizzare il browser dell'utente all'elenco dei joke, così l'utente potrà vedere il nuovo joke appena aggiunto. Questo è ciò che fanno le due righe header ed exit.
Al fine di ottenere il risultato desiderato, il vostro primo istinto potrebbe portarvi a fare in modo che il controller possa semplicemente recuperare l'elenco dei jokes dal database dopo l'aggiunta del joke nuovo, e visualizzare tale elenco utilizzando il template jokes.html.php come di consueto. Il problema è che l'elenco di joke, dalla prospettiva del browser, sarebbe il risultato dell'invio del modulo "Aggiungi joke". Se l'utente aggiornasse la pagina, il browser invierebbe di nuovo il modulo, causando l'aggiunta di un'altra copia del joke nel database! E non è questo ciò che si vuole.
Vogliamo invece che il browser tratti l'elenco aggiornato di jokes come una normale pagina web che può essere ricaricata senza inviare di nuovo il modulo. [...]"
Io non riesco davvero a capire...
Praticamente, l'istruzione header pulisce le variabili POST? E quindi permette al controller di bypassare if (isset($_POST['joketext'])) , che causerebbe l'inserimento? Se così fosse, quadrerebbe.
Sul web vedo però che header viene usato mantenendo le variabili globali come ad esempio SESSION, che se non erro fa parte della stessa famiglia di POST. Ne deduco quindi, che invece, POST non lo svuoti proprio!
Con action="?" svuoto GET e la richiesta ?addjoke dopo ogni inserimento, e fin qui capisco.
Ma POST non viene svuotata dopo l'inserimento e joketext rimarrebbe sempre presente, causando un nuovo inserimento quando il controller lo trova (no?).
Dunque non capisco a cosa serva header Location:.
Grazie a chi risponderà!