0

このチュートリアルを使用してビジュアルphpカレンダーにリンクしようとしているmysqlにオンライン予約システムデータベースがあります。

カレンダーでは、毎日がaで表され、<td>次のPDOクエリを使用して、各日の背景色を決定します(使用可能な場合=色なし、そうでない場合は赤)。

私が抱えている問題の1つは、X日目に終了する1つの予約を視覚的に表示し、同じX日に開始する別の予約を表示する必要があることです。

$query_params = array( 
    ':campervan_id' => $_GET['campervan'],
    ':day' => $date_form.($i - $startday + 1)
);

$query = " 
    SELECT 
        car,
        booking_id,
        DATE_FORMAT(start_date, '%e/%c') AS s_d,
        DATE_FORMAT(end_date, '%e/%c') AS e_d
    FROM 
        bookings as bb 
    INNER JOIN 
        reservation as br ON bb.booking_id=br.bookings_id
    INNER JOIN 
        cars as bc ON br.car_id=bc.car_id
    WHERE 
        bc.campervan_id=:campervan_id AND
        :day BETWEEN bb.start_date AND bb.end_date
"; 

次に、以下を使用してテーブルセルの結果を出力します。

if($i < $startday) { 
    echo "
        <td>
        </td>
    ";
}

else {

// IF DAY IS AVAILABLE
if(!$rows) {
    $color = "none";
}
// IF DAY IS UNAVAILABLE
else {
    $color = "#F3747F";
}

$dayMonth = ($i-$startday + 1)."/$cMonth";


// If DAY FALLS ON A START PICK UP DATE
if ($dayMonth == $rows['s_d']) {
        $back = "background-image:url(\"images/morning_back.png\");";
        $color = "none";
}
// If DAY FALLS ON A END DROP OFF DATE
else if($dayMonth == $rows['e_d']) { 
        $back = "background-image:url(\"images/afternoon_back.png\");";
        $color = "none";
}

// **************************************************

// IF FALLS ON BOTH A START AND END DATE????????
else if($dayMonth == ($rows['s_d'] && $rows['e_d'])) { 
        $back = "background-image:url(\"images/full_back.png\");";
        $color = "none";
}

// **************************************************

else {
    $back = "";
}

echo "
    <td align='center' valign='middle' height='100px' width='134' style='color:#FFFFFF; background-color:".$color."; ".$back." border:1px solid white;'>
        ".($i-$startday + 1)."
    </td>
";
}

これは、各予約の開始日、それぞれの終了日で斜めに分割された背景画像を視覚的に表示するために機能しますが、ある予約の終了と別の予約の開始の両方がある日を正しく表示することはできません。

私の最初のクエリは1つの予約レコードのみを調べているためだと思います-それらすべてを認識するために必要です、誰か助けてもらえますか?

4

1 に答える 1

0

bb.enddate=bb2.stsrtdate および bb.booking_id!=bb2.booking_id の場合、予約 bb をそれ自体に内部結合する必要があります。

LEFT JOIN booking as bb2
ON bb.enddate=bb2.startdate 
AND bb.booking_id!=bb2.booking_id

次に、bb2.booking_id が null かどうかを確認できます。そうでない場合は、一致する開始日と終了日があります。

ただし、これは、同じ日に開始されるイベントが 1 つしかない場合にのみ機能します。そうしないと、行が重複する可能性があります。

于 2013-03-12T22:57:37.913 に答える