Evitare la riesecuzione delle query con il reload della pagina

Ho notato che facendo il reload delle pagine dopo una query questa viene ripetuta due volte.

Non riesco a trovare un modo per evitarlo...

inviato 10 anni fa
arjuna
X 0 X

Un metodo consiste nel creare 2 pagine A e B.

La pagina A esegue la query ed effettua un redirect alla pagina B che mostra ad esempio un messaggio.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho strutturato tutto il sito su due soli file:

- un file che gestisce i 'case' e fa lo switch tra una funzione del sito e l'altra

- un file dove risiede tutta la classe e i metodi richiamati dal primo file

non ci sono 'pagine'

il template è gestito tramite Smarty

non c'è un modo per evitare di fare queste due pagine?

avevo pensato di inizzializzare una variabile di controllo che impedisse il rieseguimento dello script su reload della pagina ma non ho trovato nulla che faccia al mio caso.

Suggerimenti?

risposto 10 anni fa
arjuna
X 0 X

In realtà non è necessario avere due pagine "reali". Se ad esempio lo script A esegue una query a fronte dell'invio di un form, basta effettuare un redirect verso lo stesso script, che questa volta non troverà i dati in $_POST e non effettuerà più la query.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Continuo a non capire...

Se io faccio una INSERT di un record del database lo script mi visualizza i risultati aggiornati.

Esempio:

<?php

/*
 * dopo aver eseguito tutti i controlli del caso
 *
 */

$query = "INSERT INTO foo (var1, var2) VALUES ('$var1', '$var2')";

// esegue la query (PEAR DB)
$this->db->query($query);

// ricava l'ultimo inserimento
$cid = $this->db->getOne( "SELECT LAST_INSERT_ID() FROM foo" );

// caricara i dati nell'array
$dati = $this->getOneDati($cid);

// assegna i dati a Smarty
$this->assign('dati', $dati);

// visualizza il template
$this->displayOne('showschedeimg.tpl');
?>

cosa intendi tu per redirect?

risposto 10 anni fa
arjuna
X 0 X

Guarda questo schema di principio per la paginaA.php:

<?php
if($_POST)
{
   // fai i controlli e le query di inserimento

   // poi redirigi il borwser dell'utente a questa stessa pagina
   header("locarion: paginaA.php");
   exit;
}

// mostra dei dati all'utente

?>
risposto 10 anni fa
Gianni Tomasicchio
X 0 X

C'è un modo per passare dei dati prima di usare il redirect?

risposto 10 anni fa
arjuna
X 0 X
C'è un modo per passare dei dati prima di usare il redirect?

passare a chi? intendi mostrare dei dati all'utente? No. Lo dovrà fare la stessa pagina, però dopo il redirect.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

passare allo script

se io scrivo:

 header("locarion: paginaA.php?action=showrecord");

   exit;

ho bisogno di passare dei valori a quella pagina, per esempio i valori relativi al record appena modificato

risposto 10 anni fa
arjuna
X 0 X

puoi usare sia l'URL, come nel tuo esempio, oppure ci sono le sessioni

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

cavolo, dovrò riscrivere centinaia di linee di codice in questo modo...

non c'è modo di emulare i $_POST?

risposto 10 anni fa
arjuna
X 0 X
non c'è modo di emulare i $_POST?

in che senso? Tieni presente che $_POST è un array modificabile...

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Per scrivere una variabile di sessione devo prima aprire la sessione e poi scrivere i dati al suo interno.

C'è un modo per scrivere i dati direttamente nella variabile $_POST così come farei per le sessioni?

risposto 10 anni fa
arjuna
X 0 X

I dati scritti nell'array $_POST vengono persi alla fine dello script. Le sessioni servono a mantenere i dati tra una pagina e l'altra.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Se vengono persi allora perchè facendo il reload della pagina mi vengono inseriti di nuovo?

Se così fosse basterebbe usare exit; alla fine dello script!?

risposto 10 anni fa
arjuna
X 0 X

Quando fai il reload di una pagina questa viene richiesta nuovamente al server con la stessa modalità con cui era stata richiesta la prima volta.

Se la pagina era stata richiesta inviando contemporaneamente dei dati inseriti in un form (premendo il classico bottone "submit"), al momento del reload questi verranno nuovamente inviati al server. E' il browser il responsabile di questo comportamento. Per lui il reload significa "ripeti l'ultima operazione"

Quando fai il redirect con la funzione header stai dicendo al browser di richiedere nuovamente la pagina, però senza i dati del form. Pertanto se ora viene fatto il reload della pagina le query di inserimento non verranno ripetute.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

capisco, quindi non mi resta che usare le sessioni per passare i dati che mi interessano.

ti ringrazio

risposto 10 anni fa
arjuna
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda