• User Attivo

    problema redirect inserimento dati

    Buongiorno a tutti,

    ho un form di inserimento dati:

    [PHP]
    <?php include("../include/header.php"); ?>
    <div id="categoria">
    <form method="post" action="insert.php">
    <p>Nome</p>
    <input name="nome" type="text" class="campi" placeholder="Inserisci il Nome della Categoria">
    <p>Title</p>
    <input name="title" type="text" class="campi" placeholder="Inserisci il Title della Categoria">
    <p>Description</p>
    <input name="description" type="text" class="campi" placeholder="Inserisci la Description della Categoria">
    <p>Keywords</p>
    <input name="keywords" type="text" class="campi" placeholder="Inserisci le Keywords della Categoria">
    <p>Descrizione</p>
    <input name="descrizione" type="text" class="campi" placeholder="Inserisci la Descrizione della Categoria">
    <input name="submit" type="submit" value="invia" id="conferma">
    </form>
    </div>
    <?php include("../include/footer.php"); ?>
    [/PHP]

    insert.php

    [PHP]
    <?php include("../config.php"); ?>
    <?php
    $nome = $_POST['nome'];
    $title = $_POST['title'];
    $description = $_POST['description'];
    $keywords = $_POST['keywords'];
    $descrizione = $_POST['descrizione'];
    $sql = "INSERT INTO categorie (nome,title,description,keywords,descrizione) VALUES
    ('$nome','$title','$description','$keywords','$descrizione')";
    header('location:crea_categoria.php');
    ?>
    [/PHP]

    quello che vorrei, ho provato in diversi modi ma non ci riesco :x, è che una volta inseriti i dati e cliccato su "invia" mi rimandasse allo stesso form, ma con i campi appena compilati;

    spero di essermi spiegato bene

    ringrazio in anticipo per le risposte
    buona serata


  • User Attivo

    La soluzione più semplice è che entrambi i codici siano sulla stessa pagina, ovvero che "action" richiami se stessa. La seconda ipotesi è mettere i valori in variabili $_SERVER (comunque sconsigliata), la terza è mettere in variabili $_GET se i valori sono piccoli (comunque sconsigliata).

    Ciao


  • User Attivo

    Ciao oslino, e come si fa?
    Io di solito faccio una pagina con il form; questa poi ne chiama un'altra che inserisce i dati nel db. È l'unico sistema che conosco...
    Se hai qualche suggerimento benvenga 🙂 grazie 1000 e buonanotte!


  • User Attivo

    Potresti anche pensare di inserire i dati tramite ajax e lasciare sempre l'utente su quella pagina.
    qua trovi una breve guida
    http://www.targetweb.it/ajax-form-invio-dati-via-post/


  • Moderatore

    Tutte soluzioni, ma nessuno che spiega mai il perchè...

    All'interno del tuo form, cicli già come se ci fossero i value riempiti, recuperando un ipotetico id dalla variabile get.
    Quindi scriveresti:
    if( !empty( $_GET['id'] ) {
    // form già compilato con recupero dati dal database
    } else {
    // form da compilare
    }

    Ovviamente, nel tuo script di insert devi poi valutare le ipotesi di:
    insert se l'id non è presente
    update se esiste l'id

    e se fai insert recuperare l'ultimo valore inserito con la funzione mysql_insert_id() e passarlo in get al form.
    Ti faccio un esempio del tuo file che genera l'insert:

    
    <?php include("../config.php"); ?>
    <?php
    if( empty($_POST['id']) || $_POST['id'] == '' ) { // ovviamente nel form devi anche avere un campo hidden con l'id se necessario
        $nome = $_POST['nome'];
        $title = $_POST['title'];
        $description = $_POST['description'];
        $keywords = $_POST['keywords'];
        $descrizione = $_POST['descrizione'];
        $sql = "INSERT INTO categorie (nome,title,description,keywords,descrizione) VALUES
        ('$nome','$title','$description','$keywords','$descrizione')";
    	$id = mysql_insert_id(); // recupero l'ultimo valore ottenuto
        header('location:crea_categoria.php?id=' . $id);
    } else {
    	$nome = $_POST['nome'];
        $title = $_POST['title'];
        $description = $_POST['description'];
        $keywords = $_POST['keywords'];
        $descrizione = $_POST['descrizione'];
        $sql = "UPDATE categorie SET nome = '$nome', title = '$title', description = '$description', keywords = '$keywords, descrizione = '$descrizione' WHERE id = '" . $_POST['id'] . "'";
        header('location:crea_categoria.php?id=' . $_POST['id']);
    }
    ?>
    
    

  • User Attivo

    Buongiorno a tutti,

    scusate il ritardo nella risposta; ho provato diverse soluzioni ma nulla;

    forse dovrebbe essere una cosa del genere:

    [PHP]
    <?php include("../include/header.php"); ?>

    <!-- QUI UNA QUERY? -->

    <? if(empty( $_GET['id']) //QUI UNA COSA DEL TIPO SE NON è PRESENTE L'ID della CATEGORIA FAMMI VEDERE QUESTO FORM ALTRIMENTO L'ALTRO

    {
    // INSERISCI CATEGORIA
    echo"<div id='categoria'>
    <form method='post' action='insert.php'>
    <p>Nome</p>
    <input name='nome' type='text' class='campi' placeholder='Inserisci il Nome della Categoria'>
    <p>Title</p>
    <input name='title' type='text' class='campi' placeholder='Inserisci il Title della Categoria'>
    <p>Description</p>
    <input name='description' type='text' class='campi' placeholder='Inserisci la Description della Categoria'>
    <p>Keywords</p>
    <input name='keywords' type='text' class='campi' placeholder='Inserisci le Keywords della Categoria'>
    <p>Descrizione</p>
    <input name='descrizione' type='text' class='campi' placeholder='Inserisci la Descrizione della Categoria'>
    <p>Visibile</p>
    <select name='visibile'>
    <option>no</option>
    <option>si</option>
    </select>
    <input name='submit' type='submit' value='invia' id='conferma'>
    </form>
    </div>";
    }

    else

    {
    // MODIFICA CATEGORIA

    <div id='categoria'>

            $sql = "SELECT * FROM categorie WHERE categoria_id = '".$_GET['categoria_id']."'";
            $ret = mysqli_query( $db, $sql );
            while ($row = mysqli_fetch_assoc($ret)){
            print "
            <form method='post' action='update.php'>
            <p>Nome</p>
            <input name='nome' type='text' value='".$row['nome']."' class='campi'>
            <p>Title</p>
            <input name='title' type='text' value='".$row['title']."' class='campi'>
            <p>Description</p>
            <input name='description' type='text' value='".$row['description']."' class='campi'>
            <p>Keywords</p>
            <input name='keywords' type='text' value='".$row['keywords']."' class='campi'>
            <p>Descrizione</p>
            <input name='descrizione' type='text' value='".$row['descrizione']."' class='campi'>
            <select name='visibile'>
            ";
            
            
                if($row['visibile'] == "si")
                    {
                        echo "
                            <option selected>si</option>
                            <option>no</option>
                        ";
                    }
                else{
                        echo "
                            <option>si</option>
                            <option selected>no</option>
                        ";                    
                }
    
            print "
            </select>
    
            <input name='submit' type='submit' value='invia' id='conferma'>
            </form>
            ";
            }         
    

    </div>
    }

    <?php include("../include/footer.php"); ?>
    [/PHP]

    dovrei mettere una query in testa al documento però ma quale?
    poi io appena compilo il form vorrei che mi rimandasse al form con i dati appena inseriti.

    per cui devo inserire qualcosa sui file insert.php e update.php

    che attualmente sono così:

    insert.php
    [PHP]
    <?php include("../config.php"); ?>
    <?php
    $nome = $_POST['nome'];
    $title = $_POST['title'];
    $description = $_POST['description'];
    $keywords = $_POST['keywords'];
    $descrizione = $_POST['descrizione'];
    $visibile = $_POST['visibile'];
    $sql = "INSERT INTO categorie (nome,title,description,keywords,descrizione,visibile) VALUES ('$nome','$title','$description','$keywords','$descrizione','$visibile')";
    $ret = mysqli_query( $db, $sql );
    header('location:crea_categoria.php'); //QUI CI VUOLE UNA COSA DEL TIPO RIMANDAMI AL FORM COMPILATO CON I DATI CHE HAI APPENA INSERITO
    ?>
    [/PHP]

    update.php
    [PHP]
    <?php include("../config.php"); ?>
    <?php
    $categoria_id = $_GET['categoria_id'];
    $nome = $_POST['nome'];
    $title = $_POST['title'];
    $description = $_POST['description'];
    $keywords = $_POST['keywords'];
    $descrizione = $_POST['descrizione'];
    $visibile = $_POST['visibile'];
    $sql = "UPDATE categorie SET nome='$nome',title='$title',description='$description',keywords='$keywords',descrizione='$descrizione',visibile='$visibile' WHERE categoria_id='$categoria_id'";
    $ret = mysqli_query( $db, $sql );
    header("location:modifica_categoria.php?categoria_id=".$_GET['categoria_id']."");
    ?>
    [/PHP]

    bho... non ne do fuori.

    se qualcuno mi può illuminare ve ne sarei grato

    buone feste a tutti


  • User Attivo

    Questo è quello che intendevo quando dicevo che la "pagina chiama se stessa".
    Un solo file che fa tutto e ti ritrovi i campi compilati.
    Poi dovrai modificarlo in base alle tue esigenze per fare anche un eventuale update.
    [PHP]
    <?php include("../config.php");
    $nome = FALSE;
    $title = FALSE;
    $description = FALSE;
    $keywords = FALSE;
    $descrizione = FALSE;

    if(isset($_POST['submit'])){
        $nome = $_POST['nome'];
        $title = $_POST['title'];
        $description = $_POST['description'];
        $keywords = $_POST['keywords'];
        $descrizione = $_POST['descrizione'];
        $sql = "INSERT INTO categorie (nome, title, description, keywords, descrizione) VALUES ('$nome','$title','$description','$keywords','$descrizione')";
    }
    

    ?>

    <?php include("../include/header.php"); ?>
    <div id="categoria">
    <form method="post" action="#"> <!-- la pagina richiama se stessa -->
    <p>Nome</p>
    <input name="nome" type="text" class="campi" placeholder="Inserisci il Nome della Categoria" <?php if($nome) echo "value='$nome'"; ?>>
    <p>Title</p>
    <input name="title" type="text" class="campi" placeholder="Inserisci il Title della Categoria" <?php if($title) echo "value='$title'"; ?>>
    <p>Description</p>
    <input name="description" type="text" class="campi" placeholder="Inserisci la Description della Categoria" <?php if($description) echo "value='$description'"; ?>>
    <p>Keywords</p>
    <input name="keywords" type="text" class="campi" placeholder="Inserisci le Keywords della Categoria" <?php if($keywords) echo "value='$keywords'"; ?>>
    <p>Descrizione</p>
    <input name="descrizione" type="text" class="campi" placeholder="Inserisci la Descrizione della Categoria" <?php if($descrizione) echo "value='$descrizione'"; ?>>
    <input name="submit" type="submit" value="invia" id="conferma">
    </form>
    </div>
    <?php include("../include/footer.php"); ?>
    [/PHP]
    Ciao.


  • User Attivo

    ciao oslino,

    ho provato ma non funziona; i campi compliati rimangono, ma non me li inserisce nel db;

    grazie per la risposta
    buona giornata


  • User Attivo

    Il codice che ho postato è parziale, non può funzionare correttamente. E' un esempio di come impostare i campi del form. Come avevo scritto, devi modificarlo in base alle tue esigenze. Manca per esempio la funzione mysqli_query() che effettua l'inserimento. Aggiungilo e vedrai che già funziona. Per fare una cosa fatta bene ci vorrebbe anche la validazione dei campi, la gestione degli errori ecc, ma il codice che ti ho scritto è già funzionale per quel che ti serve.
    [PHP]
    <?php include("../config.php");
    $nome = FALSE;
    $title = FALSE;
    $description = FALSE;
    $keywords = FALSE;
    $descrizione = FALSE;

    if(isset($_POST['submit'])){
        $nome = $_POST['nome'];
        $title = $_POST['title'];
        $description = $_POST['description'];
        $keywords = $_POST['keywords'];
        $descrizione = $_POST['descrizione'];
        $sql = "INSERT INTO categorie (nome, title, description, keywords, descrizione) VALUES ('$nome','$title','$description','$keywords','$descrizione')";
        mysqli_query($connect, $sql); // ***** riga da aggiungere *****
     }
    

    ?>

    <?php include("../include/header.php"); ?>
    <div id="categoria">
    <form method="post" action="#"> <!-- la pagina richiama se stessa -->
    <p>Nome</p>
    <input name="nome" type="text" class="campi" placeholder="Inserisci il Nome della Categoria" <?php if($nome) echo "value='$nome'"; ?>>
    <p>Title</p>
    <input name="title" type="text" class="campi" placeholder="Inserisci il Title della Categoria" <?php if($title) echo "value='$title'"; ?>>
    <p>Description</p>
    <input name="description" type="text" class="campi" placeholder="Inserisci la Description della Categoria" <?php if($description) echo "value='$description'"; ?>>
    <p>Keywords</p>
    <input name="keywords" type="text" class="campi" placeholder="Inserisci le Keywords della Categoria" <?php if($keywords) echo "value='$keywords'"; ?>>
    <p>Descrizione</p>
    <input name="descrizione" type="text" class="campi" placeholder="Inserisci la Descrizione della Categoria" <?php if($descrizione) echo "value='$descrizione'"; ?>>
    <input name="submit" type="submit" value="invia" id="conferma">
    </form>
    </div>
    <?php include("../include/footer.php"); ?>
    [/PHP]
    Ciao.


  • User Attivo

    ciao oslino,

    funziona correttamente grazie 1000!

    l'unica cosa è che se clicco sul submit 2 o 3 volte lui mi inserisce il record 2 o 3 volte,

    se modifico il record che ho inserito me lo inserisce nuovamente;

    io vorrei che una volta cliccato sul submit lui prenda sempre quello, se lo modifico che modifico sempre lo stesso, non che me ne crei di nuovi;

    non so se è fattibile

    grazie 1000 cmq
    ho imparato una cosa nuova
    😄


  • User Attivo

    Come ti ho detto devi modificarlo in base alle tue esigenze per fargli fare un UPDATE. Devi adattarlo in un misto tra il codice dell'amico "Ultima" e il mio, recuperando l'ultimo ID e facendoglielo passare al SUBMIT... Sia il codice INSERT che UPDATE devono stare nello stesso file, separati da un IF... ELSE... (oppure usi Ajax come consigliato dall'amico PietroR).


  • User Attivo

    ... che poi a pensarci bene potresti mettere l'ID un una variabile $_SERVER, magari distruggendola alla fine dello script. Ti semplificheresti di molto le cose e ne guadagneresti da subito in sicurezza.
    Ciao.


  • User Attivo

    Ciao oslino, grazie per la pazienza e la disponibilità; perdona l'ignoranza ma non sono ferrato in materia, mi sono avvicinato da poco al php; cosa intendi dicendo: "mettere l'ID un una variabile $_SERVER, magari distruggendola alla fine dello script. Ti semplificheresti di molto le cose e ne guadagneresti da subito in sicurezza"

    Grazie ancora e buonanotte
    Porta pazienza oslino sto imparando 🙂


  • User Attivo

    PERDONAMI, HO SCRITTO $_SERVER ma volevo dire $_SESSION.

    Detta in soldoni, devi partire dal presupposto che le connessioni alle pagine di un sito sono "stateless" ovvero non hanno memoria delle pagine precedenti. Se definisci una variabile "$a=300" nella pagina page1.php e poi vai nella pagina page2.php, la variabile "$a" non esisterà più perchè era definita solo nella page1.php
    Per trasportarla nella page2.php dovresti indicarla nell'URL "page2.php?a=300"

    $_SESSION è una variabile superglobale (in realtà è un array) che viene definita nella memoria del server stesso ed è visibile sia all'interno che all'esterno delle funzioni **php.net/manual/en/reserved.variables.session.php
    **
    Quindi se tu in page1.php definisci $_SESSION['a'] = 300 e poi vai nella page2.php e scrivi **echo $_SESSION['a'] **ti verrà stampato 300 pur non avendola passata nè in GET nè in POST.
    Essendo nella memoria del server (limitata) e se si ha molto traffico sul server (utenti) è bene distruggerla quando non serve più per liberare la memoria stessa.

    Mentre una variabile passata via GET o POST è facilmente modificabile dal browser, $_SESSION non lo è e ti eviti tante grane di sicurezza.

    Tutte le pagine che fanno uso di $_SESSION devono iniziare con la funzione session_start() per far capire al server che in quello script vuoi utilizzare le variabili di sessione.

    Ciao.


  • User Attivo

    Ciao Oslino,

    grazie del consiglio, conosco le sessioni perchè le ho usate un po';

    cmq ho risolto, funziona!

    ti posto il codice così mi dai un opinione:

    crea_categoria.php
    [php]
    <?php include("../include/header.php"); ?>
    <div id="categoria">
    <form method="post" action="insert.php">
    <p>Nome</p>
    <input name="nome" type="text" class="campi" placeholder="Inserisci il Nome della Categoria">
    <p>Title</p>
    <input name="title" type="text" class="campi" placeholder="Inserisci il Title della Categoria">
    <p>Description</p>
    <input name="description" type="text" class="campi" placeholder="Inserisci la Description della Categoria">
    <p>Keywords</p>
    <input name="keywords" type="text" class="campi" placeholder="Inserisci le Keywords della Categoria">
    <p>Descrizione</p>
    <input name="descrizione" type="text" class="campi" placeholder="Inserisci la Descrizione della Categoria">
    <p>Visibile</p>
    <select name="visibile">
    <option>no</option>
    <option>si</option>
    </select>
    <input name="submit" type="submit" value="invia" id="conferma">
    </form>
    </div>
    <?php include("../include/footer.php"); ?>
    [/php]

    insert.php
    [php]
    <?php include("../config.php"); ?>
    <?php
    $nome = $_POST['nome'];
    $title = $_POST['title'];
    $description = $_POST['description'];
    $keywords = $_POST['keywords'];
    $descrizione = $_POST['descrizione'];
    $visibile = $_POST['visibile'];
    $sql = "INSERT INTO categorie (nome,title,description,keywords,descrizione,visibile) VALUES ('$nome','$title','$description','$keywords','$descrizione','$visibile')";
    $ret = mysqli_query( $db, $sql );

    $sql = "SELECT * FROM categorie ORDER BY categoria_id DESC LIMIT 0, 1;";
    $ret = mysqli_query( $db, $sql );
    while ($row = mysqli_fetch_assoc($ret)){
    header("location:modifica_categoria.php?categoria_id=".$row['categoria_id']."");
    //echo $row['categoria_id'];
    }
    

    ?>
    [/php]

    modifica_categoria.php
    [php]
    <?php include("../include/header.php"); ?>
    <div id="categoria">

        <?php
                        
            $sql = "SELECT * FROM categorie WHERE categoria_id = '".$_GET['categoria_id']."'";
            $ret = mysqli_query( $db, $sql );
            while ($row = mysqli_fetch_assoc($ret)){
            print "
            <form method='post' action='update.php?categoria_id=".$_GET['categoria_id']."'>
            <p>Nome</p>
            <input name='nome' type='text' value='".$row['nome']."' class='campi'>
            <p>Title</p>
            <input name='title' type='text' value='".$row['title']."' class='campi'>
            <p>Description</p>
            <input name='description' type='text' value='".$row['description']."' class='campi'>
            <p>Keywords</p>
            <input name='keywords' type='text' value='".$row['keywords']."' class='campi'>
            <p>Descrizione</p>
            <input name='descrizione' type='text' value='".$row['descrizione']."' class='campi'>
            <select name='visibile'>
            ";
            
            
                if($row['visibile'] == "si")
                    {
                        echo "
                            <option selected>si</option>
                            <option>no</option>
                        ";
                    }
                else{
                        echo "
                            <option>si</option>
                            <option selected>no</option>
                        ";                    
                }
    
            print "
            </select>
    
            <input name='submit' type='submit' value='invia' id='conferma'>
            </form>
            ";
            }
        ?>
    

    </div>
    <?php include("../include/footer.php"); ?>
    [/php]

    update.php
    [php]
    <?php include("../config.php"); ?>
    <?php
    $categoria_id = $_GET['categoria_id'];
    $nome = $_POST['nome'];
    $title = $_POST['title'];
    $description = $_POST['description'];
    $keywords = $_POST['keywords'];
    $descrizione = $_POST['descrizione'];
    $visibile = $_POST['visibile'];
    $sql = "UPDATE categorie SET nome='$nome',title='$title',description='$description',keywords='$keywords',descrizione='$descrizione',visibile='$visibile' WHERE categoria_id='$categoria_id'";
    $ret = mysqli_query( $db, $sql );
    header("location:modifica_categoria.php?categoria_id=".$_GET['categoria_id']."");
    ?>
    [/php]

    di fatto dopo l'insert dei dati sul db, ho interrogato il db dicendo: estrai l'ultima categoria con id più alto;
    mandami alla view di modifica categoria con id più alto, che di fatto è l'ultima inserita.

    grazie di tutto
    buonanotte
    😄


  • User Attivo

    Non sarà una soluzione da manuale, ma se funziona vuole dire che va bene 🙂 . Col tempo imparerai altri modi per fare le stesse cose con meno codice.
    L'unico suggerimento che ti do è sul modo di estrarre l'ultima categoria. Invece di fare la query puoi utilizzare la funzione mysqli_insert_id() che ritorna l'ultimo ID inserito:

    insert.php
    [PHP]
    <?php include("../config.php"); ?>
    <?php
    $nome = $_POST['nome'];
    $title = $_POST['title'];
    $description = $_POST['description'];
    $keywords = $_POST['keywords'];
    $descrizione = $_POST['descrizione'];
    $visibile = $_POST['visibile'];
    $sql = "INSERT INTO categorie (nome,title,description,keywords,descrizione,visibile) VALUES ('$nome','$title','$description','$keywords','$descrizione','$visibile')";
    $ret = mysqli_query( $db, $sql );
    $ultimoID = mysqli_insert_id($db); // RECUPERA L'ULTIMO ID
    header("location:modifica_categoria.php?categoria_id=". $ultimoID ."");
    ?>
    [/PHP]
    Ti risparmi 4 righe di codice e un'inutile lavoro del database. 🙂
    Ciao.


  • User Attivo

    grazie 1000 oslino,

    il tuo aiuto è stato preziosissimo;

    grazie davvero
    alla prossima