Effectivement, il se pourrait que l'erreur vienne du fait que le tableau n'est pas remit a zero au début de chaque jour. En y reflechissant, cela correspond meme parfaitement à ce qui apparait à l'écran.
Je copie l'intégralité de mon code :
<?php
session_start();
include "connexion.php";
### Script trouvé sur PHPtools4u
############################
## Donnée préliminaires ##
############################
### French Version
$calendar_txt['french']['monthes'] = array('', 'Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet',
'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');
$calendar_txt['french']['days'] = array('Lundi', 'Mardi', 'Mercredi','Jeudi', 'Vendredi', 'Samedi', 'Dimanche');
$calendar_txt['french']['first_day'] = 0;
$calendar_txt['french']['misc'] = array('Mois précédent', 'Mois suivant','Jour précédent', 'Jour suivant');
### English version
$calendar_txt['english']['monthes'] = array('', 'January', 'February', 'March', 'April', 'May', 'June', 'July',
'August', 'September', 'October','November', 'December');
$calendar_txt['english']['days'] = array('Monday', 'Tuesday', 'Wednesday','Thursday', 'Friday', 'Saturday','Sunday');
$calendar_txt['english']['first_day'] = -1;
$calendar_txt['english']['misc'] = array('Previous month', 'Next month', 'Previous day', 'Next day');
function calendar($date = '')
{
Global $link_on_day, $PHP_SELF, $params;
Global $HTTP_POST_VARS, $HTTP_GET_VARS;
Global $calendar_txt;
### Default Params
$param_d['calendar_id'] = 1; // Calendar ID
$param_d['calendar_columns'] = 5; // Nb of columns
$param_d['show_day'] = 1; // Show the day bar
$param_d['show_month'] = 1; // Show the month bar
$param_d['nav_link'] = 1; // Add a nav bar below
$param_d['link_after_date'] = 1; // Enable link on days after the current day
$param_d['link_before_date'] = 0; // Enable link on days before the current day
$param_d['link_on_day'] = $PHP_SELF.'?date=%%dd%%'; // Link to put on each day
$param_d['font_face'] = 'Verdana, Arial, Helvetica'; // Default font to use
$param_d['font_size'] = 10; // Font size in px
$param_d['bg_color'] = '#FFFFFF';
$param_d['today_bg_color'] = '#A9B4B3';
$param_d['font_today_color'] = '#FFFFFF';
$param_d['font_color'] = '#000000';
$param_d['font_nav_bg_color'] = '#A9B4B3';
$param_d['font_nav_color'] = '#FFFFFF';
$param_d['font_header_color'] = '#FFFFFF';
$param_d['border_color'] = '#3f6551';
$param_d['use_img'] = 1; // Use gif for nav bar on the bottom
### New params V2
$param_d['lang'] = 'french';
$param_d['font_highlight_color']= '#FF0000';
$param_d['bg_highlight_color'] = '#00FF00';
$param_d['day_mode'] = 0;
$param_d['time_step'] = 30;
$param_d['time_start'] = '0:00';
$param_d['time_stop'] = '24:00';
$param_d['highlight'] = array();
// Can be 'hightlight' or 'text'
$param_d['highlight_type'] = 'highlight';
$param_d['cell_width'] = 20;
$param_d['cell_height'] = '60px';
$param_d['short_day_name'] = 1;
$param_d['link_on_hour'] = $PHP_SELF.'?hour=%%hh%%';
### /Params
#######################
## Début du script ##
#######################
### Getting all params
while (list($key, $val) = each($param_d))
{
if (isset($params[$key]))
{
$param[$key] = $params[$key];
}
else
{
$param[$key] = $param_d[$key];
}
}
$monthes_name = $calendar_txt[$param['lang']]['monthes'];
$param['calendar_columns'] = ($param['show_day']) ? 7 : $param['calendar_columns'];
$date = priv_reg_glob_calendar('date');
if ($date == '')
{
$timestamp = time();
}
else
{
$month = substr($date, 4 ,2);
$day = substr($date, 6, 2);
$year = substr($date, 0 ,4);
$timestamp = mktime(0, 0, 0, $month, $day, $year);
}
$current_day = date("d", $timestamp);
$current_month = date('n', $timestamp);
$current_month_2 = date('m', $timestamp);
$current_year = date('Y', $timestamp);
$first_decalage = date("w", mktime(0, 0, 0, $current_month, 1, $current_year));
### Sunday is the _LAST_ day
$first_decalage = ( $first_decalage == 0 ) ? 7 : $first_decalage;
$current_day_index = date('w', $timestamp) + $calendar_txt[$param['lang']]['first_day'] - 1;
$current_day_index = ($current_day_index == -1) ? 7 : $current_day_index;
$current_day_name = $calendar_txt[$param['lang']]['days'][$current_day_index];
$current_month_name = $monthes_name[$current_month];
$nb_days_month = date("t", $timestamp);
$current_timestamp = mktime(23,59,59,date("m"), date("d"), date("Y"));
echo '<table width="80%" border="0" class="calendarTable" cellpadding="2" cellspacing="1">'."\n";
### Displaying the current month/year
echo '<tr>'."\n";
echo ' <td height="30" colspan="7" align="center" class="calendarTop">'."\n";
### Insert an img at will
### Si le calendrier est en day_mode
if ( $param['day_mode'] == 1 )
{
echo ' '.$current_day_name.' '.$current_day.' '.$current_month_name.' '.$current_year."\n";
}
else
{
echo ' '.$current_month_name.' '.$current_year."\n";
}
echo ' </td>'."\n";
echo '</tr>'."\n";
### Building the table row with the days
if ($param['show_day'] == 1 && $param['day_mode'] == 0)
{
echo '<tr align="center">'."\n";
$first_day = $calendar_txt[$param['lang']]['first_day'];
for ($i = $first_day; $i < 7 + $first_day; $i++)
{
$index = ( $i >= 7) ? (7 + $i): $i;
$index = ($i < 0) ? (7 + $i) : $i;
$day_name = ( $param['short_day_name'] == 1 ) ? substr($calendar_txt[$param['lang']]['days'][$index], 0, 1) : $calendar_txt[$param['lang']]['days'][$index];
echo ' <td height="30" class="calendarHeader"><b>'.$day_name.'</b></td>'."\n";
}
echo '</tr>'."\n";
$first_decalage = $first_decalage - $calendar_txt[$param['lang']]['first_day'];
$first_decalage = ( $first_decalage > 7 ) ? $first_decalage - 7 : $first_decalage;
}
else
{
$first_decalage = 0;
}
echo '<tr>';
$int_counter = 0;
# Filling with empty cells at the begining
for ($i = 1; $i < $first_decalage; $i++)
{
echo '<td class="calendarDays"></td>'."\n";
$int_counter++;
}
### Building the table
for ($i = 1; $i <= $nb_days_month; $i++)
{
$f{$i} = 1;
### Do we highlight the current day ?
$i_2 = ($i < 10) ? '0'.$i : $i;
$highlight_current = ( isset($param['highlight'][date('Ym', $timestamp).$i_2]) );
### Row start
if ( ($i + $first_decalage) % $param['calendar_columns'] == 2 && $i != 1)
{
echo '<tr>'."\n";
$int_counter = 0;
}
$css_2_use = ( $highlight_current ) ? 'HL' : 'Days';
$txt_2_use = ( $highlight_current && $param['highlight_type'] == 'text') ? '<br>'.$param['highlight'][date('Ym', $timestamp).$i_2] : '';
if ($i == $current_day)
{
?>
<?php
// récuperation de l'initiale du jour pour autoriser que les Samedi et Dimanche
$d = date("l", mktime(0,0,0,$current_month,$i,$current_year));
if (($d=='Friday') || ($d=='Saturday'))
{
?>
<td class="calendarToday" onMouseover="javascript:this.style.background='#DDDDDD'" onMouseout="javascript:this.style.background='#A9B4B3'" onClick="location='form_calendar.php?d=<?php echo $current_year."-".$current_month."-".$i; ?>'" style="cursor:pointer;">
<?php echo $i.$txt_2_use; ?>
[b]<table width="100%" border="1" align="center" cellpadding="0" cellpadding="0">
<tr>
<?php
$date = $current_year."-".$current_month."-".$i;
$sql_check_soiree = "SELECT id_soiree, date, pc_libres
FROM calendar_soiree
WHERE date='".$date."'";
$query_check_soiree = mysql_query($sql_check_soiree);
if ($result_check_soiree = mysql_fetch_array($query_check_soiree))
{
$soiree = 1;
// on recupere le nombre de pc libres pour cette soirée
$pc_libres = $result_check_soiree['pc_libres'];
}
else
{
$soiree = 0;
$pc_libres = '18';
}
$pc_res = 18 - $pc_libres;
if ($soiree == 1)
{
// on recupere l'id_user de chaque reservation sur la soirée donnée
$sql_res = "SELECT id_res, id_user, nb_pc, username
FROM calendar_reservation, frm_users
WHERE id_soiree=".$result_check_soiree['id_soiree']."
AND calendar_reservation.id_user = frm_users.user_id
ORDER BY id_res";
$query_res = mysql_query($sql_res);
// si la requete renvoie quelquechose, on execute la boucle
while ($result_res = mysql_fetch_array($query_res))
{
// on recupere l'id_user de chaque reservation sur la soirée donnée
$tab[] = array( "username"=>$result_res['username'],
"nb_pc"=>$result_res['nb_pc'],
"id_user"=>$result_res['id_user']
);
}
// si la requete renvoie quelquechose, on execute la boucle
if ($query_res)
{
foreach($tab as $result)
{
if (!isset($b{$i}))
{
$b{$i} = 1;
}
echo $b{$i}." - ".$result['nb_pc'];
for ($a{$i}=$b{$i}; $a{$i}<=($result['nb_pc']+$b{$i}-1); $a{$i}++)
{
if (($a{$i} == '7') || ($a{$i} == '13'))
// le nombre de case maximum du tableau est de 18,
// pas la peine d'aller plus loin donc.
{
echo "<tr>\n";
}
echo "<td title=\"réservé par ".$result['username']."\"><img src=\"img/pc_res.gif\" width=\"15\">a{$i} = ".$a{$i}."<br>b{$i} = ".$f=$b{$i}."</td>\n";
}
$b{$i} = $a{$i};
}
}
}
?>
</tr>
</table>[/b]
<?php
}
else
{
?>
<td class="calendarToday">
<?php echo $i.$txt_2_use; ?>
<?php
}
?>
</td>
<?php
}
elseif ($param['link_on_day'] != '')
{
$loop_timestamp = mktime(0,0,0, $current_month, $i, $current_year);
if (( ($param['link_after_date'] == 0) && ($current_timestamp < $loop_timestamp)) || (($param['link_before_date'] == 0) && ($current_timestamp >= $loop_timestamp)) )
{
?>
<?php
// récuperation de l'initiale du jour pour autoriser que les Samedi et Dimanche
$d = date("l", mktime(0,0,0,$current_month,$i,$current_year));
if (($d=='Friday') || ($d=='Saturday'))
{
?>
<td class="calendar<?php echo $css_2_use; ?>" onMouseover="javascript:this.style.background='#DDDDDD'" onMouseout="javascript:this.style.background='#FFFFFF'" onClick="location='form_calendar.php?d=<?php echo $current_year."-".$current_month."-".$i; ?>'" style="cursor:pointer;">
<?php echo $i.$txt_2_use; ?>
<br />
[b]<table width="100%" border="0" align="center" cellpadding="0" cellpadding="0">
<tr>
<?php
$date = $current_year."-".$current_month."-".$i;
$sql_check_soiree = "SELECT id_soiree, date, pc_libres
FROM calendar_soiree
WHERE date='".$date."'";
$query_check_soiree = mysql_query($sql_check_soiree);
if ($result_check_soiree = mysql_fetch_array($query_check_soiree))
{
$soiree = 1;
// on recupere le nombre de pc libres pour cette soirée
$pc_libres = $result_check_soiree['pc_libres'];
}
else
{
$soiree = 0;
$pc_libres = '18';
}
$pc_res = 18 - $pc_libres;
if ($soiree == 1)
{
// on recupere l'id_user de chaque reservation sur la soirée donnée
$sql_res1 = "SELECT id_res, id_user, nb_pc, username
FROM calendar_reservation, frm_users
WHERE id_soiree=".$result_check_soiree['id_soiree']."
AND calendar_reservation.id_user = frm_users.user_id
ORDER BY id_res";
$query_res1 = mysql_query($sql_res1);
// si la requete renvoie quelquechose, on execute la boucle
while ($result_res1 = mysql_fetch_array($query_res1))
{
reset($tab1);
// on recupere l'id_user de chaque reservation sur la soirée donnée
$tab1[] = array( "username"=>$result_res1['username'],
"nb_pc"=>$result_res1['nb_pc'],
"id_user"=>$result_res1['id_user']
);
}
// si la requete renvoie quelquechose, on execute la boucle
if ($query_res1)
{
foreach($tab1 as $result1)
{
if (!isset($v{$i}))
{
$v{$i} = 1;
}
echo $v{$i}." - ".$result1['nb_pc'];
for ($u{$i}=$v{$i}; $u{$i}<=($result1['nb_pc']+$v{$i}-1); $u{$i}++)
{
if (($u{$i} == '7') || ($u{$i} == '13'))
// le nombre de case maximum du tableau est de 18,
// pas la peine d'aller plus loin donc.
{
echo "<tr>\n";
}
echo "<td title=\"réservé par ".$result1['username']."\"><img src=\"img/pc_res.gif\" width=\"15\">u{$i} = ".$u{$i}."<br>v{$i} = ".$v{$i}."</td>\n";
}
$v{$i} = $u{$i};
}
}
}
?>
</tr>
</table>[/b]
<?php
}
else
{
?>
<td class="calendar<?php echo $css_2_use; ?>">
<?php echo $i.$txt_2_use; ?>
<?php
}
?>
</td>
<?php
}
else
{
?>
<?php
// récuperation de l'initiale du jour pour autoriser que les Samedi et Dimanche
$d = date("l", mktime(0,0,0,$current_month,$i,$current_year));
if (($d=='Friday') || ($d=='Saturday'))
{
?>
<td class="calendar<?php echo $css_2_use; ?>" onMouseover="javascript:this.style.background='#DDDDDD'" onMouseout="javascript:this.style.background='#FFFFFF'" onClick="location='form_calendar.php?d=<?php echo $current_year."-".$current_month."-".$i; ?>'" style="cursor:pointer;">
<?php echo $i.$txt_2_use; ?>
[b]<table width="100%" border="0" align="center" cellpadding="0" cellpadding="0">
<tr>
<?php
$date = $current_year."-".$current_month."-".$i;
$sql_check_soiree = "SELECT id_soiree, date, pc_libres
FROM calendar_soiree
WHERE date='".$date."'";
$query_check_soiree = mysql_query($sql_check_soiree);
if ($result_check_soiree = mysql_fetch_array($query_check_soiree))
{
$soiree = 1;
// on recupere le nombre de pc libres pour cette soirée
$pc_libres = $result_check_soiree['pc_libres'];
}
else
{
$soiree = 0;
$pc_libres = '18';
}
$pc_res = 18 - $pc_libres;
if ($soiree == 1)
{
// on recupere l'id_user de chaque reservation sur la soirée donnée
$sql_res2 = "SELECT id_res, id_user, nb_pc, username
FROM calendar_reservation, frm_users
WHERE id_soiree=".$result_check_soiree['id_soiree']."
AND calendar_reservation.id_user = frm_users.user_id
ORDER BY id_res";
$query_res2 = mysql_query($sql_res2);
// si la requete renvoie quelquechose, on execute la boucle
reset($tab2);
while ($result_res2 = mysql_fetch_array($query_res2))
{
// on recupere l'id_user de chaque reservation sur la soirée donnée
$tab2[] = array( "username"=>$result_res2['username'],
"nb_pc"=>$result_res2['nb_pc'],
"id_user"=>$result_res2['id_user']
);
}
// si la requete renvoie quelquechose, on execute la boucle
if ($query_res2)
{
$op = 1;
foreach($tab2 as $result2)
{
//$f{$i} = 1;
if (!isset($f{$i}))
{
$f{$i} = 1;
}
echo $f{$i}." - ".$result2['nb_pc'];
echo "<b>".$op."</b>";
// + $f{$i} !!!!!
if ($op == 1)
{
echo "pwet";
for ($e{$i}=$f{$i}; $e{$i}<=($result2['nb_pc']+($f{$i}-1)); $e{$i}++)
{
if (($e{$i} == '7') || ($e{$i} == '13'))
// le nombre de case maximum du tableau est de 18,
// pas la peine d'aller plus loin donc.
{
echo "<tr>\n";
}
echo "<td title=\"réservé par ".$result2['username']."\"><img src=\"img/pc_res.gif\" width=\"15\">e{$i} = ".$e{$i}."<br>f{$i} = ".$f{$i}."</td>\n";
}
}
else
{
echo "ppwet";
for ($e{$i}=$f{$i}; $e{$i}<=(($result2['nb_pc']+$f{$i})-1); $e{$i}++)
{
if (($e{$i} == '7') || ($e{$i} == '13'))
// le nombre de case maximum du tableau est de 18,
// pas la peine d'aller plus loin donc.
{
echo "<tr>\n";
}
echo "<td title=\"réservé par ".$result2['username']."\"><img src=\"img/pc_res.gif\" width=\"15\">e{$i} = ".$e{$i}."<br>f{$i} = ".$f{$i}."</td>\n";
}
}
// for ($e{$i}=$f{$i}; $e{$i}<=($result2['nb_pc']+($f{$i}-1)); $e{$i}++)
$f{$i} = $e{$i};
$op++;
}
}
}
?>
</tr>
</table>[/b]
<?php
}
else
{
?>
<td class="calendar<?php echo $css_2_use; ?>">
<?php echo $i.$txt_2_use; ?>
<?php
}
?>
</td>
<?php
}
}
else
{
echo '<td class="calendar'.$css_2_use.'">'.$i.'</td>'."\n";
}
$int_counter++;
### Row end
if ( ($i + $first_decalage) % ($param['calendar_columns'] ) == 1 )
{
echo '</tr>'."\n";
}
}
$cell_missing = $param['calendar_columns'] - $int_counter;
for ($i = 0; $i < $cell_missing; $i++)
{
echo '<td class="calendarDays"></td>'."\n";
}
echo '</tr>'."\n";
### Display the nav links on the bottom of the table
if ($param['nav_link'] == 1)
{
$previous_month = date("Ymd",
mktime( 12,
0,
0,
($current_month - 1),
$current_day,
$current_year
)
);
$previous_day = date("Ymd",
mktime( 12,
0,
0,
$current_month,
$current_day - 1,
$current_year
)
);
$next_day = date("Ymd",
mktime( 1,
12,
0,
$current_month,
$current_day + 1,
$current_year
)
);
$next_month = date("Ymd",
mktime( 1,
12,
0,
$current_month + 1,
$current_day,
$current_year
)
);
if ($param['use_img'])
{
$g = '<img src="img/g.gif" border="0">';
$gg = '<img src="img/gg.gif" border="0">';
$d = '<img src="img/d.gif" border="0">';
$dd = '<img src="img/dd.gif" border="0">';
}
else
{
$g = '<';
$gg = '<<';
$d = '>';
$dd = '>>';
}
if ( ($param['link_after_date'] == 0)
&& ($current_timestamp < mktime(0,0,0, $current_month, $current_day+1, $current_year))
)
{
$next_day_link = '';
}
else
{
$next_day_link = '<a href="'.$PHP_SELF.'?date='.$next_day.'" title="'.$calendar_txt[$param['lang']]['misc'][3].'">'.$d.'</a>'."\n";
}
if ( ($param['link_before_date'] == 0)
&& ($current_timestamp > mktime(0,0,0, $current_month, $current_day-1, $current_year))
)
{
$previous_day_link = '';
}
else
{
$previous_day_link = '<a href="'.$PHP_SELF.'?date='.$previous_day.'" title="'.$calendar_txt[$param['lang']]['misc'][2].'">'.$g.'</a>'."\n";
}
if ( ($param['link_after_date'] == 0)
&& ($current_timestamp < mktime(0,0,0, $current_month+1, $current_day, $current_year))
)
{
$next_month_link = '';
}
else
{
$next_month_link = '<a href="'.$PHP_SELF.'?date='.$next_month.'" title="'.$calendar_txt[$param['lang']]['misc'][1].'">'.$dd.'</a>'."\n";
}
if ( ($param['link_before_date'] == 0)
&& ($current_timestamp >= mktime(0,0,0, $current_month, $current_day, $current_year))
)
{
$previous_month_link = '';
}
else
{
$previous_month_link = '<a href="'.$PHP_SELF.'?date='.$previous_month.'" title="'.$calendar_txt[$param['lang']]['misc'][0].'">'.$gg.'</a>'."\n";
}
echo '<tr>'."\n";
echo ' <td colspan="'.$param['calendar_columns'].'" class="calendarBottom">'."\n";
echo ' <table width="100%" border="0" >';
echo ' <tr>'."\n";
echo ' <td width="50%" align="left" style="padding-left:20px;">'."\n";
echo $previous_month_link;
echo ' </td>'."\n";
echo ' <td width="50%" align="right" style="padding-right:20px;">'."\n";
echo $next_month_link;
echo ' </td>'."\n";
echo ' </tr>';
echo ' </table>';
echo ' </td>'."\n";
echo '</tr>'."\n";
}
echo '</table>'."\n";
}
function priv_reg_glob_calendar($var)
{
Global $HTTP_GET_VARS, $HTTP_POST_VARS;
if (isset($HTTP_GET_VARS[$var]))
{
return $HTTP_GET_VARS[$var];
}
elseif (isset($HTTP_POST_VARS[$var]))
{
return $HTTP_POST_VARS[$var];
}
else
{
return '';
}
}
?>
Je redefinie $f{$i} à 0 au début de la boucle qui crée chaque jour, après le commentaire ### Building the table
en gras, les passages importants. Tu remarqueras qu'il y'a à peu pres 3 fois le même code qui se repete : le premier morceau correspond au jour en cours, le deuxieme morceau aux jours précédents, le troisième morceau aux jours suivants.
J'ai essay d'inclure le reset() du tableau dans la partie des jours précédents, et il me sort une erreur :
while ($result_res1 = mysql_fetch_array($query_res1))
{
reset($tab1);
// on recupere l'id_user de chaque reservation sur la soirée donnée
$tab1[] = array( "username"=>$result_res1['username'],
"nb_pc"=>$result_res1['nb_pc'],
"id_user"=>$result_res1['id_user']
);
}
Warning: reset(): Passed variable is not an array or object in c:\program files\easyphp1-7\www\calendrier\calendrier2.php on line 349
En tout cas merci de t'etre plongé un peu dans ce probleme : )