Come consiglio personale, ti direi di pensare prima di tutto al codice base, ovvero interamente in PHP
Se questo funziona, dopo possiamo pensare a farlo in "tempo reale" con JS, ma ha poco senso se il codice di base non funziona come si deve
Prova una cosa simile:
form.php
Codice PHP:
<?php $id = $_GET["classe"]; ?>
<form method="post" action="votiDatabase.php?classe=<?php echo $id; ?>">
<?php
$query = mysql_query("SELECT * FROM `studenti` WHERE `id_classe`='".$id."');
if(!$query) die(mysql_error()); //Se la query dà problemi, termina la pagina e mostra l'errore
if(mysql_num_rows($query)){ //Se ci sono risultati
echo "<table width=\"800px\" border=\"1\">";
echo "<tr><td>Studente</td><td>Voto</td></tr>";
while($riga = mysql_fetch_array($query)){
$voti = "<select name=\"newVoteFor_".$riga["id"]."\">";
for($i=3;$i<=9;$i++){
$voti .= "<option value=\"".$i."\">".$i."</option>";
}
$voti .= "</select>";
echo "<tr><td>".$riga["nome]." ".$riga["cognome"]."</td><td>".$voti."</td></tr>";
}
echo "</table>";
}else{ // Se non ci sono risultati
echo "Non ci sono risultati";
}
?>
<input type="submit" value="Invia" />
</form>
votiDatabase.php
Codice PHP:
if($_SERVER['REQUEST_METHOD'] === 'POST'){ //Se l'utente è arrivato a questa pagina tramite un form
$query = mysql_query("SELECT * FROM `studenti` WHERE `id_classe`='".$id."');
if(!$query) die(mysql_error()); //Se la query dà problemi, termina la pagina e mostra l'errore
if(mysql_num_rows($query)){ //Se ci sono risultati
while($riga = mysql_fetch_array($query)){
// SE $_POST["newVoteFor_".$riga["id"]] non esiste, lo inizializzo come FALSE
if(isset($_POST["newVoteFor_".$riga["id"]]) || empty($_POST["newVoteFor_".$riga["id"]]))
$_POST["newVoteFor_".$riga["id"]] = false;
if(
is_numeric($_POST["newVoteFor_".$riga["id"]]) //Controllo che il valore sia numerico
&& ($_POST["newVoteFor_".$riga["id"]] >= 3) //Controllo che il voto vada da 3 a 10
&& ($_POST["newVoteFor_".$riga["id"]] <= 10)
){
if(!mysql_query("INSERT..."))
echo mysql_error() ."
";
}
}
}
}
In questo modo, la pagina che si occupa di elaborare i voti, richiama ancora una volta tutti gli studenti, e verifica che sia passato tramite POST un nuovo voto. Se è presente lo inserisce, altrimenti ignora tutto il codice 
Ancora più corretto sarebbe analizzare solamente i POST ricevuti, assegnando ad ogni select un nome del tipo name="nuovoVoto[]", ma al momento non posso provarlo quindi non vorrei fare troppi casini 
Thinker