1

我正在建立一个网站,用户可以在其中预订约会。

我目前正在为该项目构建一个 javascript 应用程序,用户可以在其中从日历中选择一个日期并查看可用的约会。当我构建日历时,我需要按可用的约会为日期着色(例如,如果有的话,则为绿色)。

为此,我需要迭代一个包含所有可用预订的 javascript 数组。目前它看起来像这样:

[对象,对象,对象...]

其中对象是包含约会信息的 javascript 对象。这是为 JSON 提供服务的 php 服务:

<?php
require_once('../include/dbconnect.php');

$sql = "SELECT appointment.example,... 
person.example,... 
FROM appointment, person
WHERE appointment.reserved=0";

$stmt = $db->prepare($sql);
$stmt->execute();

$array = array();
while($row = $stmt->fetchObject()){
array_push($array, $row);
}

echo json_encode($array);
?>

所以这最终把我们带到了这个问题上。

为了更轻松地进行 javascript 数组扫描,我需要一个数组/对象,包括按日期排列/排序的约会。然后,当我创建一个表示日期的元素时,我可以检查对象是否匹配数据。像这样的数据:

{
15.09.2012 : Object,
16.09.2012 : Object{
    appointment1 : Object,
    appointment2 : Object
} 

}

在数据库中,约会有一个属性“日期”,该属性当前是一个类似于“16.09.2012”的字符串。我还应该将其更改为 unix 时间戳吗?

我应该如何更改 PHP 服务以输出一个 JSON 对象,其中包括在日期下提交的约会?

4

3 回答 3

1

一种可能的解决方案是在 php 中使用关联数组:

$assoc = array("key" => "value");

当您获取数据库记录时,您可以执行以下操作:

$array = array();
while($row = $stmt->fetchObject()){
$array[$row -> date] = $row;
}

echo json_encode($array);

对于排序,您可以使用ksort( http://php.net/manual/en/function.ksort.php ) php 函数,按键对数组进行排序。

现在您将拥有一个 Javascript 对象而不是 Javascript 数组。现在您可以在 javascript 循环中使用 for .. 来迭代对象(How to Loop through plain JavaScript object with objects as members?

于 2012-09-15T10:20:27.250 回答
1

您可以尝试如下:

$sql = "SELECT appointment.example,... 
person.example,... 
FROM appointment, person
WHERE appointment.reserved=0 ORDER BY appointment.date_field ASC";

$stmt = $db->prepare($sql);
$stmt->execute();

$array = array();
while($row = $stmt->fetchObject()){
$array[$row->date_field][]=$row;
array_push($array, $row);
}

echo json_encode($array);
?>
于 2012-09-15T10:24:04.263 回答
1

您不需要构造由日期键组成的对象。反而:

  1. 在当前结构中包含日期并按日期对数组进行排序:

    <?php
    require_once('../include/dbconnect.php');
    
    $stmt = $db->query('
      SELECT   DATE(appointment.datetime) AS date,
               appointment.datetime,
               appointment.reserved,
               appointment.example,     -- do you really want to send sensitive
               person.example           -- data about appointments to the browser?
      FROM     appointment JOIN person ON ...
      WHERE    appointment.reserved = 0 -- should this be = 1?
      ORDER BY appointment.datetime
    ');
    
    echo json_encode($stmt->fetchAll(PDO::FETCH_OBJ));
    ?>
    
  2. 然后在遍历数组时跳过匹配的日期:

    // loop over all dates displayed in calendar
    for (
      currentDate  = startDate, i = 0;
      currentDate <= endDate;
      currentDate.setDate(currentDate.getDate() + 1)
    ){
    
      // determine whether the current date is booked
      // and advance pointer to next date in array
      for (
        booked = false;
        i < arr.length && arr[i].date == currentDate;
        ++i
      ) booked |= arr[i].reserved;  // or just `booked = true` if query
                                    // returned only booked appointments
    
      // apply appropriate CSS to currentDate
      // ...
    }
    

您甚至可以考虑通过首先返回一个仅包含预订日期的 JSON 数组来减少客户端开销(在这种情况下,上面的内部循环可以用一个简单的if语句替换):

SELECT   DISTINCT DATE(appointment.datetime) AS date
FROM     appointment JOIN person ON ...
WHERE    appointment.reserved = 0 -- should this be = 1?
ORDER BY date

然后,一旦用户选择了一个日期,就对该日期的预订进行进一步查询:

SELECT   appointment.datetime
FROM     appointment JOIN person ON ...
WHERE    appointment.reserved = 0 -- should this be = 1?
     AND DATE(appointment.datetime) = ?
ORDER BY appointment.datetime
于 2012-09-15T11:14:39.510 回答