De la fecha que tomas por BD, puedes calcular lo demás, por ejemplo lo indispensable, cuantos dias tiene el mes, qué dia fue el primero de mes etc. Partiendo la fecha y aplicando diferentes cálculos.
Te paso un calendario que hice hace mucho, ya lo tengo obsoleto pues hice uno mejor en javascript.
Se basa en xajax, pero creo que la lógica básica se entiende.
Código PHP:
Ver original<?php
function calendario($fecha,$campo,$evento=0){
global $skin;
if($fecha=="")
$fechadiv[0]+=0;
$fechadiv[1]+=0;
$fechadiv[2]+=0;
$ano_ant=$fechadiv[2]-1;
$ano_sig=$fechadiv[2]+1;
$ano_ant="$fechadiv[0]/$fechadiv[1]/$ano_ant";
$ano_sig="$fechadiv[0]/$fechadiv[1]/$ano_sig";
$meses[1]="Enero";$meses[2]="Febrero";$meses[3]="Marzo";
$meses[4]="Abril";$meses[5]="Mayo";$meses[6]="Junio";
$meses[7]="Julio";$meses[8]="Agosto";$meses[9]="Septiembre";
$meses[10]="Octubre";$meses[11]="Noviembre";$meses[12]="Diciembre";*/
// Primer dia del mes
$primer_dia_mes = mktime( 0,0 ,0 , $fechadiv[1], 1, $fechadiv[2]); $primer_dia_semana = Date("w",$primer_dia_mes); $pdms=mktime(0,0,0,$fechadiv[1]+1,0,$fechadiv[2]); $ultimo_dia_mes=Date("d",$pdms);//tomamos el numero del ultimo dia del mes //$dia_de_hoy = $fechadiv[0];
$dia_de_hoy = date("d/m/Y"); $mes_actual = $fechadiv[1];
$ano_actual = $fechadiv[2];
if($fechadiv[1]>1 and $fechadiv[1]<12){//si el mes es mayor a enero y menor a diciembre
$fecha_ant=$fechadiv[1]-1;
$fecha_ant="$fechadiv[0]/$fecha_ant/$fechadiv[2]";
$fecha_sig=$fechadiv[1]+1;
$fecha_sig="$fechadiv[0]/$fecha_sig/$fechadiv[2]";
}
if($fechadiv[1]==1){//si el mes es enero
$fecha_ant=$fechadiv[2]-1;
$fecha_ant="$fechadiv[0]/12/$fecha_ant";
$fecha_sig=$fechadiv[1]+1;
$fecha_sig="$fechadiv[0]/$fecha_sig/$fechadiv[2]";
}
if($fechadiv[1]==12){//si el mes es diciembre
$fecha_ant=$fechadiv[1]-1;
$fecha_ant="$fechadiv[0]/$fecha_ant/$fechadiv[2]";
$fecha_sig=$fechadiv[2]+1;
$fecha_sig="$fechadiv[0]/1/$fecha_sig";
}
$mex=$meses[$mes_actual];//tomamos el nombre del mes actual
//echo "---$mex $mes_actual---";
if(!$evento)
$calen.=" <a onclick=\"_$('$campo').focus();dia('$campo','$fecha',0);\">X cerrar</a><hr/>";
$calen.="
<div style=\"float:left;\">
<a onclick=\"xajax_calendario('$ano_ant','$campo','$evento');\">
<img src=\"$skin/img/left.gif\" style=\"width:10px;\">
</a><b>$ano_actual</b>
<a onclick=\"xajax_calendario('$ano_sig','$campo','$evento');\">
<img src=\"$skin/img/right.gif\" style=\"width:10px;\">
</a>
</div>
<div style=\"float:right;\">
<a onclick=\"xajax_calendario('$fecha_ant','$campo','$evento');\">
<img src=\"$skin/img/left.gif\" style=\"width:10px;\">
</a><b>$mex</b>
<a onclick=\"xajax_calendario('$fecha_sig','$campo','$evento');\">
<img src=\"$skin/img/right.gif\" style=\"width:10px;\">
</a>
</div>
<br/>";
$calen.="
<center>
<table class=\"tabla_lista\" style=\"width:180px; font-size:7pt;text-align:center;\">
<tr style=\"background-color:#ffcc00\"><td>D</td><td>L</td><td>M</td><td>M</td><td>J</td><td>V</td><td>S</td><td>#S</td></tr>";
// Dias nulos anteriores al primer dia de la semana
$calen.="<tr>
<td colspan=\"$primer_dia_semana\"></td>";//Llenado de los dias nulos
$dia_de_semana = $primer_dia_semana + 1;
// Construye el dia actual
for ($dia = 1 ; $dia <= $ultimo_dia_mes ; $dia++){//recorremos los dias del mes
$fechaj=mktime(0,0,0,$fechadiv[1],$dia,$ano_actual); $fechaj=date("d/m/Y",$fechaj); if ($dia_de_semana == 1)//si es domingo
$calen.="<TR>";//comenzamos una nueva fila
if($fechaj==$dia_de_hoy)//si el dia recorrido es el dia actual
$cw="#ff0000";
else//si no ;P
$cw="#ffff66";
if(!$evento)
$calen.="
<td onclick=\"dia('$campo','$fechaj',1)\" bgcolor=\"$cw\" >
$dia
</td>";
else
$calen.="
<td bgcolor=\"$cw\" >
$dia
</td>";
if ($dia_de_semana == 7){//si el dia de la semana es sabado
$dia_de_semana = 0;//volvemos a poner en 0 el dia de la semana
$mt=mktime(0,0,0,$fechadiv[1],$dia,$ano_actual); $calen.="<td>$sx</td></TR>";//y cerramos la fila
}
$dia_de_semana += 1;//aumentamos el dia de la semana
}
if ($dia_de_semana != 1){
$tmp = 8 - $dia_de_semana;
$calen.="<TD colspan=$tmp></TD>";
$mt=mktime(0,0,0,$fechadiv[1],$dia,$ano_actual); $calen.="<td>$sx</td></TR>";//y cerramos la fila
}
$calen.="
</TR>
</TABLE>";
$ponmes = new xajaxResponse();
$ponmes->assign("month_$campo","innerHTML","$calen");
return $ponmes;
}
?>