php - 在日历中添加事件

标签 php mysql sql calendar

我几个月前解决了从两个表中获取数据并制作事件日历的问题。你可以在这里看到:original question . 现在我想要更多:我想同时为每个用户发布一个事件广告。假设是假期(如圣诞节),我想为所有用户添加此事件。我使用两个查询,第一个是选择假期,第二个是选择用户是否在场。如果存在 tip_id = 0,如果不存在 tip_id = 1。然后我将所有内容都放在一个表中。如果这一天是星期六或星期日,则颜色为灰色(使用 css1),如果用户在场,则单元格颜色为白色,如果用户不在,则颜色为红色。 我需要的?如果我在那个月有假期,我需要单元格颜色也为灰色(如星期六和星期日)。我尝试了不同的想法,但或者我只能在假期的第一个日子变灰,或者只有最后一天变灰,或者当那个月没有假期时我会出错。 代码(只摘录了我需要帮助的部分)是这样的:

$db_luna=11;
$db_an=2013;
$days_in_month = 31;

mysql_select_db($database_dbconfig, $dbconfig);
$query_Holidays = "SELECT substring(data,9,2) AS zile_sarbatoare, data FROM sarbatori WHERE sarbatori.`data` LIKE '".$db_an."-".$db_luna."-%' ORDER BY zile_sarbatoare";
$Holidays = mysql_query($query_Holidays, $dbconfig) or die(mysql_error());
$row_Holidays = mysql_fetch_assoc($Holidays);
$totalRows_Holidays = mysql_num_rows($Holidays);

mysql_select_db($database_dbconfig, $dbconfig);
$query_Presence = "SELECT c.full_name, c.id_personal, COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-01') BETWEEN start_date AND end_date THEN tip_id END),0) '1', COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-02') BETWEEN start_date AND end_date THEN tip_id END),0) '2', COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-03') BETWEEN start_date AND end_date THEN tip_id END),0) '3', COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-04') BETWEEN start_date AND end_date THEN tip_id END),0) '4', COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-05') BETWEEN start_date AND end_date THEN tip_id END),0) '5' FROM calendar c";
$Presence = mysql_query($query_Presence, $dbconfig) or die(mysql_error());
$row_Presence = mysql_fetch_assoc($Presence);
$totalRows_Presence = mysql_num_rows($Presence);}



<?php do { ?>
        <tr>
            <td><?php echo $nr_crt, '. ' , $row_Presence['full_name']; ?></td>
                <?php           
                $css1 = 'white';
                $trim = ''; 
                    for ($a = 1; $a <= $days_in_month; $a++){
                        $data_calculata = date("Y-m-d",mktime(0,0,0, $db_luna, $b, $db_an ));
                            if ($row_Presence[$a] == 0) {$legend = $row_Presence['full_name']."".$a;
                                                         $day_of_week = date("N",mktime(0,0,0, $db_luna,$a ,$db_an));
                                                         if ($day_of_week == 6 OR $day_of_week == 7) {$css1 = 'grey';}
                                                         else {$css1 = 'white';}
                            if ($row_Presence[$a] == 1) {$css1 = 'red'; $legend = $row_Presence['full_name']." - Absent";}
                        echo '<td " title= "'.htmlspecialchars($legend).'" class='.$css1.'></td>';
                        $nr_crt = $nr_crt + 1;
                ?>          
        </tr>            
    <?php } while ($row_Presence = mysql_fetch_assoc($Presence)); ?>
  </table>

最佳答案

我找到的解决方案是这样的:

$db_luna=11;
$db_an=2013;
$days_in_month = 31;

mysql_select_db($database_dbconfig, $dbconfig);
$query_Holidays = "SELECT substring(data,9,2) AS zile_sarbatoare, data FROM sarbatori WHERE sarbatori.`data` LIKE '".$db_an."-".$db_luna."-%' ORDER BY zile_sarbatoare";
$Holidays = mysql_query($query_Holidays, $dbconfig) or die(mysql_error());
$totalRows_Holidays = mysql_num_rows($Holidays);
$days_holidays = array();
while ($row_Holidays = mysql_fetch_array($Holidays))
 {
     $days_holidays[] = $row_Holidays['zile_sarbatoare'];
 }
// so, now I have an array with all the days I need

mysql_select_db($database_dbconfig, $dbconfig);
$query_Presence = "SELECT c.full_name, c.id_personal, COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-01') BETWEEN start_date AND end_date THEN tip_id END),0) '1', COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-02') BETWEEN start_date AND end_date THEN tip_id END),0) '2', COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-03') BETWEEN start_date AND end_date THEN tip_id END),0) '3', COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-04') BETWEEN start_date AND end_date THEN tip_id END),0) '4', COALESCE(MIN(CASE WHEN CONCAT($db_an, '-', $db_luna, '-05') BETWEEN start_date AND end_date THEN tip_id END),0) '5' FROM calendar c";
$Presence = mysql_query($query_Presence, $dbconfig) or die(mysql_error());
$row_Presence = mysql_fetch_assoc($Presence);
$totalRows_Presence = mysql_num_rows($Presence);}



<?php do { ?>
    <tr>
        <td><?php echo $nr_crt, '. ' , $row_Presence['full_name']; ?></td>
            <?php           
            $css1 = 'white';
            $trim = ''; 
                for ($a = 1; $a <= $days_in_month; $a++){
                    $data_calculata = date("Y-m-d",mktime(0,0,0, $db_luna, $b, $db_an ));
                     if ($row_Presence[$a] == 0) {$legend = $row_Presence['full_name']."".$a;
                                                     $day_of_week = date("N",mktime(0,0,0, $db_luna,$a ,$db_an));
                           $css1 = 'white';                                                         
                        if ($day_of_week == 6 OR $day_of_week == 7) {$css1 = 'grey';}
                        if (in_array($a, $days_holidays)) {$css1 = 'grey';} //here I compare each day if it is in the array
                     if ($row_Presence[$a] == 1) {$css1 = 'red'; $legend = $row_Presence['full_name']." - Absent";}
                    echo '<td " title= "'.htmlspecialchars($legend).'" class='.$css1.'></td>';
                    $nr_crt = $nr_crt + 1;
            ?>          
    </tr>            
<?php } while ($row_Presence = mysql_fetch_assoc($Presence)); ?>

对我来说它很管用!使用函数“in_array”的想法来自该站点的另一个问题。谢谢计算器:)

关于php - 在日历中添加事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20187403/

相关文章:

php - 如何更新复选框所选 ID 的数据库并将邮件发送到相应的电子邮件地址

PHP/MySQL - 允许用户为 CMS 创建自定义表单字段

php - 如何使用sql结果中的值作为其子查询的表名?

sql - TOP 1 或 LIMIT 1 在相关子查询中不起作用 - SPS 11

sql - Find Last Record in Chain - 一个客户合并过程

PHP - 从模型加载数据库对象但只有一个实例的最佳方法?

php - 如何在 Laravel Lumen 中设置 Session 或 Cookie 的生命周期

mysql - 为什么会出现段错误(核心已转储)?

mysql - 内部加入 like 子句

php - 从 Linux 上的 PHP 连接到 MS SQL Server?