Todo pareceria estar correcto, quizas tengas un problema con los datos que vienen de la base de datos, es decir, antes del codigo publicado.
En este ejemplo basado en tu codigo puedes ver que funciona correctamente en ambos casos.
Código PHP:
Ver original<?php
$fecha_de_nacimiento = "1998-10-15"; // Esto saldria de la bd.
$santo = "1998-10-15"; // Esto saldria de la bd.
// Ahora obtenemos cada parte por separado:
$fecha_de_nacimiento = explode("-", $fecha_de_nacimiento);
// Meses.
$meses = array('Mes', 'Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio', 'Agosto','Septiembre','Octubre','Noviembre','Diciembre');
?>
<label>Fecha de nacimiento: </label>
<select id="dia_nacimiento" name="dia_nacimiento">
<option value="">Día: </option>
<?php
$selected = (empty($fecha_de_nacimiento[2]) ?
0 : $fecha_de_nacimiento[2]); for ($i=1; $i<32; $i++)
echo "<option value=\"$i\" ".($i == $selected ? "selected" : "").">$i</option>";
?>
</select>
<select id="mes_nacimiento" name="mes_nacimiento">
<?php
$selected = (empty($fecha_de_nacimiento[1]) ?
0 : $fecha_de_nacimiento[1]); foreach ($meses as $nro => $mes) {
echo "<option value=\"$nro\" ".($nro == $selected ? "selected" : "").">$mes</option>";
}
?>
</select>
<select id="ano_nacimiento" name="ano_nacimiento">
<option value="">Año: </option>
<?php
$selected = (empty($fecha_de_nacimiento[0]) ?
0 : $fecha_de_nacimiento[0]); for ($i=1930; $i<2002; $i++)
echo "<option value=\"$i\" ".($i == $selected ? "selected" : "").">$i</option>";
?>
</select>
<hr>
<label>Fecha del santo: </label>
<select id="dia_santo" name="dia_santo">
<option value="">Día: </option>
<?php
$selected = (empty($santo[2]) ?
0 : $santo[2]); for ($i=1; $i<32; $i++)
echo "<option value=\"$i\" ".($i == $selected ? "selected" : "").">$i</option>";
?>
</select>
<select id="mes_santo" name="mes_santo">
<?php
$selected = (empty($santo[1]) ?
0 : $santo[1]); foreach ($meses as $nro => $mes) {
echo "<option value=\"$nro\" ".($nro == $selected ? "selected" : "").">$mes</option>";
}
?>
</select>