• User Attivo

    _post

    Salve,
    Esiste un modo con l'istruzione header di andare da una pagina all'altra conservando i dati del _POST ?
    Se ad esempio io ho una pagina a.php con molti form, li riempo e clicco su pulsante "Invia", arrivo alla pagina b.php ma perdendo i dati. C'è una soluzione?

    [PHP]
    <form id="form1" name="form1" method="post" action="
    <?php
    if (isset($_POST["zz"]))
    {
    header("Location: b.php");
    exit;
    }

    ?>">
    <input type="submit" name="zz" value="Invia" />
    [/PHP]

    Un comando alternativo, ma che tuttavia neppure esso conserva i dati è:
    [PHP]
    {
    echo "<SCRIPT>";
    echo "location.href='b.php'";
    echo "</SCRIPT>";
    exit;
    }
    [/PHP]
    Per alcune necessità non posso usare in ACTION la procedura normale.
    Grazie anticipatamente!


  • ModSenior

    Ciao nofcfro,
    non mi risulta sia possibile.
    Perchè non invi il modulo direttamente con action b.php?


  • User Attivo

    Ciao, il problema l'avevamo visto qualche post fa 🙂
    Praticamente se io inserisco questo codice php non ci sono problemi:

    [PHP]<?php
    $testo_base = isset($_POST['testobase']) ? $_POST['testobase'] : '';

    $variazione[1] = "
    ciao<form id="form1" name="form1" method="post" action="">
    <input type="hidden" name="testobase" value="$testo_base" />
    <input type="submit" value="Aggiungi seconda variazione" />
    <input type="hidden" name="variazione" value="2">
    </form>";
    $variazione[2] = "
    mamma<form id="form1" name="form1" method="post" action="">
    <input type="hidden" name="testobase" value="$testo_base" />
    <input type="submit" value="Aggiungi terza variazione" />
    <input type="hidden" name="variazione" value="3">
    </form>";
    $variazione[3] = "
    guarda<form id="form1" name="form1" method="post" action="">
    <input type="hidden" name="testobase" value="$testo_base" />
    <input type="submit" value="Aggiungi quarta variazione" />
    <input type="hidden" name="variazione" value="4">
    </form>";
    $variazione[4] = "
    come<form id="form1" name="form1" method="post" action="">
    <input type="hidden" name="testobase" value="$testo_base" />
    <input type="submit" value="Aggiungi quinta variazione" />
    <input type="hidden" name="variazione" value="5">
    </form>";
    $variazione[5] = "mi diverto";

    if(!isset($_POST['variazione']))
    echo $variazione[1];
    elseif(is_numeric($_POST['variazione']) && isset($variazione[$_POST['variazione']]))
    for($i=1; $i<=$_POST['variazione']; $i++)
    echo $variazione*;

    echo "<form id="form1" name="form1" method="post" action="">
    <input type="submit" value="Torna indietro" />
    <input type="hidden" name="variazione" value="".($_POST['variazione']-1)."">
    </form>";
    ?>[/PHP]

    Adesso, quando io aggiungo un modulo all'esterno

    [PHP]<form id="form1" name="form1" method="post" action="a.php">
    <p>nome
    <label for="campo"></label>
    <input type="text" name="campo" id="campo" />
    </p>
    <p><?php .... ?>
    </p>
    <p>
    <input type="submit" name="Invia" id="Invia" value="Invia" />
    </p>
    </form>
    [/PHP]

    Appena clicco su "Aggiungi variazione" questa volta invece mi manda su a.php, perché giustamente nella gabbia esterna ACTION dice che al pigiare di un tasto form deve direzionare su "a.php". Come posso evitare questo? :arrabbiato:


  • User Attivo

    Le informazioni contenute nell'array $_POST si perdono cambiando pagina.
    Se vuoi mantenerle ti conviene utilizzare le sessioni...

    Ad esempio potresti utilizzare questo codice nella pagina che riceve i dati dal form

    
    session_start();
    foreach ($_POST as $k => $v)
    {
    $_SESSION[$k]=$v;
    }
    
    

    In questo modo, gli stessi dati in $_POST che perderesti cambiando pagina, te li ritrovi, con gli stessi indici, in $_SESSION su tutte le pagine dove la sessione è aperta con session_start() fino alla chiusura del browser.


  • User Attivo

    Perfetto, ma siccome i dati che andrei ad immettere sono davvero tanti, non è che poi appesantisco il database ?


  • User Attivo

    Se c'è un modo per mantenere il classico _POST credo sia meglio, cmq ti ringrazio per il codice delle sessioni (che mi tornerà senza dubbio utile!)


  • User Attivo

    Per mantenere il post lo devi reinviare con un altro form... dipende come è strutturata l'applicazione.
    Se devi passare da una pagina all'altra cliccando su un link basta mettere un form al posto del link, con tutti i campi nascosti che duplicano il form iniziale.
    Poi, nella pagina successiva, devi acquisire nuovamente i dati e ripetere la procedura per passare ad un'altra pagina...

    Un po' macchinoso.

    Comunque, sessioni e database sono due cose diverse.


  • User Attivo

    Ok, nella prima pagina "a.php" apro la sessione e avvio il ciclo foreach, ad esempio qui ho un campo "nome", nella seconda pagina "b.php" come richiamo faccio a richiamarla?


  • User Attivo

    Se, ad esempio, nel form hai:

    <input name="nome1" />

    inviando il form, nella pagina che riceve i dati avrai:

    $_POST['nome1']='quello che hai digitato nel campo input';

    Ora, se cambi pagina perdi il valore di $_POST ovverosia $_POST['nome1'] non conterrà più nulla...
    Se però "copi" il contenuto di $_POST in $_SESSION tramite il codice che ho postato prima, ti ritroverai:

    $_SESSION['nome1']='quello che hai digitato nel campo input';

    in tutte le pagine php con sessione avviata e non perderai il valore contenuto sino alla chiusura del browser o alla scadenza della sessione.

    Chiaro?

    Prova tu stesso: www.tigrone.altervista.org/prova_post.php
    Noterai che, nella prima pagina dopo il form, hai i 2 array con i valori memorizzati... se clicchi sul link della pagina successiva, l'array post sarà vuoto mentre la sessione mantiene i dati memorizzati.


  • User

    Ciao,
    prova a fare così:

    <form id="form1" name="form1" method="post" action="a.php">
    <input type="input" name="variabile" value="Variabile">
    <input type="submit" name="zz" value="Invia" />
    </form>

    Ecco adesso il form invia alla pagina a.php
    ti puoi fare la seguente condizione in alto alla pagina a.php:

    <?php
    if ($_POST['zz']){
    $variabile = mysql_real_escape_string($_POST['variabile']);
    header("Location: b.php?variabile=$variabile");
    }
    ?>

    Mentre nella pagina b.php fai la condizione:
    $variabile = mysql_real_escape_string($_GET['variabile']);

    echo $variabile; //ECCO LA NOSTRA VARIABILE NELLA PAGINA B.PHP

    Fammi sapere.. 🙂


  • User Attivo

    Lui parlava di "veramente tanti dati" quindi passare stringhe col metodo GET non mi sembra appropriato...

    La funzione mysql_real_escape_string() si usa appena prima di inserire i dati nel db... e una volta sola; nel codice che hai postato non ti permetterebbe di recuperare il valore originale immesso nel campo input se quest'ultimo contenesse un apice o un doppio.


  • User

    Ciao,
    allora fai conto che nella pagina b.php lui vorrebbe inserire i dati nel database e tu metti il controllo solo una volta chiunque può manomettere il link..!
    nella pagina b.php se vuole inserire i dati nel database deve per sicurezza lasciare mysql_real_escape_string...

    poi se più esperto di me vedi tu.. 🙂

    Grazie


  • User Attivo

    Boh... sono disarmato...

    Hai letto cosa ho scritto?

    E hai testato il codice che hai postato?


  • User

    ciao,
    si ho testato..
    il primo mysql_real_escape_string si può evitare..

    boh non lo so..

    grazie


  • User Attivo

    Grazie per le soluzioni, in questo caso ho cambiato la struttura evitando il problema, tuttavia rimane la curiosità: se qualcuno sa risolvere il quesito sarebbe interessante! 🙂


  • ModSenior

    Il POST non puoi reinviarlo mediante un redirect normale, dovresti mandare un output con un form che venga inviato automaticamente in javascript. Non è il massimo da fare come cosa.

    Comunque solitamente si tende ad utilizzare di più il database, piuttosto che fare operazioni di questo tipo, per fare inserimenti multipli di qualcosa.