crea un file PHP che ritorna un array JS con i dati della select da riempire:

Metti di avere 3 select:
Codice PHP:
<select name="regione" onchange="populateSelect(this.options[this.selectedIndex].value, 'regione','citta')">
   <
option value="lombardia">Lombardia</option>
   <
option value="veneto">Veneto</option>
    .
    .
    .
   <
option value="sicilia">Sicilia</option>
</
select>
<
select name="citta" onchange="populateSelect(this.options[this.selectedIndex].value, 'citta', 'via')"></select>
<
select name="via"></select
A questo punto hai bisogno di uno script PHP da chiamare con Ajax ed una funzione che faccia la richiesta in modo corretto.

X il file, creo un file PHP che legge un parametro di query che sarà: citta={Città selezionata}&ottenere=via oppure regione={Regione selezionata}&ottenere=citta
Codice PHP:
$where = isset($_GET['citta']) ? 'citta' : isset($_GET['regione']) ? 'regione' null;
$ottenere $_GET['ottenere'];

if(
$ottenere && $where){
   
//Metti che questo file crei un link reference al DB chiamato $db
   
include("db/mysql_connect.php");

   
$valore $_GET[$where];
   
//Ovviamente la tua query può essere molto diversa
   
$query "SELECT $ottenere FROM TABELLA_MASTODONTICA WHERE $where LIKE '$valore'"
   
$result mysql_query($query$db);
   
$ret '';
   while(
$row mysql_fetch_array($result))
   {
       
$ret .="'".$row[$ottenere]."',";
   }

   if(
strlen($ret) > 0){
      
$ret substr($ret0strlen($ret) - 1);
   }
   echo 
"myArr = [$ret]";

Poi chiami il file con una chiamata ajax, io uso sempre una libreria per questo, facciamolo con Prototypejs
Codice PHP:
var myArr = [];

function 
populateSelect(valuewhereottenere)
{
   var 
url 'new_file.php'
   
// notice the use of a proxy to circumvent the Same Origin Policy.

   
eval("new Ajax.Request(url, { method: 'get', contentType : 'text/javascript', parameters : { "+where+" : '"+value+"', ottenere : '"+ottenere+"'}, onSuccess: function(transport) { eval(transport.responseText); populate('"+ottenere+"');}});");
}
            
function 
populate(selectName)
{
   var 
sel document.getElementsByName(selectName)[0];
   var 
all Element.descendants(sel);
   for(
0all.lengthi++)
   {      
      
sel.remove(all[i]);
   }
   for(
0myArr.lengthi++)
   {
      var 
opt document.createElement('option');
      
opt.value myArr[i];
      
opt.appendChild(document.createTextNode(myArr[i]));
      
sel.appendChild(opt);
   }

Dovrebbe andare, con prototype-1.6.0.2.js, io l'ho testato e va senza problema su Firefox, Opera ed anche su Safari.