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
} 

}

データベースでは、予定の属性は「date」で、現在は「16.09.2012」のような文字列です。また、UNIXタイムスタンプに変更する必要がありますか?

日付の下に提出された予定を含むJSONオブジェクトを出力するようにPHPサービスを変更するにはどうすればよいですか?

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 オブジェクトが作成されます。これで、オブジェクトを for .. in javascript ループで反復処理できるようになりました (オブジェクトをメンバーとしてプレーンな JavaScript オブジェクトをループする方法は? )

于 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
      // ...
    }
    

if最初に予約済みの日付のみの JSON 配列を返すことで、クライアント側のオーバーヘッドを削減することを検討することもできます (この場合、上記の内側のループは単純なステートメントに置き換えることができます)。

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 に答える