si te funcionan es porque están bien echo,
pero no son dinámicos, ni es la forma adecuada, ¿por que?:
porque veo que cargas todo en javascript e implica cargar y devolver TODOS los registros de la 2da tabla (a la larga si esta tabla tiene muchos registros, implicaría no solo una sobrecarga del server, sino también al interprete javascript del cliente), la idea de hacerlo dinámico es que al seleccionar del primer select, el segundo sea cargado con los datos del servidor, en otras palabras
AJAX
php se ejecuta en el servidor, es cierto, pero javascript se ejecuta en el cliente, y como usas php pensarás "¡¡¡ pero si la carga de los datos desde BD con php es dinámica !!!", sí lo es, no te lo niego, pero el echo es que cargas todo la primera vez, entonces en la función de javascript
doChange lo tienes todo ya cargado,
por lo que allí no hay petición al servidor (php/apache), no es dinámica ni interactiva; AJAX es una técnica que permite hacer eso, realizar solicitudes al php del servidor desde javascript, sin recargar la página, ni cargar todo previamente a javascript.
te recomiendo que busques un tutorial de PHP AJAX y veas la forma adecuada de hacer verdaderos selects dependientes de php con ajax
