se cerchi nel forum trovi parecchi thread su select autoaggiornanti, devi solo definire una struttura dei dati in modo che quando una select viene popolata la successiva possa utilizzare la selezione precedente per ottenere i dati da mostrare.
Io di solito uso Ajax per fare una cosa simile:
SQL
codice:
-- Un tipo per il continente che obblighi ad essere uno dei cinque
CREATE TYPE CONTIN_ENUM AS ENUM ('Europe', 'Asia', 'America', 'Africa', 'Australia');
-- La tabella per le Nazione
CREATE TABLE Country(
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
-- qui ci metti gli altri campi,
continent CONTIN_ENUM NOT NULL
);
-- Una tabella per la provincia o stato
CREATE TABLE State(
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
-- qui ci metti gli altri campi
idcountry INTEGER REFERENCES Country (id)
);
--Una tabella per le città
CREATE TABLE City(
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
-- qui ci metti gli altri campi
idstate INTEGER REFERENCES State (id)
);
Questa è una struttura proprio minimale, puoi poi mettere le funzione per il delete a cascade degli provincie se la nazione viene cancellata e delle città se la provincia viene cancellata.
Poi crei un file PHP che effettui il fetch delle nazioni, uno per le provincie ed uno per le città e fai stampare i risultati in una struttura comprensibile (io ti consiglio JSON).
un esempio di actor.countries.php:
Codice PHP:
<?php
if(!empty($_GET['c'])){
$continent = addslashes($_GET['c']);
$continent = "'$continent'";
$dsn = 'pgsql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
$query = "SELECT id, name FROM Country WHERE continent = $continent";
echo json_encode($dbh->query($query)->fetchAll(PDO::FETCH_ASSOC));
exit(0);
}
echo "[]";
?>
È una cosa veramente banale, uso PDO per connetermi a postgresql e faccio il fetch delle nazioni del continente passato, poi usando la funzione json_encode ritorno quello che ho estratto dal DB (PDO, json_encode è praticamente tutto nativo nelle ultime release di PHP).
I dati verranno fuori in questa forma:
codice:
[
{
'id' : 1,
'name' : 'Italia'
},
{
'id' : 2,
'name' : 'Germania'
},
{
'id' : 3,
'name' : 'Francia'
},
...
]
Chiamando il file con una richiesta AJAX ed effettuato l'Eval hai i dati in un formato usato da JS. Usando MooTools fai:
codice:
var jsonCountries; //Te ne faccio solo una
window.addEvent('domready', InitSelect);
var InitSelect = function(){
jsonCountries = new Request.JSON({
'url' : 'path/to/actor.countries.php',
'onSuccess' : PopulateCountries
});
document.id("IDSelectContinent").addEvent('change', function(){
jsonCountries.get({'c' : this.getSelected().getLast().get('value')});
});
};
var PopulateCountries = function(obj){
var sel = document.id("IDSelectCountries").empty();
new Element('option', {'value' : ''}).inject(sel).appentText("--- Seleziona una Nazione ---");
obj.each(function(item){
new Element('option', {'value' : item.id}).inject(sel).set('html', item.name);
});
}
Nell'HTML metti:
codice:
<label for="IDSelectContinent">Continenti:</label>
<select name="continent" id = "IDSelectContinent">
<option value = "">--- Seleziona un Continente ---</option>
<option value = "Europe">Europe</option>
<option value = "Asia">Asia</option>
<option value = "America">America</option>
<option value = "Africa">Africa</option>
<option value = "Australia">Australia</option>
</select>
</p>
<label for = "IDSelectCountries">
Nazioni:
</label>
<select name = "country" id = "IDSelectCountries">
<option value = "">--- Seleziona un Continente Prima ---</option>
</select>
</p>
Spero di aver messo tutto, mi spiace ma non posso proprio provarlo ora. Il resto mi sembra più o meno uguale.
Le funzioni di MooTools le trovi qui: http://mootools.net/docs/core se clicchi su Request.JSON, Element e DomReady vedi tutto quello che ho usato
Le funzioni di PDO: http://www.php.net/manual/en/book.pdo.php