Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    23

    Qual è l'utilità di header con reindirizzamento alla stessa pagina?

    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($jokeENT_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à!

  2. #2
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    Semplicemente, evita che il browser "riempia" nuovamente $_POST se l'utente aggiorna la pagina.
    In pratica, è una contromisura ad un comportamento standard dei browser

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    23
    Quote Originariamente inviata da clasku Visualizza il messaggio
    Semplicemente, evita che il browser "riempia" nuovamente $_POST se l'utente aggiorna la pagina.
    In pratica, è una contromisura ad un comportamento standard dei browser
    Ma quindi quando la pagina si ricarica, $_POST si svuota? Perchè se non si svuotasse, la compilazione appena incontra "if isset POST "joketext" " per fare l'inserimento, reinserirebbe le stesse cose contenute in POST!
    Non capisco in questi passaggi dove si svuota POST, se con il refresh o con header, o se non si svuota proprio (e mi chiedo come funzioni allora!)

  4. #4
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    Header location NON è un refresh della pagina, ma un reindirizzamento verso una pagina
    Per il browser è come se tu fisicamente cliccassi sulla barra degli indirizzi e premessi invio. Quindi tutto ciò che era "in memoria" nel browser per la pagina, viene cancellato (cosa che non accade con un refresh, se noti quando fai il refresh della pagina ti riporta anche nella stessa zona dove eri prima di richiamare il refresh)

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    23
    Quote Originariamente inviata da clasku Visualizza il messaggio
    Header location NON è un refresh della pagina, ma un reindirizzamento verso una pagina
    Per il browser è come se tu fisicamente cliccassi sulla barra degli indirizzi e premessi invio. Quindi tutto ciò che era "in memoria" nel browser per la pagina, viene cancellato (cosa che non accade con un refresh, se noti quando fai il refresh della pagina ti riporta anche nella stessa zona dove eri prima di richiamare il refresh)

    Ah ottimo, quindi si svuota tutto! Perfetto ti ringrazio... Pensavo si ricaricasse infatti.


    (Un'ultima cosa, perchè ho visto in giro usare header mantenendo la SESSION, che mi confuse? SESSION non si svuota fino a che non trova il comando di svuotarsi?)

  6. #6
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    esatto, oppure se si cancella il cookie sul client o se si chiude il browser

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    23
    Quote Originariamente inviata da clasku Visualizza il messaggio
    esatto, oppure se si cancella il cookie sul client o se si chiude il browser
    Ringrazio infinitamente! Quella nozione implicita non specificata che mi diede tutti sti problemi...
    Ora posso proseguire.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.