Ricaricare parzialmente una pagina (in presenza di token)

di il
11 risposte

Ricaricare parzialmente una pagina (in presenza di token)

Salve a tutti ho problema...cercherò di essere più dettagliato possibile...
Allora io ho 1 pagina chiamata
-arrivi.php
In questa pagina estraggo dei record da un database mysql e li inserisco in una tabella per mostrarli a video. In seguito tramite questo FORM
<form method="post" onsubmit="return ValidaCheckbox();">
<input type="submit" id="submit" name="submit" value="Arrivati"/>
invio i dati ad un altra pagina:
-controlloarrivi.php
che inserirà i dati nel database e restituirà l'output dell'inserimento.

Per evitare doppi inserimenti nel database, a causa di up/refresh/back, utilizzo un token
FIN QUI TUTTO OK

A capo delle due pagine ho un index che include arrivi.php e controlloarrivi.php (COMMENTATA)
    session_start(); //AVVIO SESSIONE
   if (isset($_POST['submit']))
    {
        if($_SESSION['user_token'] == $_POST['user_token']) {  // QUANDO VIENE PREMUTO IL TASTO SUBMIT E IL TOKEN RISULTA VALIDO
            unset($_SESSION['user_token']); //CANCELLO VECCHIA SESSIONE
            include_once('./script/token.php'); //CREO TOKEN PER LA SECONDA SESSIONE
            include_once('./arrivi.php'); //RICARICO ARRIVI.PHP
            include_once('./script/controlloarrivi.php'); //OUTPUT DEL PRIMO INSERIMENTO
        } else { 
          header("location: ./index.php"); //ALTRIMENTI QUANDO IL TOKEN RISULTA SCADUTO RICARICA LA PRIMA PAGINA
        }
    } else{
        include_once('./script/token.php'); //CREA TOKEN PER LA PRIMA SESSIONE
        include_once('./arrivi.php'); //MOSTRA LA TABELLA CON IL FORM E IL TASTO SUBMIT
    }
TUTTO FUNZIONA!
Però ho un problema: Ogni volta che premo il tasto submit, arrivi.php, non viene ricaricato e di conseguenza, nella tabella a video, restano ancora i record che sono già stati processati da controlloarrivi.php e che quindi non dovrebbero più comparire.

Leggendo un po in giro, per ricaricare parzialmente una pagina, dovrei usare jquery/ajax
Allora ho provato in questa maniera:
   session_start();
   if (isset($_POST['submit']))
    {
        if($_SESSION['user_token'] == $_POST['user_token']) {
            unset($_SESSION['user_token']);
            include_once('./script/token.php');
        ?>
            <div id="div"></div>
    <?php
            include_once('./script/controlloarrivi.php');
        } else { 
          header("location: ./2.php");
        }
    } else{
        include_once('./script/token.php');
        include_once('./arrivi.php');
    }
?>
<script>
$(function(){
     $("#div").load("arrivi.php");  
});
</script>
Ed ho risolto in parte.... adesso, al primo submit, la tabella viene ricaricata egregiamente ed ottengo l'output da controlloarrivi.php! Mentre la seconda volta che premo il tasto submit per poter effettuare una nuova operazione (senza aver aggiornato la pagina) scompare l'output del primo inserimento e purtroppo non avviene il nuovo inserimento (ovviamente non compare nemmeno il nuovo output).
Come potrei fare per far si che ciò avvenga? Se avete soluzioni alternative (ad esempio tramite iframe o altro) sono ben accette.
In sostanza ciò che vorrei ottenere è il risultato dell'inserimento nella stessa pagina evitando doppi inserimenti e che si possa continuare lo stesso lavoro (semplice check di checkbox con submit) senza dover aggiornare la pagina.
Grazie

11 Risposte

  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    Premetto che leggendo il codice non sono riuscito a vedere dove sia il problema, comunque ti assicuro che, per il tuo script puoi semplicemente utilizzare solamente il php, anche se, cosi facendo, non ricariche parzialmente la pagina ( l'effetto ottenuto e quello ma la pagina viene ricaricata totalmente ), cambia solamente l'output prodotto da php a seconda dei dati passati, nel tuo caso tramite metodo post.

    Tuttavia, potresti postare tutto il tuo script? ad esempio: dove crei la sessione user_token?

    Al posto di un token per evitare il reinserimento dei dati nel db userei una semplice query, ad esempio io, utilizzerei una query di selezione ( selezionerei i dati appena inseriti ), e se sono presenti, eviterei in reinserimento.

    Per verificare se un record è presente o meno utilizzerei la funzione mysq_row_count() ( oppure mysqli_row_count() se stai utilizzando le funzioni mysqli_* ), è se mi restituisce il valore 1 ( cioè se è presente il record selezionato ) eviterei, tramite una if, il reinserimento delle informazioni nel database.
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    Ho trovato il problema...che stupido...
    inserendo prima arrivi.php di controlloarrivi.php veniva caricata la tabella prima prima che i prodotti venissero processati da controlloarrivi.php
    Ma il problema che adesso sorge è: come faccio a mostrare prima la tabella e poi i risultati?
    Se aggiungo arrivi.php all'inizio della pagina non viene aggiornata.
    Se l'aggiungo alla fine viene aggiornata ma l'output comparirà prima della tabella invece io al di sotto della tabella!
    Grazie
    controlloarrivi.php
    	foreach($_POST['seleziona'] as $k=>$v)
    	{
    		foreach ($pdo->query("SELECT * FROM $tabella_prenotati WHERE id='$v'") as $row)
    		{		
    			//SE LA QUANTITA ARRIVATA E' UGUALE A QUELLA PRENOTATA
    			if ($_POST['quantita'][$k] == $row['quantita'])
    			{
    			$query = $pdo->query("query");
    			echo "RISULTATI";
    			}
    			//SE LA QUANTITA ARRIVATA E' MINORE DI QUELLA PRENOTATA
    			elseif ($_POST['quantita'][$k] < $row['quantita'])
    			{ 
    			$query = $pdo->query("query");
    			echo "RISULTATI"; 
    			}
    			//SE LA QUANTITA ARRIVATA E' MAGGIORE DI QUELLA PRENOTATA
    			elseif ($_POST['quantita'][$k] > $row['quantita'])
    			{
    			echo "RISULTATI "; 
    			}
    		}
    	}
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    Si ok, ma $_SESSION['user_token'] come la inizializzi? E soprattutto, nel corso dello script, rimane tale? Non ti assicuro nulla ma per me, e proprio quello il problema, ecco perché nella mia prima risposta ti ho consigliato un alternativa al token per evitare il reinserimento dei dati nel database.

    Per il resto, nello script che hai postato ( escludendo le parti che hai modificato ) non credo ci sia nessun errore.
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    Guarda che ho risolto il problema principale che avevo .... Solo che adesso vorrei che i 3 echo, con i risultati, che si trovano in controlloarrivi.php compaiano al di sotto della tabella....
    Poichè se inserisco la tabella in arrivi.php prima di controlloarrivi.php non vengono processati e quindi la tabella non si ricarica!
    Se inserisco arrivi.php dopo controlloarrivi.php ottengo prima l'output degli inserimenti precedenti e poi la tabella correttamente ricaricata!
    Come posso fare? Grazie
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    Perché non metti controlliarrivi all'inizio della pagina? Nella pagina controlliarrivi memorizzi tutti i dati in delle variabile che poi puoi richiamare quanto vuoi.
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    Potresti farmi un esempio? Perchè normalmente i risultati sono più di uno per almeno 2 degli if/elsif
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    Quali sono questi risultati? io nel tou codice nei blocchi if/else if vedo solo:
    
    $pdo->query("query");
    eco "Risultati";
    
    Capisco che stai eseguento una query, ma quale? Successivamente stampi la stringa Risultati.

    Quali sono questi risultati? I varoli di ogni tabella o non solo.

    Se sono i valori della tabella metti ogni valore in una variabile, al posto di stamparlo direttamente lo mette in una variabile, per poi stampare il contenuto della variabile all'interno della tabella presente in arrivi.

    Oltre a dirti come fare come potrei farti un'esempio, visto che non so se i risultati sono i valore dei campi della tabella o altri ( ad esempio un calcolo )
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    sevenjeak ha scritto:


    Quali sono questi risultati? io nel tou codice nei blocchi if/else if vedo solo:
    
    $pdo->query("query");
    eco "Risultati";
    
    Capisco che stai eseguento una query, ma quale? Successivamente stampi la stringa Risultati.

    Quali sono questi risultati? I varoli di ogni tabella o non solo.

    Se sono i valori della tabella metti ogni valore in una variabile, al posto di stamparlo direttamente lo mette in una variabile, per poi stampare il contenuto della variabile all'interno della tabella presente in arrivi.

    Oltre a dirti come fare come potrei farti un'esempio, visto che non so se i risultati sono i valore dei campi della tabella o altri ( ad esempio un calcolo )
    Grazie per l'aiuto e scusami! Mi sono spiegato in modo superficiale

    Se li metto in una variabile Es. ($a[],$b[],$c[]):
    
    $pdo->query("query");
    $a[]= "<br> 	  PRODOTTO: 		" .$row['prodotto']. "				<br>
    						DI: 			" .$row['nome']. " " .$row['cognome']. "	<br>
    						E' ARRIVATO. 									<br>
    						QUANTITA:		" .$_POST['quantita'][$k]. " 		<br>
    						--------------									<br>";
    
    Alla fine della tabella li richiamo così?
    	
    if (isset($a)) {
    	foreach($a as $value){ 
                 echo $value;   
    	}}
    		
    è la soluzione corretta? Ovviamente devo fare 3 isset diversi con 3 cicli diversi... In questo modo però poi non verrebbero stampati in ordine! L'ordine sarà in base al tipo di risultato(se $a,$b o $c)!
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    Le parentesi graffe affianco ad $a indica che è un'array, a che ti serve un'array per memorizzare solo un dato, ho ti sei sbagliato a scrivere il tuo codice?

    Comunque si, più o meno intendevo quello, anche se intendevo più una cosa fatta cosi:
    $prodotto = $row["prodotto"];
    $nome = $row["nome"];
    $cognome = $row["cognome"];
    ...
    ...
    
    Per poi stamparli cosi:
    
    if (isset($a)) {
       foreach($a as $value){ 
                 echo "PRODOTTO:\t$prodotto
     DI:\t$nome $cognome
    
     E' ARRIVATO.
     QUANTITA:      $quantià
    -----------";
       }}
    
    Inoltre o levato i segni di concatenazione, visto che l'istruzione echo riconosce le variabile all'interno della stringa, ho messo il caratteri di escape t sostituito agli spazi ( per la tabulazione ) e invece di br sono semplicemente ritornato a capo ( non ricordo bene ma dovrebbe lo stesso ritornarti a capo durante la stampa a video )

    A dire il vero io pensavo che dovevi stampare il risultato in ogni campo della tabella, ecco perché ti ho consigliato di mettere ogni valore in una tabella, ma e lo stesso, va benissimo sia come fai te che come ti ho consigliato io.

    Per l'ordinamento potresti farlo direttamente nella query di select, tramite la clausola order by
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    sevenjeak ha scritto:


    Le parentesi graffe affianco ad $a indica che è un'array, a che ti serve un'array per memorizzare solo un dato, ho ti sei sbagliato a scrivere il tuo codice?
    Nono non sarà un solo dato...come ho scritto prima ogni if/else if può avere più risultati (ovviamente perchè saranno caricati più prodotti contemporaneamente!)

    sevenjeak ha scritto:


    Comunque si, più o meno intendevo quello, anche se intendevo più una cosa fatta cosi:
    $prodotto = $row["prodotto"];
    $nome = $row["nome"];
    $cognome = $row["cognome"];
    ...
    ...
    
    Per poi stamparli cosi:
    
    if (isset($a)) {
       foreach($a as $value){ 
                 echo "PRODOTTO:\t$prodotto
     DI:\t$nome $cognome
    
     E' ARRIVATO.
     QUANTITA:      $quantià
    -----------";
       }}
    
    Inoltre o levato i segni di concatenazione, visto che l'istruzione echo riconosce le variabile all'interno della stringa, ho messo il caratteri di escape t sostituito agli spazi ( per la tabulazione ) e invece di br sono semplicemente ritornato a capo ( non ricordo bene ma dovrebbe lo stesso ritornarti a capo durante la stampa a video )

    A dire il vero io pensavo che dovevi stampare il risultato in ogni campo della tabella, ecco perché ti ho consigliato di mettere ogni valore in una tabella, ma e lo stesso, va benissimo sia come fai te che come ti ho consigliato io.
    Vabbe fa lo stesso ...Ma così come hai scritto tu, non posso usare $a come variabile isset.. quindi poi come dovrei fare? if ($query > 0) / if ($query->fetch())? Ma in qualunque caso i risultati non verrebbero stampati in ordine!

    sevenjeak ha scritto:


    Per l'ordinamento potresti farlo direttamente nella query di select, tramite la clausola order by
    Ma io non faccio nessuna query di select!(se non quella per riempire la tabella iniziale)
  • Re: Ricaricare parzialmente una pagina (in presenza di token)

    Visto che nell'array $a[] metti una stringa avevo pensato che non fosse un'array, per la query di selezione scusa ma mi ero sbagliato io, me ne sono accorto solo ora.

    Comunque meglio il tuo medoto, per l'ordinamento dai un'occhiata qui:

    http://php.net/manual/it/array.sorting.ph

    Ma non credo ci sia qualcosa per ordinare piú array tra loro, almeno che, te non metta tutti i risultati in'unica array per poi ordinarla.
Devi accedere o registrarti per scrivere nel forum
11 risposte