PHP周期性预约数据库条目生成无限循环问题求助
无限循环问题排查与修复
问题背景
需要创建按7天周期重复的预约数据库条目(如2024-06-06至2024-06-18,生成6日、12日、18日的记录),每个日期生成1-8小时的对应条目,但当前代码触发无限循环,生成大量无效数据。
核心问题分析
- for循环条件错误:
原代码中for ( $i = $fromform->time; $i = $fromform->timelaptopanzahl; $i++ )使用了赋值运算符=而非比较运算符<=,导致循环条件始终为真,无限执行。 - redirect位置错误:
将跳转代码放在foreach循环内部,第一次循环执行后就会直接跳转,后续日期的记录不会被处理。 - DatePeriod结束日期兼容:
PHP的DatePeriod默认不包含结束日期,若需要包含结束日期,需调整构造参数。
修复后的代码
$startDateTime = new DateTime(); $endDateTime = new DateTime(); $dateInterval = new DateInterval('P7D'); // 调整为包含结束日期(若不需要则移除modify('+1 day')) $datePeriod = new DatePeriod( $startDateTime->setTimestamp($fromform->date), $dateInterval, $endDateTime->setTimestamp($fromform->reservto)->modify('+1 day') ); foreach ($datePeriod as $dateTime) { // 修正for循环条件:使用<=进行范围判断 for ($i = $fromform->time; $i <= $fromform->timelaptopanzahl; $i++) { $newdate = $dateTime->format("Y-m-d"); $recordtoinsert = new stdClass(); $recordtoinsert->datum = $newdate; $recordtoinsert->ustd = $i; $recordtoinsert->resfuer = $fromform->resfuer; if ($fromform->room == 1) { $buchungfromform = 'Raum: ' . $fromform->raum . ' durch ' . $fromform->resfuer; $bgcolor = 'blue'; } elseif ($fromform->laptopcheck == 1) { $buchungfromform = 'Laptop: ' . $fromform->laptop . '(' . $fromform->timelaptopanzahl . ' Stk.)' . ' durch ' . $fromform->resfuer; $bgcolor = 'green'; } $recordtoinsert->buchung = $buchungfromform; $recordtoinsert->userid = $fromform->userid; $recordtoinsert->bgcolor = $bgcolor; $DB->insert_record('bs_steinweg', $recordtoinsert); } } // 将跳转代码移至所有循环执行完毕后 $getsaved = get_string('saved', 'local_buchungssystem'); redirect($CFG->wwwroot . '/local/buchungssystem/bs_sw.php', $getsaved);
额外说明
- 若不需要包含结束日期,直接移除
modify('+1 day')即可。 - 确认
$fromform->time和$fromform->timelaptopanzahl的数值范围为1-8,避免生成超出需求的小时记录。
内容的提问来源于stack exchange,提问作者Sascha S
相关产品推荐
相关产品推荐

