campi select sincronizzati

Ciao a tutti

Volevo chiedervi come sia possibile sincronizzare due campi select alimentati da delle query su tabelle collegate.

Ho creato il primo campo :

<code>

<td><?php

// richiamo il file di configurazione

require 'config.php';

// richiamo lo script responsabile della connessione a MySQL

require 'connect.php';

//creo la combo box per estrarre i badi dalla tabella banks

echo '<select name="id_unit">';

echo '<option value="0">::Seleziona::</option>';

$res=mysql_query("select id,unit_name from production_unit");

if(mysql_num_rows($res)==0) echo " Nessuna record presente nell'archivio unità produttive.";

else

for ($i=0;$i<mysql_num_rows($res);$i++)

{

$row=mysql_fetch_assoc($res);

echo "<option value='$row[id]'>$row[id] - $row[unit_name]</option>";

}

echo '</select>';

// chiudo la connessione a MySQL

mysql_close();

?>

</code>

Poi il secondo:

<code>

<?php

// richiamo il file di configurazione

require 'config.php';

// richiamo lo script responsabile della connessione a MySQL

require 'connect.php';

//creo la combo box per estrarre i badi dalla tabella banks

echo '<select name="id_bank_account">';

echo '<option value="0">::Seleziona::</option>';

$res=mysql_query("select bank_accounts.*,production_unit.id,banks.bank_code from bank_accounts join production_unit on

bank_accounts.id_unit=production_unit.id left join banks on bank_accounts.id_bank=banks.id");

if(mysql_num_rows($res)==0) echo " Nessuna record presente nell'archivio Conti FIN.";

else

for ($i=0;$i<mysql_num_rows($res);$i++)

{

$row=mysql_fetch_assoc($res);

echo "<option value='$row[id]'> $row[bank_account_ccy] - $row[bank_account_type] - $row[bank_account_n] -

$row[bank_code]</option>";

}

echo '</select>';

// chiudo la connessione a MySQL

mysql_close();

?>

</code>

In pratica vorrei far si che la seconda select mi faccia vedere solo i records che anno production_unit.id=al valore selezionato nella prima select.

Grazie in anticipo.

Ciao

Amos

inviato 9 anni fa
amosse
X 0 X

Il metodo classico si basa su un javascript che effettua il submit del form quando l'utente seleziona una option della prima select. Lo script PHP che rivceve questo POST (i dati del form) mostra nuovamente il form ma questa volta può caricare i dati della seconda select poiché la prima è stata selezionata.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Grazie della risposta.

Non sempra poi così facile..

Mi sapresti indicare della documentazione o qualche post di esempio all'interno del forum, da visionare?

Ciao

Amos

risposto 9 anni fa
amosse
X 0 X

Se prendi il database scaricabile da questa pagina:

http://www.sarnari.net/programmazione/2007/04/regioni-province-e-comuni-per-database-mysql/

puoi provare questo script che ho buttato giù velocemente:

<?php
$link = mysql_connect('localhost', 'root', 'secret');  
if (!$link) {  
    die ('Non riesco a connettermi: ' . mysql_error());  
}  
  
$db_selected = mysql_select_db('italia', $link);  
if (!$db_selected) {  
    die ("Errore nella selezione del database: " . mysql_error());  
}

$regioni = array();
$province = array();
$comuni = array();

$result = mysql_query("SELECT idregione, nomeregione FROM regioni");  
while ($row = mysql_fetch_assoc($result)) {  
    $regioni[$row['idregione']] =  $row['nomeregione'];  
}

$regione_selezionata = isset($_POST['selRegione']) ? $_POST['selRegione'] : "";
$provincia_selezionata = isset($_POST['selProvincia']) ? $_POST['selProvincia'] : "";
$comune_selezionato = isset($_POST['selComune']) ? $_POST['selComune'] : "";

if($regione_selezionata) {
   $result = mysql_query("SELECT idprovincia, nomeprovincia FROM province WHERE idregione = " . $regione_selezionata);  
   while ($row = mysql_fetch_assoc($result)) {  
       $province[$row['idprovincia']] =  $row['nomeprovincia'];  
   }
}

if($regione_selezionata && $provincia_selezionata) {
   $result = mysql_query("SELECT idcomune, nomecomune FROM comuni WHERE idprovincia = " . $provincia_selezionata);  
   while ($row = mysql_fetch_assoc($result)) {  
       $comuni[$row['idcomune']] =  $row['nomecomune'];  
   }
}

include "template.php";

function genera_options($options, $chiave_selezionata) {
   foreach($options as $chiave => $valore) {
      $sel = $chiave == $chiave_selezionata ? 'selected="selected"' : '';
      echo '<option value="'.$chiave.'" '.$sel.'>'.$valore."</option>\n";
   }
}
?>

template.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Conforming XHTML 1.0 Strict Template</title>
</head>

<body>
<form action="" method="post" id="form1">
   <fieldset>
      <legend>Select dinamiche</legend>
      <label for="selRegione">Regione:</label><br />
      <select name="selRegione" id="selRegione" onchange="document.getElementById('form1').submit()">
      <option value="">seleziona la regione...</option>
      <?php genera_options($regioni,$regione_selezionata)?>
      </select>
      <br />
      <br />
      <label for="selProvincia">Provincia:</label><br />
      <select name="selProvincia" id="selProvincia" onchange="document.getElementById('form1').submit()">
      <option value="">seleziona la provincia...</option>
      <?php genera_options($province,$provincia_selezionata)?>
      </select>
      <br />
      <br />
      <label for="selComune">Comune:</label><br />
      <select name="selComune" id="selComune" onchange="document.getElementById('form1').submit()">
      <option value="">seleziona il comune...</option>
      <?php genera_options($comuni,$comune_selezionato)?>
      </select>
   </fieldset>
</form>
</body>
</html>

 :bye:

P.S.: c'è un piccolo baco...

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Grazie per la risposta.

Ho provato a caricare il DB ma ottengo un errore del genere "Do not know how to handle this statement at line

..." e poi non riesco a fare il restore del file, cosa si deve fare in questi casi?

Allora ho provato ad adattare lo script al mio caso in questo modo (sincro_p-units_bank-accounts.php)

<code>

<?php

$link = mysql_connect('localhost', 'root', 'bomba'); 

if (!$link) { 

    die ('Non riesco a connettermi: ' . mysql_error()); 

$db_selected = mysql_select_db('fr', $link); 

if (!$db_selected) { 

    die ("Errore nella selezione del database: " . mysql_error()); 

}

$production_unit = array();

$bank_accounts = array();

//scorro i record della qry e assegno all'array production_unit i valori chiave:(numerica) - valore:(unit_name)

$result = mysql_query("SELECT id,unit_name FROM production_unit"); 

while ($row = mysql_fetch_assoc($result)) { 

    $production_unit[$row['id']] =  $row['unit_name']; 

}

$production_unit_selected = isset($_POST['id_production_unit']) ? $_POST['id_production_unit'] : 0;

$bank_accounts_selected = isset($_POST['id_bank_account']) ? $_POST['id_bank_account'] : 0;

if($production_unit_selected) {

   $result = mysql_query("select bank_accounts.*,production_unit.id,banks.bank_code from bank_accounts join production_unit on bank_accounts.id_unit=production_unit.id left join banks on bank_accounts.id_bank=banks.id WHERE bank_accounts.id_unit = ". $production_unit_selected); 

   while ($row = mysql_fetch_assoc($result)) { 

       $bank_accounts[$row['id']] = 

$row['bank_account_ccy']-$row['bank_account_type']-$row['bank_account_n']-$row['bank_code'];

   }

}

include "insert_fin_records_h.php";

function genera_options($options, $chiave_selezionata) {

   foreach($options as $chiave => $valore) {

      $sel = $chiave == $chiave_selezionata ? 'selected="selected"' : '';

      echo '<option value="'.$chiave.'" '.$sel.'>'.$valore."</option>\n";

   }

}

?>

</code>

Mi sembra che sia analogo a quello del tuo esempio, non so se sia possibile assegnare più valori ad ogni elemento dell'array bank_accounts (come evidenziato in rosso)?

Questo perché ho la necessita che la seconda select mostri tutti quei campi della qry.

Poi ho adattato il mio form di inserimento come da tuo esempio, solo che io uso HTML non so può andare lo stesso come di seguito

<code>

<?php

if($_POST) {

   insert_fin_record();

}

else {

   show_fin_records();

}

function insert_fin_record()

{

   // richiamo il file per sincronizzare la select

   require 'sinco_p-units_bank-accounts.php';

   // richiamo il file di configurazione

   require 'config.php';

   // richiamo lo script responsabile della connessione a MySQL

   require 'connect.php';

   // recupero i campi di tipo "stringa"

   $fin_record_desc      = trim($_POST['fin_record_desc']);

   $fin_record_amount      = trim($_POST['fin_record_amount']);

   // verifico se devo eliminare gli slash inseriti automaticamente da PHP

   if(get_magic_quotes_gpc())

   {

      $fin_record_desc          = stripslashes($fin_record_desc);

      $fin_record_amount      = stripslashes($fin_record_amount);

   }

   $fin_record_desc             = mysql_real_escape_string($fin_record_desc);

   $fin_record_amount        = mysql_real_escape_string($fin_record_amount);

   //recupero il campo select/radio

   $id_production_unit   = intval($_POST['id_production_unit']);

   $id_bank_account   = intval($_POST['id_bank_account']);

   $id_fin_account      = intval($_POST['id_fin_account']);

   $sign         = intval($_POST['sign']);

   //recupero i campi data

   $gg = $_POST["giorno"];

   $mm = $_POST["mese"];

   $aaaa = $_POST["anno"];

   if ($gg && $mm && $aaaa){

   $fin_record_date="$aaaa-$mm-$gg";} 

   else {$messaggio = urlencode("Non hai selezionato una data valida!");

      header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);

      exit;}

   // verifico la presenza dei campi obbligatori

   if((!$gg && !$mm && !$aaaa) || !$id_bank_account || !$id_fin_account || !$fin_record_amount || !$id_production_unit)

   {

      $messaggio = urlencode("Non hai inserito i campi obbligatori (*)!");

      header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);

      exit;

   }

if ($sign==1)

{

   // preparo la query 1

   $query = "INSERT INTO fin_records (fin_record_date,id_bank_account,id_fin_account,fin_record_desc,fin_record_debit,id_production_unit)

           VALUES ('$fin_record_date',$id_bank_account,$id_fin_account,'$fin_record_desc','$fin_record_debit',$id_production_unit)";

   // invio la query

   $result = mysql_query($query);

   // controllo l'esito

   if (!$result) {

      die("Errore nella query $query: " . mysql_error());

   }

   // recupero l'id autoincrement generato da MySQL per il nuovorecord inserito

   $id_loaded = mysql_insert_id();

   // chiudo la connessione a MySQL

   mysql_close();

   $message = urlencode("Inserimento effettuato con successo (ID=$id_loaded)");

   header('location: '.$_SERVER['PHP_SELF'].'?msg='.$message);

}

else

{

   // preparo la query 2

   $query = "INSERT INTO fin_records (fin_record_date,id_bank_account,id_fin_account,fin_record_desc,fin_record_credit,id_production_unit)

           VALUES ('$fin_record_date',$id_bank_account,$id_fin_account,'$fin_record_desc','$fin_record_credit',$id_production_unit)";

   // invio la query

   $result = mysql_query($query);

   // controllo l'esito

   if (!$result) {

      die("Errore nella query $query: " . mysql_error());

   }

   // recupero l'id autoincrement generato da MySQL per il nuovorecord inserito

   $id_loaded = mysql_insert_id();

   // chiudo la connessione a MySQL

   mysql_close();

   $message = urlencode("Inserimento effettuato con successo (ID=$id_loaded)");

   header('location: '.$_SERVER['PHP_SELF'].'?msg='.$message);

}

}

function show_fin_records()

{

// mostro un eventuale messaggio

if(isset($_GET['msg']))

echo '<b>'.htmlentities($_GET['msg']).'</b><br /><br />';

?>

<form name="ins_fin_record" method="post" action="">

<table bgcolor="#FFFF00" align="center" border="2" cellspacing="2" width="100%" height="30%" bordercolorlight="#008000">

<tr><td><b>Data</b></td>

<?php

// richiamo il file di configurazione

require 'config.php';

// richiamo lo script responsabile della connessione a MySQL

require 'connect.php';

// richiamo lo script per l'impostazione della data (select)

require 'date_today_s.php';

// chiudo la connessione a MySQL

mysql_close();

?>

<td>

<select name="giorno"><option value="0"><b>gg<b></option><?php echo $gg;?></select>

<select name="mese"><option value="0"><b>mm<b></option><?php echo $mm;?></select>

<select name="anno"><option value="0"><b>anno<b></option><?php echo $aaaa;?></select>

</td>

<td><b>Unità Produttiva*</b></td>

<td><select name="id_production_unit" id="id_production_unit" onchange="getElementById('ins_fin_record').submit()">

<option value="0">::Seleziona::</option>

<?php genera_options($production_unit,$production_unit_selected)?>

</select>

</td>

<td><b>Conto FIN*</b></td>

<td><select name="id_bank_account" id="id_bank_account" onchange="getElementById('ins_fin_record').submit()">

<option value="0">::Seleziona::</option>

<?php genera_options($bank_accounts,$bank_accounts_selected)?>

</select>

</td>

</tr>

<tr><td><b>Codice FIN*</b></td>

<td><?php

// richiamo il file di configurazione

require 'config.php';

// richiamo lo script responsabile della connessione a MySQL

require 'connect.php';

//creo la combo box per estrarre i badi dalla tabella banks

echo '<select name="id_fin_account">';

echo '<option value="0">::Seleziona::</option>';

$res=mysql_query("select fin_accounts.id,fin_accounts.fin_account_code,fin_accounts.fin_account_name from fin_accounts");

if(mysql_num_rows($res)==0) echo " Nessuna record presente nell'archivio Codici finanziari.";

else

for ($i=0;$i<mysql_num_rows($res);$i++)

{

$row=mysql_fetch_assoc($res);

echo "<option value='$row[id]'>$row[fin_account_code] - $row[fin_account_name]</option>";

}

echo '</select>';

// chiudo la connessione a MySQL

mysql_close();

?>

</td>

<td colspan=\"2\"><input type="radio" name="sign" value="1" checked="checked"/>Entrata<input type="radio" name="sign" value="2" checked="checked"/>Uscita</td>

<td><b>Importo*</b></td><td><input name="fin_record_amount" type="text" size="20" maxlength="16"/></td></tr>

<tr><td><b>Descrizione</b></td><td colspan=\"3\"><input name="fin_record_desc" type="text" size="50" maxlength="45"/></td> 

<td colspan=\"6\" align="right"><input type="reset" value="Annulla"/><input type="submit" value="Inserisci" method="post"/></td></tr>

</table>

</form>

<form action="http://localhost/amos-marzuoli.it/fr/show_ccy.php" target="menu_main-page">

<table align="left"><tr><td colspan=\"2\" align="center" valign="middle"><input type="submit"value="Visualizza records"/></tr></td></table>

</form>

<form action="http://localhost/amos-marzuoli.it/fr/edit_ccy.php" target="menu_main-page">

<table align="left"><tr><td colspan=\"2\" align="center" valign="middle"><input type="submit"value="Modifica records"/></tr></td></table>

</form>

<form action="http://localhost/amos-marzuoli.it/fr/erase_ccy.php" target="menu_main-page">

<table align="left"><tr><td colspan=\"2\" align="center" valign="middle"><input type="submit"value="Cancella records"/></tr></td></table>

</form>

<?php

}

?>

</code>

Non so se sia una cosa logica, se provo così non succede niente, il form si blocca alla prima select e non mi da nessuna possibilità di opzione.

Non so se potessi darmi qualche dritta?

Ciao

Amos

risposto 9 anni fa
amosse
X 0 X

Nella prima riga scritta in rosso ci sono una serie di sottrazioni, è questo quello che volevi fare? Oppure volevi concatenare delle stringhe? in tal caso dovresti mettere i punti: "stringa1" . $variabile . "stringa2" . $variabile2;

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

No non sono sottrazioni, quello che volevo tentare di  fare é far visualizzare all'utente  una serie di informazioni relative ad alcuni campi della qry:

$row['bank_account_ccy'] (identificativo valuta-campo testo)

$row['bank_account_type'] (identificativo tipo conto-campo testo)

$row['bank_account_n'] (identificativo conto n°-campo testo)

$row['bank_code'] (identificativo codice banca-campo testo)

quindi mettevo il segno "-" per unire la cosa.

Comunque ho provato sia ha cambiare la cosa cosi':

<code>

$bank_accounts[$row['id']] = $row['bank_account_ccy']."-".$row['bank_account_type']."-".$row['bank_account_n']."-".$row['bank_code'];

</code>

sia semplificando:

<code>

$bank_accounts[$row['id']] = $row['bank_account_ccy'];

</code>

in entrambi i casi non funziona, se apro la form visualizzo alla 1° select che però non da la possibilità di selezionare nessun dato.

Ti volevo dire inoltre che tutti i campi delle tabelle che cominciano per "id" sono numerici, tutti gli altri "testo".

Ciao e grazie per la collaborazione.

Amos

ps:ti volevo dire che avrei dovuto evidenziare in rosso anche la riga in alto sotto la funzione function insert_fin_record()

<code>

// richiamo il file per sincronizzare la select

   require 'sinco_p-units_bank-accounts.php';

</code>

come a chedere, é giusto posizionare il require dello script sincro..in quel modo?

risposto 9 anni fa
amosse
X 0 X

Scusate se riprendo l'argomento, ho creato i due script sulla falsa riga dell'esempio sopra citato da Gianni per la sincronizzazione delle select (combobox).

sincro_p-units_bank_accounts.php

<code>

<?php

$link = mysql_connect('localhost', 'root', 'bomba'); 

if (!$link) { 

    die ('Non riesco a connettermi: ' . mysql_error()); 

$db_selected = mysql_select_db('fr', $link); 

if (!$db_selected) { 

    die ("Errore nella selezione del database: " . mysql_error()); 

}

$production_unit = array();

$bank_accounts = array();

//scorro i record della qry e assegno all'array production_unit i valori chiave:(numerica) - valore:(unit_name)

$result = mysql_query("SELECT id,unit_name FROM production_unit"); 

while ($row = mysql_fetch_assoc($result)) { 

    $production_unit[$row['id']] = $row['unit_name']; 

}

$production_unit_selected = isset($_POST['sel_p_unit']) ? $_POST['sel_p_unit'] : "";

$bank_accounts_selected = isset($_POST['sel_bank_account']) ? $_POST['sel_bank_account'] : "";

if($production_unit_selected) {

   $result = mysql_query("select bank_accounts.*,production_unit.id,banks.bank_code from bank_accounts join production_unit on bank_accounts.id_unit=production_unit.id left join banks on bank_accounts.id_bank=banks.id where bank_accounts.id_unit = ". $production_unit_selected); 

   while ($row = mysql_fetch_assoc($result)) { 

       $bank_accounts[$row['id']] = $row['bank_account_ccy']."-".$row['bank_account_type']."-".$row['bank_account_n']."-".$row['bank_code']; 

   }

}

include "template2.php";

function genera_options($options,$chiave_selezionata){

   foreach($options as $chiave => $valore) {

      $sel = $chiave == $chiave_selezionata ? 'selected="selected"' : '';

      echo '<option value="'.$chiave.'" '.$sel.'>'.$valore."</option>\n";

   }

}

?>

</code>

template2.php

<code>

<form action="" method="post" id="form1">

      <table bgcolor="#FFFF00" align="center" border="2" cellspacing="2" width="100%" height="5%" bordercolorlight="#008000">

      <td><b>Unità produttiva:<b></td>

      <td><select name="sel_p_unit" id="sel_p_unit" onchange="document.getElementById('form1').submit()">

      <option value="">::Unità produttiva::</option>

      <?php genera_options($production_unit,$production_unit_selected)?>

      </select></td>

      <td><b>Conto FIN:<b></td>

      <td><select name="sel_bank_account" id="sel_bank_account" onchange="document.getElementById('form1').submit()">

      <option value="">::conto FIN::</option>

      <?php genera_options($bank_accounts,$bank_accounts_selected)?>

      </select></td>

      </table>

</form>

</code>

Lancio sincro_p-units_bank_accounts.php, funziona tutto alla perfezione, le select sono sincronizzate.

Queste due select sono solo una parte dei tag presenti sulla form per l'inserimento (codice allegato post precedenti), che ho costruito sulla base del vs esempio come da lezione n.5 corso PHP/MySQL,  allora ho pensato di inserire all'interno dello script (nella parte adibita all'inserimento, per riprendere la vs lezionen.5 la function mostra_form) un riga del genere:

<code>

<?php

include "sincro_p-units_bank-accounts2.php";

?>

</code>

Purtroppo così facendo resta attiva solo la prima select e la seconda non più alcun valore.

Lo so che sicuramente é una domanda stupida, ma come posso risolvere il problema?

Spero di ricevere qualche vs buona dritta.

Ciao

Amos

risposto 9 anni fa
amosse
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda