• User

    Script per assegnare i voti agli studenti

    Devo inserire in un db i voti conseguiti dagli studente di una classe ed ho il seguente form:
    [php]<?php
    include("include/config.php");
    include("include/connessione.php");

    $classe=$_POST['tuttivoti']; //la classe che ho selezionato
    $oggi=date("Y-m-d");

    $sql="SELECT *
    FROM studenti
    WHERE classe = '$classe'
    ORDER BY cognome ASC, nome ASC";

    $result = mysql_query($sql,$db)or die ("Errore nella query: " . mysql_error());
    ?>
    <table>
    <form id="form_ins_voti" name="insertvoti" method="post" action="salvatuttivoti.php">
    <?php
    while ($studente = mysql_fetch_array($result)){
    ?>
    <tr>
    <td><strong><?php echo"$studente[cognome]"?></strong> <?php echo"$studente[nome]"?></td>
    <td><input name="<?php echo"idstudente_".$studente['id_studente'].""?>" type="text" id="<?php echo"idstudente_".$studente['id_studente'].""?>" size="3" value="" />
    data:
    <input name="<?php echo"datavoto_".$studente['id_studente'].""?>" type="text" id="<?php echo"datavoto_".$studente['id_studente'].""?>" size="10" value= <?php echo"$oggi"?> />
    tipo:
    <select name="<?php echo"tipovoto_".$studente['id_studente'].""?>" id="<?php echo"tipovoto_".$studente['id_studente'].""?>">
    <option>scritto</option>
    <option>orale</option>
    </select>
    voto:
    <input type="text" name="<?php echo"voto_".$studente['id_studente'].""?>" id="<?php echo"voto_".$studente['id_studente'].""?>" size="3" />

    <?php
    }
    mysql_free_result($result);
    mysql_close($db);
    ?>
    <input type="submit" name="button" id="button" value="Invia" />
    </form>[/php]

    Fin qui (pare) tutto bene. Il form si presenta corretto (almeno sembra). Non so però come recuperare i dati per inserirli nel db.


  • Consiglio Direttivo

    Ciao lupo53 e benvenuto nel Forum GT. 🙂

    Dal form ti conviene trasmettere i dati come array, assegnando come indice l'id studente:

    [php]<form id="form_ins_voti" name="insertvoti" method="post" action="salvatuttivoti.php">
    <?php
    $oggi=time(); //meglio utilizzare il timestamp

    while ($studente = mysql_fetch_array($result)){
    ?>

    <?php echo $studente['id_studente']." ".$studente['cognome']." ".$studente['nome'].""; ?>
    Data:
    <input name="<?php echo "datavoto[".$studente['id_studente']."]"; ?>" type="text" id="<?php echo "datavoto[".$studente['id_studente']."]"; ?>" size="10" value="<?php echo date("Y-m-d", $oggi); ?>" />
    Tipo:
    <select name="<?php echo"tipovoto[".$studente['id_studente']."]"; ?>" id="<?php echo"tipovoto[".$studente['id_studente']."]"; ?>">
    <option value="Scritto">Scritto</option>
    <option value="Orale">Orale</option>
    </select>
    Voto:
    <input type="text" name="<? echo"voto[".$studente['id_studente']."]"; ?>" id="<? echo"voto[".$studente['id_studente']."]"; ?>" size="3" /><br /><br /><br />

    <?php
    }
    mysql_free_result($result);
    mysql_close($connessione);
    ?>
    <input type="submit" name="button" id="button" value="Invia" />
    </form>[/php]Recuperandoti nella pagina salvatuttivoti.php i valori impostati in questo modo, ovvero name="voto[1]", name="voto[2]", etc etc., otterrai un array il cui indice numerico non è altro che l'id studente. Pertanto nel file salvatuttivoti.php non ti resta che recuperare questi valori e poi ciclarli (immagino solo quelli dove verrà messo un voto) ed inserirli nel Database in una tabella apposita dove avrai un id record, l'id_studente, la data, il tipo di voto ed il voto:

    [php]<?php
    include("include/config.php");
    include("include/connessione.php");

    $datavoto=$_POST['datavoto'];
    $tipovoto=$_POST['tipovoto'];
    $voto=$_POST["voto"];

    for ($i=0; $i<=(count($voto)); $i++)
    {
    if ($voto*!= "")
    {
    list($Y, $m, $d)=explode("-",$datavoto*);
    $datavoto*=mktime(0,0,0,$m,$d,$Y);
    $sql="INSERT INTO prova_voti (id_studente, data, tipo, voto) VALUES ('$i', '$datavoto*', '$tipovoto*', '$voto*')";
    $query=@mysql_query($sql) or die (mysql_error());
    }
    }

    ?>[/php]

    Questa è una versione minimal dello script senza alcun tipo di protezione sui dati maneggiati dallo script, quindi attenzione. 😉


  • User

    Ringrazio per la solerzia.
    Ho modificato il codice secondo indicazioni ma, nella prova di inserimento che ho fatto mi compare:
    Notice: Undefined offset: 0 in c:\programmi\easyphp1-8\www\salvatuttivoti.php on line 12
    Notice: Undefined offset: 1 in c:\programmi\easyphp1-8**\www\salvatuttivoti.php** on line 12
    ecc... per tutti i voti inseriti.
    inserico il codice della pagina "salvatuttivoti" che ho dovuto leggermente modificare in quanto il nome dei campi della tabella voto sono diversi dall'esempio**:
    **<?php
    include("include/config.php");
    include("include/connessione.php");

    $datavoto=$_POST['datavoto'];
    $tipovoto=$_POST['tipovoto'];
    $voto=$_POST["voto"];

    for ($i=0; $i<=(count($voto)); $i++)
    {
    if ($voto*!= "")
    {
    list($Y, $m, $d)=explode("-",$datavoto*);
    $datavoto*=mktime(0,0,0,$m,$d,$Y);
    $sql="INSERT INTO voti (id_studente, tipo_voto data_voto, voto)
    VALUES ('$i', '$tipovoto*', '$datavoto*', '$voto*')";
    $query=@mysql_query($sql) or die (mysql_error());
    }
    }

    ?>
    Ho riscontrato poi anche un altro (spero piccolo) problema: il campo "data_voto" della tabella "voti" è del tipo "DATE" e non "TIMESTAMP", sarebbe opportuna una modifica?


  • Consiglio Direttivo

    Giusto che ti dia quel notice, da rettificare invece il mio consiglio. 😉

    Ti spiego, il notice esce fuori perché, giustamente, l'array $voto[0] e $voto[1] non sono definite, non ci avevo pensato. 😄

    Dovresti risolvere cambiando questa riga:
    [php]if ($voto*!= "")[/php]Così:
    [php]if (isset($voto*) && is_numeric($voto*)) //nel frattempo controlliamo che sia un valore numerico[/php]:wink3:

    Per il campo data, si, maneggiando timestamp devi modificarlo in INT.

    EDIT:
    Già che ci sei, cambia anche questo:
    [PHP]$i<=count($voto*)[/PHP]
    Con questo:
    [PHP]$i<=count($tipovoto*)[/PHP]


  • User

    Ho apportato le modifiche. Tutto funziona a meraviglia... solo per i primi tre studenti! Ovvero tre studenti (di prova) della classe 4A che richiamo con la SELECT:
    $sql="SELECT *
    FROM studenti
    WHERE classe = '$classe'
    ORDER BY cognome ASC, nome ASC";

    Se seleziono un'altra classe ed inserisco i voti, il form viene visualizzato correttamente, con altri nomi della classe selezionata (e, ovviamente, altri id_studente) ma all'invio i voti non vengono inseriti e non viene visualizzato nessun errore (nemmeno se tolgo la @ a: $query=@mysql_query($sql))

    Sono ritornato alla prima versione della data (che non mi da problemi) per cui il file "salvatuttivoti.php" risulta:

    <?php
    include("include/config.php");
    include("include/connessione.php");

    $datavoto=$_POST['datavoto'];
    $tipovoto=$_POST['tipovoto'];
    $voto=$_POST['voto'];

    for ($i=0; $i<=(count($tipovoto)); $i++)
    {
    if (isset($voto*) && is_numeric($voto*)) //nel frattempo controlliamo che sia un valore numerico
    {
    // list($Y, $m, $d)=explode("-",$datavoto*);
    // $datavoto*=mktime(0,0,0,$Y,$m,$d);
    $sql="INSERT INTO voti (id_studente, tipo_voto, data_voto, voto)
    VALUES ('$i', '$tipovoto*', '$datavoto*', '$voto*')";
    $query=@mysql_query($sql) or die (mysql_error());
    }
    }
    ?>


  • Consiglio Direttivo

    Posteresti l'html del form (dal sorgente pagina)?

    Poi vediamo che cosa restituisce l'array, modifica provvisoriamente il file salvatuttivoti così e riprova con quelli che non ti inserisce:

    [php]<?php
    $datavoto=$_POST['datavoto'];
    $tipovoto=$_POST['tipovoto'];
    $voto=$_POST['voto'];

    var_dump ($datavoto);
    echo "<br />";
    var_dump ($tipovoto);
    echo "<br />";
    var_dump ($voto);
    echo "<br />";
    [/php]


  • Consiglio Direttivo

    Rieccomi, testato capito il problema, con il count giustamente si trova meno indici e si finirebbe per fare cicli inutili.

    Modifichiamo il form e inseriamo i name con [] (name="voto[]") e inseriamo l'id_studente in un hidden data:

    [php]....
    while ($studente = mysql_fetch_array($result)){
    ?>

    <?php echo $studente['id_studente']." ".$studente['cognome']." ".$studente['nome'].""; ?>
    Data:
    <input name="datavoto[]" type="text" id="datavoto" size="10" value="<?php echo date("Y-m-d", $oggi); ?>" />
    Tipo:
    <select name="tipovoto[]" id="tipovoto">
    <option value="Scritto">Scritto</option>
    <option value="Orale">Orale</option>
    </select>
    Voto:
    <input type="text" name="voto[]" id="voto" size="3" />
    <input type="hidden" name="id_studente[]" value="<?php echo $studente['id_studente']; ?>" />
    .....[/php]

    E quindi modifichiamo il file salvatuttivoti per ciclare solo quello che interessa:
    [php]$id_studente=$_POST['id_studente'];
    $datavoto=$_POST['datavoto'];
    $tipovoto=$_POST['tipovoto'];
    $voto=$_POST["voto"];

    for ($i=0; $i<=(count($id_studente)); $i++)
    {
    if (isset($voto*) && is_numeric($voto*))
    {
    ......
    [/php]

    Ora dovrebbe andare senza problemi. 😉


  • User

    Stesso problema...:-(
    Classe 4A, html:
    [html]<table>
    <form id="form_ins_voti" name="insertvoti" method="post" action="salvatuttivoti.php">
    <tr>
    <td><strong>1 Cognome1 Nome1</td>
    <td><input name="idstudente_1" type="text" id="idstudente_1" size="3" value="" />
    data:
    <input name="datavoto[1]" type="text" id="datavoto[1]" size="10" value="2009-08-18" />
    tipo:
    <select name="tipovoto[1]" id="tipovoto[1]"><option>scritto</option>
    <option>orale</option>
    </select>
    voto:
    <input type="text" name="voto[1]" id="voto[1]" size="3" /><br /><br />
    <input type="hidden" name="id_studente[]" value="1" />
    <tr>
    <td><strong>2 Cognome2 Nome2</td>
    <td><input name="idstudente_2" type="text" id="idstudente_2" size="3" value="" />
    data:
    <input name="datavoto[2]" type="text" id="datavoto[2]" size="10" value="2009-08-18" />
    tipo:
    <select name="tipovoto[2]" id="tipovoto[2]"><option>scritto</option>
    <option>orale</option>

    </select>
    voto:
    <input type="text" name="voto[2]" id="voto[2]" size="3" /><br /><br />
    <input type="hidden" name="id_studente[]" value="2" />
    <tr>
    <td><strong>3 Cognome3 Nome3</td>
    <td><input name="idstudente_3" type="text" id="idstudente_3" size="3" value="" />
    data:
    <input name="datavoto[3]" type="text" id="datavoto[3]" size="10" value="2009-08-18" />
    tipo:
    <select name="tipovoto[3]" id="tipovoto[3]"><option>scritto</option>
    <option>orale</option>
    </select>
    voto:
    <input type="text" name="voto[3]" id="voto[3]" size="3" /><br /><br />
    <input type="hidden" name="id_studente[]" value="3" />
    <input type="submit" name="button" id="button" value="Invia" />
    </form>[/html]

    Ho inserito nel "salvatuttivoti" anche: var_dump ($id_studente);
    e risulta:

    array(3) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
      [2]=>
      string(1) "3"
    }
    
    array(3) {
      [1]=>
      string(10) "2009-08-18"
      [2]=>
      string(10) "2009-08-18"
      [3]=>
      string(10) "2009-08-18"
    }
    
    array(3) {
      [1]=>
      string(7) "scritto"
      [2]=>
      string(7) "scritto"
      [3]=>
      string(7) "scritto"
    }
    
    array(3) {
      [1]=>
      string(1) "1"
      [2]=>
      string(1) "1"
      [3]=>
      string(1) "1"
    }
    

    ........................................
    Questo è invece l'HTML della classe 4B (che non funziona):
    [html]<table>
    <form id="form_ins_voti" name="insertvoti" method="post" action="salvatuttivoti.php">
    <tr>
    <td><strong>4 Cognome4 Nome4</td>
    <td><input name="idstudente_4" type="text" id="idstudente_4" size="3" value="" />
    data:
    <input name="datavoto[4]" type="text" id="datavoto[4]" size="10" value="2009-08-18" />
    tipo:
    <select name="tipovoto[4]" id="tipovoto[4]"><option>scritto</option>
    <option>orale</option>
    </select>
    voto:
    <input type="text" name="voto[4]" id="voto[4]" size="3" /><br /><br />
    <input type="hidden" name="id_studente[]" value="4" />
    <tr>
    <td><strong>5 Cognome5 Nome5</td>
    <td><input name="idstudente_5" type="text" id="idstudente_5" size="3" value="" />
    data:
    <input name="datavoto[5]" type="text" id="datavoto[5]" size="10" value="2009-08-18" />
    tipo:
    <select name="tipovoto[5]" id="tipovoto[5]"><option>scritto</option>
    <option>orale</option>
    </select>
    voto:
    <input type="text" name="voto[5]" id="voto[5]" size="3" /><br /><br />
    <input type="hidden" name="id_studente[]" value="5" />
    <tr>
    <td><strong>6 Cognome6 Nome6</td>
    <td><input name="idstudente_6" type="text" id="idstudente_6" size="3" value="" />
    data:
    <input name="datavoto[6]" type="text" id="datavoto[6]" size="10" value="2009-08-18" />
    tipo:
    <select name="tipovoto[6]" id="tipovoto[6]"><option>scritto</option>
    <option>orale</option>
    </select>
    voto:
    <input type="text" name="voto[6]" id="voto[6]" size="3" /><br /><br />
    <input type="hidden" name="id_studente[]" value="6" />
    <input type="submit" name="button" id="button" value="Invia" />
    </form>[/html]

    E questo il risultato:

    array(3) {
      [0]=>
      string(1) "4"
      [1]=>
      string(1) "5"
      [2]=>
      string(1) "6"
    }
    
    array(3) {
      [4]=>
      string(10) "2009-08-18"
      [5]=>
      string(10) "2009-08-18"
      [6]=>
      string(10) "2009-08-18"
    }
    
    array(3) {
      [4]=>
      string(7) "scritto"
      [5]=>
      string(7) "scritto"
      [6]=>
      string(7) "scritto"
    }
    
    array(3) {
      [4]=>
      string(1) "2"
      [5]=>
      string(1) "2"
      [6]=>
      string(1) "2"
    }
    

  • Consiglio Direttivo

    Leggi il mio ultimo post, ho modificato un po' di cose. 😉


  • User

    Non vedo post oltre il precedente. Ho notato comunque che nell'inserimento dei voti della classe di prova 4B nel risultato del test che riguarda l'id_studente compare:
    array(3) {
    [0]=>
    string(1) "4"
    [1]=>
    string(1) "5"
    [2]=>
    string(1) "6"
    }
    Non dovrebbero essere [4] [5] [6]???


  • Consiglio Direttivo

    Devi effettuare tutte le modifiche che ti ho messo prima per risolvere il problema. 😉


  • User

    Le ho fatte ma senza risultati. I voti vengono sempre inseriti nella classe con gli studenti: id_studente[1] id_studente[2] id_studente[3] anzi, mi sono accorto consultando il db che viene inserito un voto ad uno studente con id_studente[0] che nella tabella studenti non esiste!


  • Consiglio Direttivo

    Vedo dall'HTML della pagina che gli input escon così:
    [html]<input name="datavoto[5]" type="text" id="datavoto[5]" size="10" value="2009-08-18" />[/html]

    Mentre, facendo le modifiche che ti ho messo sopra, devono uscire cosi:
    [html]<input name="datavoto[]" type="text" id="datavoto" size="10" value="2009-08-18" />[/html]
    Controlla, magari hai saltato qualcosa. 😉


  • User

    l'HTML della classe 4B(uno studente...):

    <form id="form_ins_voti" name="insertvoti" method="post" action="salvatuttivoti.php" >
    <table border="1">
    <tr>
    <td><strong>4 Cognome4 Nome4</strong></td>
    <td>data:<input name="datavoto[]" type="text" id="datavoto" size="10" value="2009-08-18" /></td>
    <td>tipo:
    <select name="tipovoto[]" id="tipovoto">
    <option value="Scritto">Scritto</option>
    <option value="Orale">Orale</option>
    </select>
    </td>
    <td>voto:
    <input type="text" name="voto[]" id="voto" size="3" />
    <input type="hidden" name="id_studente[]" value="4" />
    </td>
    </tr>
    <tr>


  • Consiglio Direttivo

    Adesso è giusto, hai apportato le modifiche anche a salvatuttivoti.php?
    Funziona? 🙂


  • User

    No, tutto come prima, anzi un poco peggio...
    Riesco ad inserire i voti per la classe 4A (composta da tre studenti con id_studente1, 2 e 3) e mi inserisce i voti per id 0, 1 e 2, non inserendo ovviamente il voto al 3...La classe successiva 4B (tre studenti 4,5 e 6) se inserisco i voti vanno ad aggiungersi agli studenti 0, 1 e due...Eppure l'HTML è corretto perchè riporta gli id corretti...!


  • Consiglio Direttivo

    Mi posti i due file così vediamo cosa non va'?
    Con le modifiche che ti ho messo prima a me funziona senza problemi.


  • User

    tuttivoticlasse.php
    <?php
    include("include/config.php");
    include("include/connessione.php");

    $classe=$_POST['tuttivoti'];
    $oggi=date("Y-m-d");

    $sql="SELECT *
    FROM studenti
    WHERE classe = '$classe'
    ORDER BY cognome ASC, nome ASC";

    $result = mysql_query($sql,$db)or die ("Errore nella query: " . mysql_error());
    ?>
    <table>
    <form id="form_ins_voti" name="insertvoti" method="post" action="salvatuttivoti.php" >
    <?php
    while ($studente = mysql_fetch_array($result)){
    ?>
    <tr>
    <td><strong><?php echo $studente['id_studente']." ".$studente['cognome']." ".$studente['nome'].""; ?></strong></td>
    <td>data:<input name="datavoto[]" type="text" id="datavoto" size="10" value="<?php echo"$oggi"?>" /></td>
    <td>tipo:
    <select name="tipovoto[]" id="tipovoto">
    <option value="Scritto">Scritto</option>
    <option value="Orale">Orale</option>
    </select></td>
    <td>voto:
    <input type="text" name="voto[]" id="voto" size="3" />
    <input type="hidden" name="id_studente[]" value="<?php echo $studente['id_studente']; ?>" />
    </td>
    <?php
    }
    mysql_free_result($result);
    mysql_close($db);
    ?>
    <td><input type="submit" name="button" id="button" value="Invia" /></td>
    </form>
    </tr>
    </table>

    salvatuttivoti.php
    <?php
    include("include/config.php");
    include("include/connessione.php");

    $id_studente=$_POST['id_studente'];
    $datavoto=$_POST['datavoto'];
    $tipovoto=$_POST['tipovoto'];
    $voto=$_POST['voto'];

    //var_dump ($id_studente);
    //echo "<br />";
    //var_dump ($datavoto);
    //echo "<br />";
    //var_dump ($tipovoto);
    //echo "<br />";
    //var_dump ($voto);
    //echo "<br />";

    for ($i=0; $i<=(count($id_studente)); $i++) {
    if (isset($voto*) && is_numeric($voto*)) //nel frattempo controlliamo che sia un valore numerico
    {
    // list($Y, $m, $d)=explode("-",$datavoto*);
    // $datavoto*=mktime(0,0,0,$Y,$m,$d);
    $sql="INSERT INTO voti (id_studente, tipo_voto, data_voto, voto)
    VALUES ('$i', '$tipovoto*', '$datavoto*', '$voto*')";
    $query=@mysql_query($sql) or die (mysql_error());
    }
    }
    ?>


  • Consiglio Direttivo

    Ok, avevo tagliato io un pezzo postando le modifiche. 😄
    Varia la query così:
    [php]$sql="INSERT INTO voti (id_studente, tipo_voto, data_voto, voto)
    VALUES ('$id_studente*', '$tipovoto*', '$datavoto*', '$voto*')";[/php]

    😉


  • User

    Perfetto! Funziona tutto benissimo anche il fatto che se non inserisco il voto ad uno studente (magari assente) non viene inserito nulla nel db (che è esattamente quello che serve perché calcolo le medie...).
    Ci sarebbe ancora un piccolo ritocco...Poiché l'inserimento dei voti a molti studenti si riferisce solo ad un compito in classe, mi sembra inutile ripetere ad ogni riga la data (viene effettuata per tutti nello stesso giorno) e la tipologia (scritto). Sarebbe possibile indicare in una casella sola buona per tutti gli studenti?