从数据库中获取特定日期范围内的 FullCalender.io 个事件对象 (JSON)
Fetch FullCalender.io Event Objects (JSON) from Database for a specific date-range
我有一个庞大的数据库和很多事件。每次我转到日历主页(月视图)时,数据库中的所有现有事件都会被加载,尽管我只查看当前月份。目前,我的 html 页面超过 3MB,而且往往会减慢我的浏览器选项卡速度。
为了解决这个问题,我开始更改代码以仅获取当月的事件 json。不幸的是,日期范围的开始和结束日期不起作用 - 该页面仍在从数据库中获取所有事件。我已经做了几个小时的研究和大量调整。
到目前为止,我设法获取了我的 FullCalendar.io 事件 - 我有两个事件源 - 所以我使用了:
eventSources: [
{
url: 'include/load-calendar-event.php', // use the `url` property
color: '#008000',
},
{
url: 'include/load-calendar-event-retour.php', // use the `url` property
color: '#008000',
},
// any other sources...
],
获取事件的相应两个文件几乎相同 - 所以一个就足够了:
加载日历-event.php
require_once('bdd.php');
$sql = "SELECT * FROM messages"; // this selects all rows
$req = $bdd->prepare($sql);
$req->execute();
$events = $req->fetchAll();
$data = array();
foreach($events as $event) {
$start = explode(" ", $event['start']);
$end = explode(" ", $event['end']);
if($start[1] == '00:00:00'){
$start = $start[0];
}else{
$start = $event['start'];
}
if($end[1] == '00:00:00'){
$end = $end[0];
}else{
$end = $event['end'];
}
$data[] = array(
'id'=> $event['id'],
'title'=> $event['title'],
'start'=> $start,
'end'=> $end,
'color'=> $event['color']
);
}
echo json_encode($data);
通过调用日历页面,浏览器会进行以下调用 - 请注意日期 (2020-01-01 - 2020-02-01) 和数据格式:
...include/load-calendar-event.php?start=2020-01-01&end=2020-02-01&_=1578601056565
和
...include/load-calendar-event-retour.php?start=2020-01-01&end=2020-02-01&_=1578601056566
screenshot of call in firebug
事件的日期格式保存在数据库中的格式如下(YYYY-MM-DD HH:mm:ss):
2020-01-11 10:00:00
问题:
知道如何只获取当月的事件吗?
为什么要选择 table 中的所有行并遍历它们?
您需要更新查询以提取作为 $_GET
参数传递的开始值和结束值。
require_once('bdd.php');
$sdate = $_GET['start']; //LIKE THIS
$edate = $_GET['end']; //AND THIS
$sql = "SELECT * FROM messages WHERE date >= ".$sdate." AND date <= ".$edate; // this selects all rows. Change 'date' to whatever your column name is in the database.
$req = $bdd->prepare($sql);
$req->execute();
$events = $req->fetchAll();
$data = array();
foreach($events as $event) {
$start = explode(" ", $event['start']);
$end = explode(" ", $event['end']);
if($start[1] == '00:00:00'){
$start = $start[0];
}else{
$start = $event['start'];
}
if($end[1] == '00:00:00'){
$end = $end[0];
}else{
$end = $event['end'];
}
$data[] = array(
'id'=> $event['id'],
'title'=> $event['title'],
'start'=> $start,
'end'=> $end,
'color'=> $event['color']
);
}
echo json_encode($data);
您可以通过简单地使用 PHP 的日期函数生成开始和结束日期而不是使用查询字符串参数传递变量来更轻松地完成此操作。虽然这会给你更多的灵活性。如果设置了这些值,您甚至可以包含一些 if/else 语句来生成不同的查询。
我有一个庞大的数据库和很多事件。每次我转到日历主页(月视图)时,数据库中的所有现有事件都会被加载,尽管我只查看当前月份。目前,我的 html 页面超过 3MB,而且往往会减慢我的浏览器选项卡速度。
为了解决这个问题,我开始更改代码以仅获取当月的事件 json。不幸的是,日期范围的开始和结束日期不起作用 - 该页面仍在从数据库中获取所有事件。我已经做了几个小时的研究和大量调整。
到目前为止,我设法获取了我的 FullCalendar.io 事件 - 我有两个事件源 - 所以我使用了:
eventSources: [
{
url: 'include/load-calendar-event.php', // use the `url` property
color: '#008000',
},
{
url: 'include/load-calendar-event-retour.php', // use the `url` property
color: '#008000',
},
// any other sources...
],
获取事件的相应两个文件几乎相同 - 所以一个就足够了:
加载日历-event.php
require_once('bdd.php');
$sql = "SELECT * FROM messages"; // this selects all rows
$req = $bdd->prepare($sql);
$req->execute();
$events = $req->fetchAll();
$data = array();
foreach($events as $event) {
$start = explode(" ", $event['start']);
$end = explode(" ", $event['end']);
if($start[1] == '00:00:00'){
$start = $start[0];
}else{
$start = $event['start'];
}
if($end[1] == '00:00:00'){
$end = $end[0];
}else{
$end = $event['end'];
}
$data[] = array(
'id'=> $event['id'],
'title'=> $event['title'],
'start'=> $start,
'end'=> $end,
'color'=> $event['color']
);
}
echo json_encode($data);
通过调用日历页面,浏览器会进行以下调用 - 请注意日期 (2020-01-01 - 2020-02-01) 和数据格式:
...include/load-calendar-event.php?start=2020-01-01&end=2020-02-01&_=1578601056565
和
...include/load-calendar-event-retour.php?start=2020-01-01&end=2020-02-01&_=1578601056566
screenshot of call in firebug
事件的日期格式保存在数据库中的格式如下(YYYY-MM-DD HH:mm:ss):
2020-01-11 10:00:00
问题:
知道如何只获取当月的事件吗?
为什么要选择 table 中的所有行并遍历它们?
您需要更新查询以提取作为 $_GET
参数传递的开始值和结束值。
require_once('bdd.php');
$sdate = $_GET['start']; //LIKE THIS
$edate = $_GET['end']; //AND THIS
$sql = "SELECT * FROM messages WHERE date >= ".$sdate." AND date <= ".$edate; // this selects all rows. Change 'date' to whatever your column name is in the database.
$req = $bdd->prepare($sql);
$req->execute();
$events = $req->fetchAll();
$data = array();
foreach($events as $event) {
$start = explode(" ", $event['start']);
$end = explode(" ", $event['end']);
if($start[1] == '00:00:00'){
$start = $start[0];
}else{
$start = $event['start'];
}
if($end[1] == '00:00:00'){
$end = $end[0];
}else{
$end = $event['end'];
}
$data[] = array(
'id'=> $event['id'],
'title'=> $event['title'],
'start'=> $start,
'end'=> $end,
'color'=> $event['color']
);
}
echo json_encode($data);
您可以通过简单地使用 PHP 的日期函数生成开始和结束日期而不是使用查询字符串参数传递变量来更轻松地完成此操作。虽然这会给你更多的灵活性。如果设置了这些值,您甚至可以包含一些 if/else 语句来生成不同的查询。