Hola, mira para hacer lo que pides hay muchas formas de hacerlo.
1.- Mediante PHP , necesitarias la ayuda de una BD, donde se ecuentren estructuradas las tablas categoria y subcategoria:
algo asi:
[MYSQL]
create database bd_categoria;
create table categoria
(
cod_categoria int primary key,
nom_categoria varchar(200) not null
)
;
create table subcategoria
(
cod_categoria int not null,
nom_subcategoria not null
)
;
[/MYSQL] // pensado...
es un ejemplo...porque puedes implementar mas campos... o clausulas,etc...
luego con php seria algo asi:
Código PHP:
<form id="form1" name="form1" method="post" action="">
<div align="center">
<table border="1">
<tr>
<td>Seleccione un cliente</td>
<td><select name="combo" onChange="submit();">
<option>Seleccionar</option>
<?php
$conexion=mysql_conect("localhost","root","clave");
mysql_select_bd("bd_categoria");
$result=mysql_query("select cod_categoria,nom_categoria from categoria order by nom_categoria");
while($fila=mysql_fetch_array($result))
{
if($fila[0]==$_POST['combo'])
{
echo "<option value=$fila[0] selected>$fila[1]</option>";
}
else
{
echo "<option value=$fila[0]>$fila[1]</option>";
}
}
?>
</select> //aca cierra el primer combo categoria
<select name="combo1" onChange="submit();">
<option value="0">Seleccionar</option>
<?php
$codigo=$_POST['combo']; //recibiendo el value del combo categoria
$result1=mysql_query("select nom_subcategoria from subcategoria where cod_categoria='$codigo'");
while($fila1=mysql_fetch_array($result1))
{
if($fila1[0]==$_POST['combo1'])
{
echo "<option value=$fila1[0] selected>$fila1[0]</option>";
}
else
{
echo "<option value=$fila1[0]>$fila1[0]</option>";
}
}
?>
</select>
2.- Mediante JavaScript llenaria mucho el tema, por eso usa este ejemplo:
http://www.forosdelweb.com/f13/faqs-javascript-105325/index6.html#post538506
Espero que te sirva Saludos...