I usually prefer to use separate <select> elements for year, month, and day: each returning an integer. Then you can run those values through [man]checkdate/man to ensure the received number are valid. You can use PHP to help build the fields:
<label>Month:<select name='month'>
<?php
$mos = array(1 => 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
foreach($mos as $num => $name)
{
echo "<option value='$num'>$name</option>\n";
}
?>
</select></label>
<label>Day:<select name='day'>
<?php
foreach(range(1,31) as $day)
{
echo "<option>$day</option>\n";
}
?>
</select></label>
<label>Year:<select name='year'>
<?php
for($yr = date('Y'), $max = $yr + 5; $yr <= $max; $yr++)
{
echo "<option>$yr</option>\n";
}
?>
</select></label>
Then in the form-handler:
if(checkdate($_POST['month'], $_POST['day'], $_POST['year']))
{
// date is valid
}
else
{
// date is NOT valid
}