form

emanuele.cescon

Nuovo Utente
2 Apr 2016
13
7
3
Ciao a tutti.
Ho un problema che non riesco a spiegarmi...

Ho realizzato un form di esempio in php (non conosco molto questo linguaggio)
dove creo un DB e una tabella fissi.

Il primo form funziona e database e tabella vengono creati.

Poi faccio una select sulla tabella, e genero una griglia di dati.

E va bene.

Poi ho creato un secondo form dove dentro metto una serie di campi per aggiungere un nuovo elemento e un pulsante submit...
e funziona

Poi nella griglia dei dati che visualizzo con la select, ho messo due pulsanti "modifica" e "delete"...
e non funziona..
il secondo form, quello che contiene i pulsanti modifica e cancella, non invia i dati quando il pulsante non viene premuto.
Il pulsante "modifica" è un submit e io vado a testare quando questo viene premuto (questo funziona, perchè ho provato a redirezionarlo ad una pagina diversa prima di raccogliere i dati e ha funzionato.

Quello che non capisco è perchè non raccoglie i dati tramite $_POST

Sapreste darmi qualche suggerimento?
 

f107

Utente Attivo
7 Ago 2012
206
6
18
Roma
Ciao!
Potresti mettere il codice "incriminato"?

Così a scatola chiusa mi viene da chiederti se il method del form è in POST, in caso, solo per prova, potresti mettere sulla pagina che non riceve i dati un dump di $_REQUST per vedere se i dati effettivamente arrivano.

Facci sapere.
 

emanuele.cescon

Nuovo Utente
2 Apr 2016
13
7
3
Ciao f107.. si si i form sono tutti e due con method=post

ho creato una pagina di prova che fa solo la raccolta della chiamata del action, e le variabili, raccolte con $_POST arrivano vuote..
Non riesco proprio a capire dove ci sia un errore...
Sono anche nuovo di PHP ma tempo fa usavo ASP e poi ASP net... mai avuto questo problema.
Pensavo che il problema fosse nella presenza di due form e tre submit, ma ho visto, in un tutorial che si può tranquillamente agire in base al nome del submit valutandone il settaggio e agendo di conseguenza...

Ho pensato anche che i campi di input non ricevessero il valore, ma se io a video lo leggo il valore, vuol dire che la select ha letto e messo a video i dati...e se sono nelle aree di input, quando premo il pulsante modifica, il modulo form viene reinviato con tutti i dati al seguito....

non so... diciamo che sono basito
 

emanuele.cescon

Nuovo Utente
2 Apr 2016
13
7
3
Inoltre sono sicuro che funzioni, perchè dopo aver creato la classe, ho provato tutti i singoli elementi uno ad uno, dalla creazione del DB, sino a provare le 4 operazioni di base (Select, insert, update, delete) tutte con esito positivo e funzionanti.
Quindi è proprio solo la raccolta delle info dal form che non va!
 

f107

Utente Attivo
7 Ago 2012
206
6
18
Roma
Senza vedere i codice non possiamo aiutarti tantissimo... Non puoi mettere neanche l'html del form?
Più submit in un form non dovrebbero essere un problema.
Proviamo ad andare ancora alla cieca... Da quel che so se i dati non passano da un form ad una pagina quando:
  • gli input nel form non hanno name, in questo caso l'invio del form non aggiungere parametri alla richiesta HTTP
  • il method del form è diverso da quello che ti aspetti
Non avendo altre info non sono in grado di dirti altro.

Facci sapere.
 

emanuele.cescon

Nuovo Utente
2 Apr 2016
13
7
3
certo che posso..pensavo no si potesse inserire codice qui...

metto il codice di entrambe le pagine... anche se mi pare di aver notato che lui modifica l'ultimo record...quindi manca il rilevamento del record dove io ho cliccato sul form...
Codice:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Creazione di una Database e di una tabella con OOP</title>
<link rel="stylesheet" href="style.css" >

</head>

<body>


<?php
$errorMessage="";

include("clasfordb.php");

$myDB = new myUseDB("localhost", "root", "");
$myDB->openConnDB();

$fine=false; //flag di controllo: diventa true se l'invio è andato a buon fine (e quindi impedisce al form di mostrarsi)
if (isset($_REQUEST['Message'])){
    $errorMessage = $_REQUEST['Message']; // ritorno la stringa di errore
}
if (isset($_REQUEST['result'])){
    $result = $_REQUEST['result']; //ritorno l'esito della select

}

//controllo dei dati e stampa dell'anagrafica
if(isset($_POST['invio'])){
    $nomedb = $_POST['nomeDB'];
    $tabname = $_POST['nomeTAB'];
    $myDB->CreateDB( $nomedb );
    $myDB->createTAB( $tabname );
   
    $fine=true;          
}


//form di partenza
if(!$fine){
?>
<div class="container">
<div class="section">
    <div class="row">
        <div class="intestazione">
            <h4>Modulo gestione dati</h4>
        </div>    <!-- intesstazione -->
    </div> <!-- row -->
</div> <!-- section intestazione -->
<div class="section">
    <div class="row">
        <div class="moduloDB">
            <form action="" method="post" style="margin-top:30px;">     
                <div class="riga">
                    <div class="left">Nome DataBase:</div>
                    <div class="right"><input type="text" name="nomeDB" value="<?php if(isset($_POST['nomeDB'])) echo $_POST['nomeDB'];?>" /></div>
                </div>
   
                <div class="riga">
                    <div class="left">Nome Tabella:</div>
                    <div class="right"><input type="text" name="nomeTAB" value="<?php if(isset($_POST['nomeTAB'])) echo $_POST['nomeTAB'];?>" /></div>
                </div>
   
                <div class="riga">
                    <div class="left"></div>
                    <div class="right"><input type="submit" value="Invia" name="invio" /></div>
                </div>
            </form>
           </div><!-- moduloDB -->
    </div><!-- row -->
</div><!-- section database -->
<div class="section">
    <div class="row">
        <div class="errormessage">
            <?php
             // area riservata alla visualizzazione dei messaggi di errore
            if($errorMessage != "" ) { echo $errorMessage;}
            ?>
        </div> <!-- error message -->
    </div><!-- row -->
</div> <!-- section messaggi di errore -->
<?php
}
?>

<?php
// controllo variabili raccolte

if(isset($_POST['id'] ) ) {$id = $_POST['id'];}
if(isset($_POST['nome'] ) ){ $nome = $_POST['nome']; }
if(isset($_POST['email'] ) ){ $email = $_POST['email'];}
if(isset($_POST['anno'] ) ){ $anno = $_POST['anno'];}

$myDB->useDB('dbprovasql');
$result = $myDB->SelectRec('tabprova');

if(isset($_POST['inserisci'])){
   $myDB->useDB('dbprovasql');
   $esito = $myDB->InsertIn('tabprova', $_POST['nome'], $_POST['email'], $_POST['anno']);
   if($esito){
       $_POST['nome']  = "";
       $_POST['email'] = "";
       $_POST['anno'] = "";
       header('Location: modulo_dati.php');
   }
}

if(isset($_POST['modifica'])){
   $myDB->useDB('dbprovasql');
   $myDB->UpdateIn('tabprova', $_POST['id'], $_POST['nome'], $_POST['email'], $_POST['anno']);
   header('Location: pippo.php');
}

if(isset($_POST['cancella'])){
   $myDB->useDB('dbprovasql');
   echo  $_POST['id'];
   $myDB->DeleteRec('tabprova', $_POST['id']);
   header('Location: modulo_dati.php');
}

//
?>
          
<form action="modulo_dati.php" method="post">
<div class="section">
    <div class="row">

    <h4>Si da per prensunto l'utilizzo di un DB e di una tabella precise, già presenti nel server<br />
    e realizzati nell'ultima lezione del corso.</h4>
    <!-- Il db fu generato con questa medesima applicazione (e se non lo avete potete farlo dalla maschera di input
    che si vede nell'esercizio, dando come nomne fisso del DB "dbprovasql"
    mentre la tabella viene generata in automatico dalla classe  -->

    </div><!-- row -->
</div><!--  section -->
<div class="section">
    <div class="row">
        <div class="insertRec">
            <table>   
                <tr><!-- riga dati da ripetere -->
                    <td>&nbsp;</td>
                    <td><label>Nome:</label></td>
                    <td><label>E-mail:</label></td>
                    <td><label>Anno:</label></td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td></td>
                </tr>           
                <tr><!-- riga dati da ripetere -->
                    <td>&nbsp;</td>
                    <td><input type="text" value="<?php if(isset($_POST['nome'])) echo $_POST['nome'];?>" name="nome" id="nome"></td>
                    <td><input type="text" value="<?php if(isset($_POST['email'])) echo $_POST['email'];?>" name="email" id="email"></td>
                    <td><input type="text" value="<?php if(isset($_POST['anno'])) echo $_POST['anno'];?>" name="anno" id="anno"></td>
                    <td>&nbsp;</td>
                    <td><input type="submit" value="Inserisci" name="inserisci" ID="inserisci"></td>
                    <td></td>
                </tr>
            </table>
        </div>
    </div><!-- row -->
</div><!--  section -->   
<hr size="3" width="90%" />   
<div class="section">
    <div class="row">
        <div class="areaDati">
            <table>
                <tr><!-- riga intestazione colonne -->
                    <td></td><!-- numero riga -->
                    <td> Nome utente </td><!-- campo Nome -->
                    <td> Email utente </td><!-- Campo email -->
                    <td> Anno </td><!-- campo anno -->
                    <td>&nbsp; </td><!-- spazio vuoto -->
                    <td></td><!-- Bottone modifica -->
                    <td></td><!--  bottone elimina -->
                    <td></td><!-- campo di riserva -->
                </tr>   
                <?php
                if ($result->num_rows > 0) {
                    // output data of each row
                    while($row = $result->fetch_assoc()) {
                        echo "<tr><!-- riga dati da ripetere -->";
                        echo "<td><input type='text' value='" .$row['id'] ."' name='id' id='id' size='4'></td>";
                        echo "<td><input type='text' value='".$row['nomeutente']."' name='name' id='name'></td>";
                        echo "<td><input type='text' value='".$row['emailutente']."' name='email' id='email'></td>";
                        echo "<td><input type='text' value='".$row['anno']."' name='anno' id='anno' size='6'></td>";
                        echo "<td>&nbsp;</td>";
                        echo "<td><input type='submit' value='Modifica' name='modifica' id='modifica'></td>";
                        echo "<td><input type='submit' value='Cancella' name='cancella' id='cancella'></td>";
                        echo "<td></td>";
                        echo "</tr>";
                    }
                    echo "</table>";
                } else {
                    echo "<tr><!-- riga dati da ripetere -->";
                    echo "<td> </td>";
                    echo "<td><input type='text' value='' name='id' id='id' size='4'></td>";
                    echo "<td><input type='text' value='' name='email' id='email'></td>";
                    echo "<td><input type='text' value='' name='anno' id='anno' size='6'></td>";
                    echo "<td>&nbsp;</td>";
                    echo "<td><input type='button' value='Modifica' name='modifica' id='modifica'></td>";
                    echo "<td><input type='button' value='Cancella' name='cancella' id='cancella'></td>";
                    echo "<td></td>";
                    echo "</tr>";
                    echo "</table>";
                }
                echo "</table>";   
                 ?>
            </table>
        </div><!--  area dati -->
    </div><!-- row -->
</div><!--  section -->
</form>
</div> <!-- container -->

</body>

</html>


il data base viene generato direttamente in phpmyadmin ed ha nome "dbprovasql" mentre la tabella "tabprova".
 

emanuele.cescon

Nuovo Utente
2 Apr 2016
13
7
3
Questo il codice php delle classi

Codice:
[CODE]<?php



/*

* Questa classe consente di gestire la connessione con il database,

* la creazione di tabelle e la loro gestione

*/

class myUseDB

{

    // Creo le proprietà della classe

    protected $host;

    protected $user;

    protected $pass;

    protected $conn;

  

    protected $dbname;

    protected $sqlconn;

    protected $sqlString;

    protected $result;

    protected $tbname;

    protected $tbuser;

    protected $tbmail;

    protected $tbcode;

    protected $SysMess ="";

  

    public function __construct(string $host, string $user, string $pass){

        // inizializza i parametri della classe con gli elementi che riceve da fuori

        $this->host = $host;

        $this->pass = $pass;

        $this->user = $user;

    }

  

    function __destruct(){

        // ripulisce le aree di memoria e le key usate nella classe quando esco

       // $this->CloseDB();

    }

  

    public function openConnDB(){

        // apro la connessione al db

        $this->conn = new mysqli($this->host, $this->user, $this->pass);

        if($this->conn->connect_error) {

            die ("Connessione fallita: " . $this->conn->connect_error);

        }

    }

  

    public function CreateDB(string $dbname){

        $this->dbname = $dbname;

        // creo il database

        $this->sqlconn = "CREATE DATABASE IF NOT EXISTS " .$this->dbname . ";";

        if($this->conn->query($this->sqlconn) === true){

            $this->useDB($this->dbname);

        }

    }

  

    public function useDB($nomedb){

        $this->dbname = $nomedb;

        //  attivo (mi assicuro sia selezioanto) il db appena creato

        $sqluse = "USE " . $this->dbname;

        if($this->conn->query($sqluse) === true){

            //

        }



    }

  

    public function createTAB(string $tbname){

      

        // assegno i parametri

        $this->tbname = $tbname;

      

        //Creo le tabelle del db

        // lascio di default la creazione del campo ID

        $this->sqltab = "CREATE TABLE IF NOT EXISTS " . $this->tbname . " (

        id INT(6) AUTO_INCREMENT PRIMARY KEY,

        nomeutente VARCHAR(30) NOT NULL,

        emailutente VARCHAR(50) NOT NULL,

        anno INT(4) );";

      

        if ($this->conn->query($this->sqltab) === TRUE) {

            $this->SysMess = "Table " . $this->tbname . " created successfully<br /><br />";

            header("modulo_dati.php?Message=". $this->SysMess);

        } else {

            $this->SysMess = "Error creating table: " . $this->conn->error . "<br />";

            header("modulo_dati.php?Message=". $this->SysMess);

        }

    }

  

    public function closeDB (){

        // chiudo il db al termine

        //$this->conn->close('dbprovasql');

    }

  

    public function InsertIn($tbname, $name, $email, $anno){

        // inseriamo i dati nella tabella

        $tbname;

        $name;

        $email;

        $anno;

      

        $this->tbname = $tbname;

        $this->name = $name;

        $this->email = $email;

        $this->anno = $anno;

      

        $this->sqlStringa = "";

        $this->sqlStringa = "INSERT INTO ". $this->tbname ." (nomeutente, emailutente, anno) VALUES('"

            . $this->name . "', '" . $this->email . "', '" . $this->anno . "');";

      

        if ($this->conn->query($this->sqlStringa) === TRUE) {

            $this->SysMess = "I dati selezionati sono stati inseriti correttamente<br /><br />";

            header("modulo_dati.php?Message=". $this->SysMess);

            return true;

        } else {

            $this->SysMess = "Errore inserimento dati:  " . $this->conn->error . "<br />";

            header("modulo_dati.php?Message=". $this->SysMess);

        }

    

    }

  

    public function UpdateIn($tbname, $id, $name, $email, $anno){

        // metodo per l'aggiornamento dei dati

    

        $tbname;

        $id;

        $name;

        $email;

        $anno;

      

        $this->tbname = $tbname;

        $this->id = $id;

        $this->name = $name;

        $this->email = $email;

        $this->anno = $anno;

      

        $this->sqlStringa = "";

        $this->sqlStringa = "UPDATE " . $this->tbname ." SET nomeutente= '" . $this->name . "', emailutente= '" . $this->email .

                            "', anno= " . $this->anno . " WHERE id=" . $this->id ." LIMIT 1;";

        if ($this->conn->query($this->sqlStringa) === TRUE) {

            $this->SysMess = "I dati sono stati modificati correttamente.<br /><br />";

            header("modulo_dati.php?Message=". $this->SysMess);

        } else {

            $this->SysMess = "Errore modifica dati:  " . $this->conn->error . "<br />";

        }

    }

  

    public function DeleteRec($tbname, $keyrec){

        // metodo per cancellare i record

        // $keyrec = ID del record da cancellare

        $tbname;

        $keyrec;

      

        $this->tbname = $tbname;

        $this->keyrec = $keyrec;

      

        $this->sqlStringa = "";

        $this->sqlStringa = "DELETE FROM ". $this->tbname ." WHERE ID=" . $this->id . ";";

        if ($this->conn->query($this->sqlStringa) === TRUE) {

            $this->SysMess = "I dati selezionati sono stati cancellati<br /><br />";

            header("modulo_dati.php?Message=". $this->SysMess);

        } else {

            $this->SysMess = "Errore cancellazione dati:  " . $this->conn->error . "<br />";

            header("modulo_dati.php?Message=". $this->SysMess);

        }

    }

  

    public function SelectRec(string $tbname){

        // metodo per la selezione dei record



        $this->tabname = $tbname;

        $this->result;

      

        $this->sqlStringa = "";

        $this->sqlStringa = "SELECT * FROM " . $this->tabname . ";";

        $this->result = $this->conn->query($this->sqlStringa);

      

        if($this->result->num_rows > 0){

            $this->SysMess = "I dati selezionati sono stati estrapolati<br /><br />";

            header("modulo_dati.php?Message=". $this->SysMess . "&result=" .$this->result->num_rows);

            return $this->result;

        } else {

            $this->SysMess = "Errore crezione query : " . $this->conn->error . "<br />";

            header("modulo_dati.php?Message=". $this->SysMess);

        }

  

    }

}



/*



$pippo = new myUseDB("localhost", "root", "");

$pippo->openConnDB();

$pippo->CreateDB("dbprovasql");

$pippo->useDB("tabprova");



// prova inserimento dati

$pippo->insertIn("tabprova", "verdi", "[email protected]", 1966);

$pippo->UpdateIn("tabprova", 12, "bianco", "[email protected]", 1985);

$pippo->DeleteRec("tabprova", 2);

$pippo->SelectRec("tabprova", "*", 2000)



*/

?>
 

f107

Utente Attivo
7 Ago 2012
206
6
18
Roma
Allora ci sono parecchie cose da poter gestire meglio in generale, ma come richiesto mi fermo sulla tua domanda.

Ti confermo il tuo dubbio, tu utilizzi un grande form che contiene tutti i record, ed inserisci per ogni riga di tab degli input della row che vuoi modificare, il problema è proprio qui! Avendo N input con nomi uguali per ogni record tu quando premi un qualsiasi input invii tramite una POST HTTP con tutti i valori di tutti gli input della tabella dei records che hai creato, tutti con gli stessi nomi, e quindi PHP ti torna solo l'ultimo valore che leggi. (per leggere valori con lo stesso nome dovresti usare una cosa simile: <input name="abc[]" value="VALORE" />)

Come si risolve?
Se non vuoi utilizzare altre cose cosa AJAX o simili io creerei un form per ogni riga della tabella, così al click del submit inviigli input solo della riga interessata. Attenzione a non fare form nidificati, non si fa.

Fammi sapere.

P.S. attenzione alle sql injection, e ad usare correttamente la funzione header.
 

emanuele.cescon

Nuovo Utente
2 Apr 2016
13
7
3
Dunque mi stai dicendo che praticamente, dovrei creare una specie di vettore di "submit", caricati con i dati che ricevo dalla select e poi passare il pulsante che corrisponde all'elemento che io voglio modificare....
non me lo ricordavo cosi complicato...

faccio prima a creare una stringa fantasma, caricarla con i dati della riga che voglio modificare e poi passargli solo quella.
Oppure usare un solo pulsante modifica, che quando lo premo intercetta il focus sulla riga e mi invia solo quello.

Vabbeh.. ci provo. Grazie mille
 

f107

Utente Attivo
7 Ago 2012
206
6
18
Roma
Non lo vedo così complesso, se vuoi tenerti sul PHP e basta, senza JS o resto devi avere tanti form quante entità vuoi salvare, una mera questione di HTML (un esempio carino per avere sempre l'effetto tab è questo: https://stackoverflow.com/a/16941843), con il form come hai impostato tu invi un sacco di parametri inutilmente (se hai 10 record nella tabella, qualsiasi modifica tu clicchi mandi tutti gli input di tutti e 10 i record alla pagina modifica_dati.php, se controlli le HTTP request lo vedi subito), e PHP ti legge solo l'ultimo.

Se chiedi a me, per fare un inline edit userei JavaScript con AJAX, un esempio: https://www.phpzag.com/create-live-editable-table-with-jquery-php-and-mysql/

Fammi sapepre.
 

emanuele.cescon

Nuovo Utente
2 Apr 2016
13
7
3
Carino l'esempio con Jquery... ma credo che optero per un php puro.
Pensavo anche ad una modifica semplice.
Sfruttare la riga dove faccio gli inserimenti per fare anche le modifiche: basta chiedere all'utente di mettere almeno un dato leggendolo dalla tabella sotto e poi rifaccio la select aprendo i dati nell'area di inserimento. submit update e via..stessa cosa per il delete.
Come ti dicevo, me lo ricordavo diverso, ma forse perchè in ASP era gestito in modo diverso.

Adesso provo e poi ti dico: se può eventualmente servire posto anche lo spezzone di codice usato.

Ancora grazie
 
  • Like
Reactions: f107
Discussioni simili
Autore Titolo Forum Risposte Data
S passare un valore da un form a un file .php con metodo post PHP 4
K Form che manda dati doppi PHP 1
K Problema form update PHP 2
Elisacau [Contact form 7] Inserire Numero auto incrementante WordPress 1
K form Inserimento record mysql PHP 2
I Form con selettore HTML e CSS 0
K [php]form invio dati PHP 0
G form invio multiplo con checkbox PHP 12
nivaria.achinet Intercettare form solo dopo invio Javascript 1
D Form contatti non funzionante HTML e CSS 0
A Stampare dati da form PHP 8
M Unire 2 funzioni per l'invio di un form e con l'apertura di un div Javascript 0
I Form HTML e CSS 17
otto9due $_FILE non passa i dati dal form PHP 1
M Form: come tornare ai campi già compilati dopo invio PHP 1
G Invio form con PHP PHP 3
felino Form action costum e parametri in queryString WordPress 1
M Come recuperare molteplici input form PHP 1
M Collegamento tra form html e script php PHP 4
L form immagini per il database PHP 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
L inserimento form dati multipli ? PHP 0
L Problemi form Pagina php HTML e CSS 3
Cosina Creare bottone delete in form upload PHP 5
Cosina Creare bottone delete in form upload PHP 1
D Devo far funzionare un form di contatti PHP 4
B form gestione input PHP 2
V PHP form intersecate PHP 0
8 Javascript - PDF Form Javascript 0
J Form inserimento dati in database Ajax 1
E Gestione profilo utente tramite Form PHP 3
R [C#] Form principale si blocca mentre un altro Thread lavora .NET Framework 0
M Problema con controllo form in real time jQuery 6
D Form validazione Javascript 2
R form recovery pass PHP 0
V Symfony e i form PHP 3
M form con checkbox PHP 8
S come aggiustare un form di contatto? HTML e CSS 3
F query e form con select multipla PHP 17
MarcoGrazia Verifica di una stringa o di un nome proveniente da form Snippet PHP 0
A Inserimento dati nel database tramite form + altre operazioni PHP 18
websilvia Contact form using Bootstrap 3.3.4 PHP 8
Alex_70 Button non funziona nella form PHP 2
C Form email php su pagina index.html? PHP 21
W Rinominare Documenti Con Form Asp Classic ASP 9
S Invio email da form PHP 8
L form multipla php sql,errore in inserimento MySQL 0
L inviare i dati di un form ad un database PHP 6
L Collegare un form html ad un database access Javascript 2

Discussioni simili