Combo che passa dati query ad input "hidden"

dangerfield

Nuovo Utente
9 Set 2008
9
0
0
Salve a tutti. Come da titolo, ho una form che vorrei dotare di una combo popolata dai dati di una tabella 'aree'. Vorrei visualizzasse solo 'nome_area', ma che si portasse dietro anche 'id_area'.

Ho impostato la query.. ma non riesco a popolare la combo. La selezione per 'nome_area' dovrebbe riuscire a passare i due valori estratti alla tabella processi impedendone la visualizzazione. Vi posto la parte di codice che ho fin ora.

<?php

include 'config.php';

$con = mysql_connect("$db_host","$db_user","$db_password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("$db_name", $con);

// Estraggo le aree da utlizzare nella combo che assegna al //
//processo lo stesso valore di id_area ad id_area_processo.//

$query = "SELECT id_area, nome_area
FROM aree
ORDER BY id_area";

$result = mysql_query($query);
if (!$result) {
die("Errore nella query $query: " . mysql_error());
}

//Imposto la tabella per l'inserimento //

echo '
<form name="processi" method="post" action="./insert_processo.php">
<table width="200" border="1">
<tr>
<th scope="row"><span class="Stile4">Nome processo</span></th>
<td><input name="nome_processo" type="text" size="50" maxlength="255"></td>
</tr>
<tr>
<th scope="row"><span class="Stile4">Descrizione</span></th>
<td><textarea name="descrizione_processo" cols="50" rows="5"></textarea></td>
</tr>

<tr>
<th scope="row"><span class="Stile4">Nome Area</span></th>
//*....come faccio a popolare la combo con i dati della query? * //
<td><select name="nome_area"><option value="">seleziona</option></td>
</tr>
//*....e come indico a questi 2 campi hidden di recuperare il valore selezionato? * //
<input type="hidden" name="id_area_processo" value="<?=$id_area?>" />
<input type="hidden" name="id_area_processo" value="<?=$nome_area?>" />

</table>

<input type="submit" value="Inserisci processo">

</form>
 
Con questo pezzo di codice puoi creare la select:

PHP:
echo '<select name="nome_area">';
while($array = mysql_fetch_array($result))  {
  echo '<option value="'.$array['id_area'].'">'.$array['nome_area'].'</option>';
}
echo '</select>';

E nella pagina richiamata dalla form, in $_POST['nome_area'], ti ritrovi l'id_area selezionato dalla combo.

A cosa ti servono i due campi hidden?
 
A che mi servono... beh, volevo filtrare i dati che seguono, ma stavo sbagliando strada..!
In realtà adesso ho cambiato un po' le cose:
ho 2 tabelle, una tabella_aree e l'altra tabella_impianti. In queste ho alcuni valori comuni (aree.nome_area e impianti_nome_area).

Vorrei che a seguito della selezione fatta in 'nome_area', l'altra combo 'impianti_area' si popoli dei 'nome_impianto' associati a 'impianti_nome_area' contenenti il valore selezionato in 'nome_area'.

Adesso sono messo così:
/* faccio la prima query che popola 'nome_area' */

$query_elenco_aree = "SELECT aree.id_area, aree.nome_area FROM aree ORDER BY aree.nome_area";
$elenco_aree = mysql_query($query_elenco_aree, $con) or die(mysql_error());
$row_elenco_aree = mysql_fetch_assoc($elenco_aree);
$totalRows_elenco_aree = mysql_num_rows($elenco_aree);

/* poi la combo */

<td><select name="nome_area">
<?php
do {
?>
<option value="<?php echo $row_elenco_aree['nome_area']?>"><?php echo $row_elenco_aree['nome_area']?></option>
<?php
} while ($row_elenco_aree = mysql_fetch_assoc($elenco_aree));
$rows = mysql_num_rows($elenco_aree);
if($rows > 0) {
mysql_data_seek($elenco_aree, 0);
$row_elenco_aree = mysql_fetch_assoc($elenco_aree);
}

?>

/* ..ora che faccio? imposto l'altra query e di seguito l'altra combo? */

$query_impianti_area = "SELECT impianti.id_impianto, impianti.nome_impianto, impianti.area_impianto FROM impianti WHERE impianti.area_impianto = $row_elenco_aree['nome_area']";
$impianti_area = mysql_query($query_impianti_area, $con) or die(mysql_error());
$row_impianti_area = mysql_fetch_assoc($impianti_area);
$totalRows_impianti_area = mysql_num_rows($impianti_area);

/* ..la combo impianti, che non funziona ovviamente! */
<tr>
<th scope="row">Impianto</th>
<td><select name="impianti_area">
<?php
do {
?>
<option value="<?php echo $row_impianti_area['nome_impianto']?>"><?php echo $row_impianti_area['nome_impianto']?></option>
<?php
} while ($row_impianti_area = mysql_fetch_assoc($impianti_area));
$rows = mysql_num_rows($impianti_area);
if($rows > 0) {
mysql_data_seek($impianti_area, 0);
$row_impianti_area = mysql_fetch_assoc($impianti_area);
}
?>

..ma poi devo far ricaricare la pagina per eseguire la nuova query?
Ommamma...!!! Grazie intanto.
 
onChange()

Vi chiedo se si può fare.. come fare a gestire l'evento. Vi prego di correggermi la sintassi se vi garba.. faccio un sacco di errori, prima o poi imparerò!

Dichiaro una varabile: $variabile= "stringavuota";

Ho poi una select che prende i dati da una query $elenco_aree:
-stringa1
-stringa2
-stringa3
..e lo fa in questo modo:

<select name="nome_area" onChange="mia_funzione()">
<?php
do {
?>
<option value="<?php echo $row_elenco_aree['nome_area']?>"><?php echo $row_elenco_aree['nome_area']?></option>
<?php
} while ($row_elenco_aree = mysql_fetch_assoc($elenco_aree));
$rows = mysql_num_rows($elenco_aree);
if($rows > 0) {
mysql_data_seek($elenco_aree, 0);
$row_elenco_aree = mysql_fetch_assoc($elenco_aree);
}
?>

/* mia_funzione l'ho pensata così: */

mia_funzione()
/*il valore nella combo modifica la variabile*/
$viariabile = "<?php echo $row_elenco_aree['nome_area']?>;
/*eseguo la query che dovrò passare alla seconda combo*/
$queryfiltro = SELECT 'nome_impianto' FROM 'impianti' WHERE 'nome_impianto' = $variabile
GROUP BY 'nome_impianto'
ORDER BY 'nome_impianto';
$queryfiltro = mysql_query($query_queryfiltro, $con) or die(mysql_error());
$row_queryfiltro = mysql_fetch_assoc($queryfiltro);
$totalRows_queryfiltro = mysql_num_rows($queryfiltro);

/*la seconda combo uguale alla prima ma con riferimento a $queryfiltro */
 
Subito due cose:

1) Buona l'idea di usare l'onchange sulla selectbox per aggiornare i dati nella seconda select.
2) Peccato che tu non possa richiamare una funzione PHP in quel modo!

Per ottenere un risultato, potresti procedere in due modi:

1) Caricare solo i dati nella prima select. L'evento onchange richiama una funzione javascript che richiama lo script PHP passandogli il parametro "area" selezionato nella select. Lo script PHP, quando viene chiamato con quel parametro, esegue anche la seconda query per caricare i dati relativi agli impianti.

2) Usare un po' di Ajax ed evitare il reload di tutta la pagina. I dati nella seconda select vengono caricati dinamicamente.

In allegato ho aggiunto un esempio di come si potrebbe fare con il secondo sistema.

Un'ultima cosa, ho cambiato la query con cui selezioni gli impianti, perchè è molto meglio effettuare un confronto con l'id dell'area piuttosto che con il suo nome!
 

Allegati

Trogo, il tuo script è decisamente più snello e comprensibile. Credo proprio che ne implementerò gli sviluppi.

Mitico! :)
 
... e se volessi collegare una terza combo sempre all'onChange della prima, come modifico la funzione load_impianti()..?

Codice:
xmlHttp.onreadystatechange = function() {
      if(xmlHttp.readyState == 4) {
        impianti_area = document.getElementById("impianti_area")
        impianti_area.innerHTML = xmlHttp.responseText;
      }
    }
    cmdline = "get_impianti.php?id_area=" + nome_area.value
    xmlHttp.open("GET", cmdline, true);
    xmlHttp.send(null);

La query vorrebbe essere questa:
Codice:
$query_processi = 'SELECT processi.id_processo, processi.nome_processo, processi.id_area_processo FROM processi WHERE id_area_processo = ' . $id_area;
$result_processi = mysql_query($query_processi);
 
Più che modificare la funzione ne creerei un'altra per caricare i processi sulla falsa riga di quella degli impianti e poi fai eseguire entrambe all'evento onchange della selectbox.

Anche per la parte di PHP puoi creare una seconda pagina tipo quella degli impianti, ma con la query che hai scritto sopra.
 
@trogo
ciao scusate se mi intrometto
ho provato in locale con easyphp il tuo script
d: perchè non visualizzo la seconda casella (impianti),se non ho capito male se seleziono area1 compare impianto x
 
Più che modificare la funzione ne creerei un'altra per caricare i processi sulla falsa riga di quella degli impianti e poi fai eseguire entrambe all'evento onchange della selectbox.

Anche per la parte di PHP puoi creare una seconda pagina tipo quella degli impianti, ma con la query che hai scritto sopra.

giusto... devo provare. thanks
 
Prova a richiamare da browser direttamente questo:

http://<nome_sito>/get_processi.php?id_area=1
 
@trogo
ciao scusa se sono ottuso ma dov'è
Codice:
get_processi.php
nello zip che tu hai allegato ci sono:
1. index.php
2. get_impianti.php
3. area.sql

una volta scaricati ho creato il db test
all'interno ho importato area.sql

non dobrebbe servire:
Codice:
action="./insert_processo.php"
ciao
 
Hai ragione, nella fretta ho preso il nome file sbagliato...

Questo è link da provare:
http://<nome_sito>/get_impianti.php?id_area=1
 

Discussioni simili