gpt4 book ai didi

php - MySQL更新重复事件

转载 作者:行者123 更新时间:2023-11-29 00:41:03 24 4
gpt4 key购买 nike

我已经为此苦苦挣扎了一段时间,希望能有一些新鲜的想法。

我有一个包含重复事件的事件日历。我在尝试更新重复发生的事件时遇到了一些问题。

我有一个简单的表单,我向用户询问星期几和开始日期。

我想在开始日期之后获取一周的第二天(这里没有问题)并将该周的退出事件更新为新的开始日期(仍然没有问题)。然后我想将之后的所有其他事件增加到它之前的事件之后的 7 天。 (<--问题)

<?php
session_start();
require_once '../../../config/db-config.php';
$weekday = $_POST['weekday']; // day of the week the event should take place on
$start_date = $_POST['start-date']; //new starting date of the event
if (date('N', strtotime($start_date)) == $weekday)
{
$start_date = $_POST['start-date'];
}
else
{
$start_date = date('Y-m-d', strtotime("next $weekday", strtotime($start_date))); //gets the first day of the week after the starting date. First event should start on this day.
}
$start_time = $_POST['start-time'];
$end_time = $_POST['end-time'];

$start = $start_date . " " . $start_time; //'yyyy-dd-mm hh:mm:ii' format
$end = $start_date . " " . $end_time;

$repeats = $_POST['repeats']; // 1 for repeats 0 for no repeats
$repeat_freq = $_POST['repeat-freq']; //7 for 7 days, 14 for 14 days etc
$parent_id = $_POST['parent-id']; //common parent_id to the event group

$stmt = $dbh->prepare("
UPDATE events
SET start = :start, end = :end
WHERE parent_id = :parent_id AND WEEK(start) =WEEK(:start)"); //This updates the existing event of that week to the new starting date

$stmt->bindParam(':start', $start);
$stmt->bindParam(':end', $end);
$stmt->bindParam(':parent_id', $parent_id);
$stmt->execute();

}

现在我需要循环遍历此事件之后的每个事件(具有相同的 parent_id)并将其递增 7 天(或任何我的 repeat_freq 是什么)。我试过使用

UPDATE events
SET start = :start + INTERVAL 7 DAY, end = :end + INTERVAL 7 DAY

但这只是将所有事件更新为新开始日期后 7 天,而不是从上一个事件起 7 天。如果我可以将它放在一个循环中而不必引用特定的事件 ID 并按顺序进行,那就太好了。不过,我愿意接受任何解决方案。感谢阅读。

架构更新

我的 parent_events 表有

parent_id (auto increment) | start_date | repeats | repeat_freq |

我的事件表有以下内容

event_id (auto increment) | parent_id | start | end |

创建新的重复事件时,我在 parent_events 表中插入一行。我使用 lastInsertId() 获取新的 parent_id,并在将(该父事件的)所有重复实例插入事件表时使用它。基本上,事件表包含特定(父)事件的所有实例。

工作代码更新

$stmt = $dbh->prepare("
SELECT event_id
FROM events
WHERE parent_id = :parent_id AND WEEK(start) >=WEEK(:start)");


$stmt->bindParam(':start', $start_date);
$stmt->bindParam(':parent_id', $parent_id);
$stmt->execute();
$updateArray = array();
$last_class = 0;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if ($last_event != $row['event_id']) {
$last_event = $row['event_id'];
$updateArray[$last_event] = array('event_id' => $row['event_id']);
}
}


foreach($updateArray as $update){
$event_id = $update['event_id'];
$stmt = $dbh->prepare("
UPDATE events
SET title = start = :start, end=:end
WHERE event_id = :event_id");


$stmt->bindParam(':start', $start);
$stmt->bindParam(':end', $end);
$stmt->bindParam(':event_id', $event_id);
$stmt->execute();

$new_start = strtotime($start . '+' . $repeat_freq . 'DAYS');
$new_end = strtotime($end . '+' . $repeat_freq . 'DAYS');
$start = gmdate("Y-m-d H:i", $new_start);
$end = gmdate("Y-m-d H:i", $new_end);
}

最佳答案

我认为最简单的方法是通过 PHP 遍历事件集。

我将在下面写下重要的代码:

$sql='SELECT event_id AS id from events WHERE parent_id=:parent_id AND start=:start

运行此查询将获得一个包含所有需要更新的 ID 的数组

 $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$row_date=array();
$row_date[0]=$start //get start date
foreach ($rows as $row)

$sql_date="SELECT TIMESTAMPADD(week,1,$row_date[0])"; //increment start date by 1 week
$date = $mysqli->query($sql_date);
$row_date = $result->fetch_array(MYSQLI_NUM); //Set the start date as Start date + 1 week to reflect in the next loop.

$sql_update="UPDATE events SET start=$row_date[0] WHERE event_id=$row['id']";
$mysqli->query($sql_update);
end foreach

我的代码需要一些调整,但我认为这有助于实现这个想法。

关于php - MySQL更新重复事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12257667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com