Porcierto, para ltu bucle no hacen falta las dos variables, el motivo por el que te coge el mes anterior es por el cero que pones al llamar a date() en el argumento donde va el día. Para que coja el mes bien, simplemente pon un "1":
date("j",mktime(0, 0, 0, $mes,
1, 2006))
y esa "j" no me suena, es la "t" la que da el número de días totales.
Así mirandolo rápido te podría quedar algo parecido a esto:
Código PHP:
<?php
$mes = 1;
while($mes < 13){
$ultimo = date("t",mktime(0, 0, 0, $mes, 0, 2006));
echo "El ultimo dia del mes $mes es $ultimo<br>";
$mes++;
}