[PHP] Form e database

giuseppe_123

Utente Attivo
8 Set 2016
53
0
6
25
Salve, avrei bisogno di una mano nel creare una piccola tabella attraverso la quale verranno visualizzati tutti gli utenti, da me registrati attraverso un form, che mi servirà a inserire la loro presenza/assenza.
innanzitutto ho gia creato una tabella nella quale vengono inseriti tutti dati inseriti via form. I campi di questa tabella sono: ID, NOME, COGNOME, DATA_DI_NASCITA,CODICE FISCALE.
Questa tabella può essere visualizzata sul sito che sto creando in locale. Nella pagina web oltre a quelle colonne ne ho inserita un'altra per poter inserire la presenza a ciascun id.
In ogni cella di quella colonna ho creato due bottoni radio per spuntare la casella "presente" o "assente" e un tasto invia.
solo che non riesco a inviare alla tabella del database la dicitura "presente"/"assente"
Ho gia creato una tabella contenente solamente due campi: ID, PRESENZA_ASSENZA.
ID dovrebbe essere la stessa colonna presente nella prima tabella che vi ho descritto. Ho sentito parlare di database relazionali o tabelle relazionali.. Qualcuno può spiegarmi come crearle? ho trovato delle guide ma ci ho capito poco. Comunque entrambe le tabelle che ho creato sono InnoDB.
 
Quando parli di database relazionali, ti stai riferendo al database all'interno del quale hai creato le due tabelle. Si chiama relazionale in quanto le tabelle possono essere messe in relazione tra di loro, attraverso dei campi chiave. Nel tuo caso hai l'ID dell'utente che compare in entrambe le tabelle, per cui la relazione tra queste ultime si basa proprio su questo campo, attraverso il quale, dalla tabella delle presenze, puoi risalire a tutte le informazioni riferite a quell'utente con quello specifico ID, contenute all'interno della tabella delle anagrafiche. Per cui le tabelle sono già create.

Il tuo problema, a questo punto, si riduce alla scrittura di codice PHP e, nello specifico, alla comunicazione tra lo script e il database. Dovresti innanzitutto postare il tuo codice, in modo da avere una base da cui partire per aiutarti.
 
  • Like
Reactions: giuseppe_123
Diciamo che ho risolto già un po dei problemi che avevo. Posto qua il codice.


PHP:
<?php
/* Template name: tabella mysql

 */
get_header();
?>

<html>
<head>
<link rel="stylesheet" type="text/css" href="tab.css">
</head>
    <body>

        <html>
        <head>
            <meta charset="utf-8" />
            <title>Table Style</title>
            <meta name="viewport" content="initial-scale=1.0; maximum-scale=1.0; width=device-width;">
        </head>

        <body>
        <div class="table-title">
            <h3></h3>
        </div>
        <div id="scroll">
        <table class="table-fill" class="scrollable">
            <thead>

            <tr>
                <th class="text-left">ID</th>
                <th class="text-left">NOME</th>
                <th class="text-left">COGNOME</th>
                <th class="text-left">DATA DI NASCITA</th>
                <th class="text-left">CODICE FISCALE</th>
                <th class="text-left">LUOGO DI NASCITA</th>
            </tr>
            </thead>
            <tbody class="table-hover">


<?php

include 'conn_selez_db.php';


$query = "SELECT * FROM persone_inserite ORDER BY id  ";
$result = mysqli_query($conn,$query) or die(mysqli_error($conn));
while($row = mysqli_fetch_array($result)) {
    echo "<tr>";
    echo "<td class='text-left'>" . $row['0'] . "</td><td class='text-left'>" . $row['1'] . "</td>
    <td class='text-left' >" . $row['2'] . "</td><td class='text-left' >" . $row['3'] . "</td><td class='text-left' >" . $row['4'] . "</td>
    <td class='text-left' >" . $row['5'] . "</td>";

    echo"<td><form action='' method='POST' >
        presenza/assenza:<br>
    <input type='radio' name='registro' value='presente'>pre
    <input type='radio' name='registro' value='assente''>ass<br>

    <input type='submit' name='submit' value='INVIA'><br>
    </form></td>";


if(isset($_POST['submit'])) {
    include('conn_selez_db.php');



    $p_a=$_POST["registro"];


    $query= "insert  into presenze (ID,PRESENZA_ASSENZA) values ('.$row[0]','$p_a')";
    if (mysqli_query($conn, $query))
    {
        echo  "<script type='text/javascript'>alert('registrata')</script>";
        

    } else {echo "errore";}
}
}
?>




                </div>
            </tbody>
        </table>


        </body>
</body>

</html>

Ho creato dentro una cella per ogni utente un form per inserire la presenza/assenza in una tabella nel database che è composta da due campi: id e presenza/assenza.
Quando schiaccio invia al database arrivano nel campo id solamente due valori, o 0 o 1, e nel campo presenza_assenza solamente la scritta presente anche se viene selezionato assente. Io vorrei che nel campo id fosse inserito l'id corrispondente a l'utente cui vado a inserire la presenza/assenza
 
Ho modificato il codice usando il tuo come base, commentando i vari passaggi.

PHP:
<?php /* Template name: tabella mysql*/ ?>
<html>
   <head>
        <title>Table Style</title>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1.0; maximum-scale=1.0; width=device-width;">
        <link rel="stylesheet" type="text/css" href="tab.css">
    </head>

    <body>
        <div class="table-title">
            <h3>Registro presenze</h3>
        </div>
        <div id="scroll">
            <form action='' method='POST' > <!-- IL FORM SARÀ TUTTA LA TABELLA -->
                <table class="table-fill" class="scrollable">
                    <thead>
                        <tr>
                            <th class="text-left">ID</th>
                            <th class="text-left">NOME</th>
                            <th class="text-left">COGNOME</th>
                            <th class="text-left">DATA DI NASCITA</th>
                            <th class="text-left">CODICE FISCALE</th>
                            <th class="text-left">LUOGO DI NASCITA</th>
                            <th class="text-left">PRESENZA/ASSENZA</th>
                        </tr>
                    </thead>
                    <tbody class="table-hover">
                        <?php
                            include('conn_selez_db.php');
                            $query = "SELECT * FROM persone_inserite ORDER BY id";
                            $result = mysqli_query($conn,$query) or die(mysqli_error($conn));
                            while($row = mysqli_fetch_array($result)) {
                                echo "
                                <tr>
                                    <td class='text-left'>" . $row['0'] . "</td>
                                    <td class='text-left'>" . $row['1'] . "</td>
                                    <td class='text-left'>" . $row['2'] . "</td>
                                    <td class='text-left'>" . $row['3'] . "</td>
                                    <td class='text-left'>" . $row['4'] . "</td>
                                    <td class='text-left'>" . $row['5'] . "</td>
                                    <td>
                                        <input id='pre$row[0]' type='radio' required checked name='registro[$row[0]]' value='presente'>
                                        <label for='pre$row[0]'>pre</label>

                                        <input id='ass$row[0]' type='radio' required name='registro[$row[0]]' value='assente'>
                                        <label for='ass$row[0]'>ass</label>
                                    </td>
                                </tr>";
                                // il name di ogni input sarà un array che avrà come chiavi
                                // gli id degli utenti e come valori le rispettive presenze

                            }
                            if(isset($_POST['submit']) && isset($_POST["registro"])) {

                                $registro = $_POST["registro"]; // recupero l'array registro che contiente id e presenza degli utenti
                                $count = 0; // inizializzo una variabile che mi conterà quante presenze vengono registrate

                                foreach ($registro as $id => $presenza) { // per ogni coppia chiave->valore all'interno dell'array $registro
                                    $insert = "INSERT INTO presenze (ID,PRESENZA_ASSENZA) VALUES ($id,'$presenza');"; //definisco la query

                                    /*
                                    N.B.: all'interno della query $id non è racchiuso tra apici
                                     poiché nella mia tabella è definito come intero.
                                    */

                                    $count++; // incremento il conteggio

                                    if(!mysqli_query($conn,$insert)) { // se la query di inserimento fallisce...
                                            $count--; // riduco il conteggio di uno
                                            echo "Errore".mysqli_error($conn)."<br>"; // e stampo il relativo errore mysql
                                        }
                                }
                                echo "<div><h3>".$count." presenze registrate.</h3></div>";
                                // quando tutto l'array è stato processato stampo il messaggio informativo
                            }
                        ?>
                    </tbody>
                </table>
                <input type='submit' name='submit' value='INVIA'><br>
            </form>
        </div>
    </body>
</html>

Se hai dubbi o perplessità, chiedi pure ;)
 
Sei stato gentilissimo. Grazie mille.
Volevo anche chiederti se è possibile, quando si inserisce la presenza, che venga aggiunta la data automaticamente. E dunque dovrò anche creare un'altra colonna nella tabella del database giusto?
 
Certo, è possibilissimo. Ovviamente dovrai creare un'altra colonna, avendo l'accortezza di settare, a livello di tabella, la coppia (ID, DATA) come chiave, in modo da evitare di avere duplicati o dati addirittura discordanti (verrebbe violato il vincolo di integrità secondo cui le chiavi primarie debbano essere uniche). In alternativa, puoi fare a meno di questo passaggio e controllare direttamente attraverso lo script che non siano già presenti record per quella persona in quel determinato giorno.

Puoi scegliere il formato data che più preferisci, utilizzando la funzione built-in date().

PHP:
date("d-m-Y") // 17-09-2016
date("d/m/Y") // 17/09/2016
date("d/m/y") // 17/09/16

Ti lascio il link alla pagina di php.net, nel caso volessi approfondire.
 
  • Like
Reactions: giuseppe_123
Vorrei chiederti un'ultima cosa, allego uno screenshot dove ci sono due righe della mia tabella. le colonne sono:
1--> ID
2--> NOME
3--> COGNOME
4--> DATA DI NASCITA
5--> CODICE FISCALE
6--> LUOGO DI NASCITA
7-->PRESENZA/ASSENZA
Ho intenzione di far vedere solamente id nome cognome e presenza/assenza più un pulsante che se schiacciato dovrebbe far vedere tutte le altre informazioni(data di nascita, codice fiscale, luogo di nascita). Come posso farlo?
 

Allegati

  • Schermata 2016-09-18 alle 11.11.03.png
    Schermata 2016-09-18 alle 11.11.03.png
    54 KB · Visite: 278
Potresti mettere un link che se premuto ti ricarica la pagina e ti mostra le altre informazioni, gestendo il tutto tramite una GET.

Forse però l'alternativa migliore è il JavaScript, in quanto eviteresti il refresh della pagina.
 
Questo è forse il metodo più immediato. Ho nascosto via CSS i dati che non vengono immediatamente visualizzati, quindi ho aggiunto uno pseudo-bottone che, se cliccato, mostra/nasconde i dati tramite una funzione JavaScript (JQuery in questo caso) che toglie/aggiunge la classe "hidden".

PHP:
<?php /* Template name: tabella mysql*/ ?>
<html>
   <head>
        <title>Table Style</title>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1.0; maximum-scale=1.0; width=device-width;">
        <link rel="stylesheet" type="text/css" href="tab.css">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

        <style type="text/css">
            .hidden {
                display: none;
            }

            .info {
                background-color: #eee;
                border: 1px solid black;
                border-radius: 5px;
                cursor: pointer;
                padding: 2px 3px;
                width: 200px;
            }

        </style>
    </head>

    <body>
        <div class="table-title">
            <h3>Registro presenze</h3>
        </div>
        <div id="scroll">
            <form action='' method='POST' > <!-- IL FORM SARÀ TUTTA LA TABELLA -->
                <table class="table-fill" class="scrollable">
                    <thead>
                        <tr>
                            <th class="text-left">ID</th>
                            <th class="text-left">NOME</th>
                            <th class="text-left">COGNOME</th>

                            <th class="text-left">PRESENZA/ASSENZA</th>
                            <th class="text-left"></th>
                            <span class="show">
                           <!--  <th class="text-left more hidden">DATA DI NASCITA</th>
                            <th class="text-left more hidden">CODICE FISCALE</th>
                            <th class="text-left more hidden">LUOGO DI NASCITA</th> -->
                            </span>
                        </tr>
                    </thead>
                    <tbody class="table-hover">
                        <?php
                            include('conn_selez_db.php');
                            $query = "SELECT * FROM persone_inserite ORDER BY id";
                            $result = mysqli_query($conn,$query) or die(mysqli_error($conn));
                            while($row = mysqli_fetch_array($result)) {
                                echo "
                                <tr>
                                    <td class='text-left'>" . $row['0'] . "</td>
                                    <td class='text-left'>" . $row['1'] . "</td>
                                    <td class='text-left'>" . $row['2'] . "</td>
                                    <td>
                                        <input id='pre$row[0]' type='radio' required checked name='registro[$row[0]]' value='presente'>
                                        <label for='pre$row[0]'>pre</label>

                                        <input id='ass$row[0]' type='radio' required name='registro[$row[0]]' value='assente'>
                                        <label for='ass$row[0]'>ass</label>
                                    </td>
                                    <td><span class='main" . $row['0'] . " info'>More..</span></td>
                                    <td class='more" . $row['0'] . " hidden'><strong>Nascita:      </strong>" . $row['3'] . "</td>
                                    <td class='more" . $row['0'] . " hidden'><strong>CF:      </strong>" . $row['4'] . "</td>
                                    <td class='more" . $row['0'] . " hidden'><strong>Luogo:      </strong>" . $row['5'] . "</td>
                                </tr>
                                        <script type='text/javascript'>
           
                                            $('.main".$row['0']."').click(function() {
                                                $('.more".$row['0']."').toggleClass('hidden');
                                                $('.more').removeClass('hidden');
                                            });


                                            </script>

                                ";
                                // il name di ogni input sarà un array che avrà come chiavi
                                // gli id degli utenti e come valori le rispettive presenze

                            }
                            if(isset($_POST['submit']) && isset($_POST["registro"])) {

                                $registro = $_POST["registro"]; // recupero l'array registro che contiente id e presenza degli utenti
                                $count = 0; // inizializzo una variabile che mi conterà quante presenze vengono registrate

                                foreach ($registro as $id => $presenza) { // per ogni coppia chiave->valore all'interno dell'array $registro
                                    $insert = "INSERT INTO presenze (ID,PRESENZA_ASSENZA) VALUES ($id,'$presenza');"; //definisco la query

                                    /*
                                    N.B.: all'interno della query $id non è racchiuso tra apici
                                     poiché nella mia tabella è definito come intero.
                                    */

                                    $count++; // incremento il conteggio

                                    if(!mysqli_query($conn,$insert)) { // se la query di inserimento fallisce...
                                            $count--; // riduco il conteggio di uno
                                            echo "Errore".mysqli_error($conn)."<br>"; // e stampo il relativo errore mysql
                                        }
                                }
                                echo "<div><h3>".$count." presenze registrate.</h3></div>";
                                // quando tutto l'array è stato processato stampo il messaggio informativo
                            }
                        ?>
                    </tbody>
                </table>
                <input type='submit' name='submit' value='INVIA'><br>
            </form>
        </div>

    </body>
</html>
 
  • Like
Reactions: giuseppe_123
Potresti aiutarmi anche nel creare un bottone per ogni riga per eliminare alcuni dati del database?
 

Discussioni simili