1

MySQL のテーブルには、今後数年間のホテル予約が保持されます。

各行には、id、start_date、end_date、および status が含まれます。start_date にはチェックイン日を表す日付タイプが含まれ、end_date はチェックアウト日です。

個々の日付の配列を取得して、1 年間のカレンダーをループし、来年の空いている日付と予約されている日付を表示できるようにしたいと考えています。

チェックアウトが早いため、ホテルは end_date に部屋を再び貸し出すことができるため、 end_date 自体を含める必要はありません。

ID | start_date |  end_date  | status

1  | 03/15/2014 | 03/18/2014 |  Paid
2  | 05/22/2014 | 05/25/2014 |  Deposit
3  | 08/12/2014 | 08/13/2014 |  Paid

そして配列する:

 $months_arry = array(1 => '03/15/2014', 1 => '03/16/2014', 1 => '03/17/2014',
 1 => '05/22/2014', 1 => '05/23/2014', 1 => '05/24/2014', 1 => '08/12/2014');

カレンダーの 12 か月すべてが同じページに垂直に表示されるため、配列に対して各日付をチェックして、空席を緑にするか、占有を赤にするかを確認するのが最も簡単です。

SQLサーバー上のasp 3.0では、「

SELECT start_date, end_date from HotelBookings where start_date >= '2013-12-31'
 AND enddate <= '2015-01-01' ORDER BY start_date ASC"

次に、.. do until rs.EOF ループ .. 内部で

loop i は start_date と end_date を取得し、2 つが等しくなるまでそれらをループし、個々の日付の配列を構築する際に start_date に + 1 を追加します。

答えを探しているときにこの例を見つけましたが、見苦しくエレガントではありません

<?php
// Make a MySQL Connection
$query = "SELECT * FROM example"; 

$result = mysql_query($query) or die(mysql_error());


while($row = mysql_fetch_array($result)){
    echo $row['name']. " - ". $row['age'];
    echo "<br />";
}
?>
4

2 に答える 2

1

本体に SQL ステートメントを含むループには注意してください。SQL はn回実行されるためです。nはループ本体が実行される回数です。それは潜在的に非常に非効率的です。

ここでは、DateTime オブジェクトが味方になります。

// note that an array with the same key pointing to more than one value will have its values override eachother.
// array(1 => 'foo', 1 => 'bar') is generally not a good idea.
$months_array = array('03/15/2014', '03/16/2014', '03/17/2014', '05/22/2014', '05/23/2014', '05/24/2014', '08/12/2014');

// covert dates to check to DateTimes so that we can perform comparisons on them
$to_check_array = array_map(function ($value) { return new DateTime($value); } , $months_array);

// get all taken date ranges
$result = mysql_query("SELECT `start_date`, `end_date` FROM `date_table`");

// loop over all taken date ranges
while ($row = mysql_fetch_row($result))
{
  // convert dates to DateTimes to perform comparisons on them
  $start_date = new DateTime($row[0]);
  $end_date   = new DateTime($row[1]);

  // check each date against all taken ranges
  foreach ($to_check_array as $cur)
  {
    if ($cur >= $start_date and $cur < $end_date)
    {
      $taken = $cur->format('m/d/Y');
      echo "{$taken} is taken.<br>";
    }
  }
}

それはあなたの問題を解決するはずだと思います。エレガンスに関して言えば、エレガンスは PHP に豊富にあるわけではありません。それは、さまざまなバックグラウンドを持つ多くの人々によって、いわばごちゃまぜにされた言語です。それは素晴らしくシンプルで、常に進化している言語ですが、エレガントとは言えません。PHP を使用する必要があり、Web アプリにエレガンスを求めている場合は、CodeIgniter や Laravel などのフレームワークをお勧めします。後者は特に非常にエレガントです。

mysql_また、古い関数は PHP の次のバージョンから削除されるため、注意して使用してください。mysqli または PDO を調べることができます。

于 2013-09-05T11:13:17.340 に答える
0

これは実際には答えではありませんが (そして、私はそれを答えとしてマークしません)、ここで私が問題を解決した方法を示します。

ループ内でこれらすべてのループを実行する必要がなく、mysql から最終結果 (日付の配列) を直接取得するだけで、これを行う方法があることを望んでいました。

これにより、ホテルの部屋が予約されたときに mysql からすべての日付範囲が選択され、その範囲が配列内の単一の日付に変換されます。したがって、最終結果は、ホテルの部屋が予約された今日の日付以降のすべての日付の一意の並べ替えられた配列になります。

<?php
$current_date_t = date('Y-m-d');
$current_date = new DateTime($current_date_t);

// Make a MySQL Connection

$query = "SELECT from_date, to_date FROM t_booking_data where from_date >= '" . $current_date . "' ";

$result = mysql_query($query) or die(mysql_error());
$booked_days_array = array();

while ($row = mysql_fetch_array($result))
{
    $startDate_t = $row['from_date'];
    $startDate = new DateTime($startDate_t);
    $endDate_t = $row['to_date'];
    $endDate = new DateTime($endDate_t);

    while ($startDate < $endDate)
    {
        array_push($booked_days_array, $startDate->format('Y-m-d'));
        $startDate->modify('+1 day');
    }
}
$booked_days_array = array_unique($booked_days_array);
sort($booked_days_array);
?>
于 2013-09-14T10:50:36.550 に答える