3

私は再び PHP の構造に苦労していますが、皆さんは私に多くの助けを与えてくれました。前もって感謝します。今、私は自分自身に新しい挑戦をしました。データベースに次のテーブルがあります。

  id |     htl_name    |      city_zone     |   price    |   given_date
------------------------------------------------------------------------
  1  | Hotel Beach Inn |   Cityzone1        |  10.00     |   2012-09-01
  2  | Hotel Beach Inn |   Cityzone1        |  10.00     |   2012-09-02
  3  | Hotel Beach Inn |   Cityzone1        |  10.00     |   2012-09-03
  4  | Hotel Beach Inn |   Cityzone1        |  11.00     |   2012-09-04
  5  | Hotel Beach Inn |   Cityzone1        |  11.00     |   2012-09-05
  6  | Hotel City Inn  |   Cityzone1        |  15.00     |   2012-09-01
  7  | Hotel City Inn  |   Cityzone1        |  15.00     |   2012-09-02 
  8  | Hotel City Inn  |   Cityzone1        |  16.00     |   2012-09-03
  9  | Hotel City Inn  |   Cityzone1        |  16.00     |   2012-09-04
 10  | Hotel City Inn  |   Cityzone1        |  16.00     |   2012-09-05
-------------------------------------------------------------------------

ユーザーがチェックイン日、チェックアウト日を入力して都市ゾーンを選択すると、スクリプトは PHP/MySQL 構造を使用して、必要な都市ゾーンと入力された期間内の日付をフィルタリングします。これまでのところうまく機能していますが、ユーザーが入力したとしましょう:

チェックイン: 2012-09-01

チェックアウト: 2012-09-05

シティゾーン: Cityzone1

出力は次のようになります。

結果1

ホテル: ビーチ イン

夜: 4

チェックイン: 2012-09-01

チェックアウト: 2012-09-05

合計料金: 42.00 --> 宿泊数は 2 泊目からカウントを開始するため、1 泊目の料金は除外されます

結果2

ホテル: シティ イン

夜: 4

チェックイン: 2012-09-01

チェックアウト: 2012-09-05

合計料金: 67.00 --> 宿泊数は 2 泊目からカウントを開始するため、1 泊目の料金は除外されます

これまでに次のスクリプトを実行しました。

//MySQL Select structure that apply filter on user's entered information


$filter1=mysql_query("SELECT * FROM.........  ORDER BY htl_name, city_zone, given_date LIMIT 1");
$filtern=mysql_num_rows($filter1);
...
if($filtern>=1){
  While($row=mysql_fetch_array($filter1){
     $first_hotel_found=$row['htl_name'];
  }

  // New filter but listing everything within the date period

  $new_filter=mysql_query("SELECT * FROM ........ORDER BY htl_name, city_zone, given_date");
  $final_price=0; 
  $output="";
  while($row=mysql_fetch_array($new_filter){
     $htl_name=$row['htl_name'];
     $price=$row['price'];

     $final_price=$final_price+$price;

     if($htl_name!==$first_hotel_found){
        output .='Hotel:'.$htl_name.'<br/>';
        ... NO WORRIES WITH NUMBER OF NIGHTS AND CHECK-IN / CHECK-OUT DATES
        output .='Total Rate:'.$final_price.'<br/>';
        //after output the result go back clean up the $final_price and start adding again for the new Hotel
        $final_price=0;
        //$first_hotel_found assumes the actual $row
        $first_hotel_found=$row['htl_name'];
      }

    } // End of the while

}else{
     echo "There are no rates available for the information entered!";
     }

}

.... HTML portion ....

<body>
  <?php echo $output; ?>
</body>
</html>

問題は、出力に両方のホテルがリストされず、代わりに最後のホテルの名前と最初のホテルの合計料金がリストされることです。

ホテル: シティ イン

夜: 4

チェックイン: 2012-09-01

チェックアウト: 2012-09-05

合計料金: 42.00

プロジェクトを完了するための助けをいただければ幸いです。

どうもありがとうございました。

4

2 に答える 2

1

ここ:

if($filtern>=1){
  While($row=mysql_fetch_array($filter1){
   $first_hotel_found=$row['htl_name'];
}

あなたは最初のホテルを下に設定し、$first_hotel_found後でそのループに行くときに:

 while($row=mysql_fetch_array($new_filter){

あなたは中にいますif($htl_name!==$first_hotel_found)

上記のよう$first_hotel_foundに、最初の結果とのこの比較は誤りであり、最初のホテルは結果に表示されません。

于 2012-09-01T22:28:21.423 に答える
1

この状態

if($htl_name!==$first_hotel_found){

$htl_nameが初めてHotelCityInnである場合(最初のホテルがHotel Beach Innの場合)は正確に当てはまります。必要に応じて、$first_hotel_foundではなく$htl_nameを出力します。

同じ条件が二度と当てはまらないため、2番目のホテルに関する情報を印刷することはありません。3つ目のホテルを追加すると、$htl_nameが初めてそのホテルになったときに正確に当てはまります。これを解決するには、出力を作成するコードをループの外側にもコピーして、前回実行します。

output .='Hotel:'.$htl_name.'<br/>';
... NO WORRIES WITH NUMBER OF NIGHTS AND CHECK-IN / CHECK-OUT DATES
output .='Total Rate:'.$final_price.'<br/>';
//after output the result go back clean up the $final_price and start adding again for the new Hotel
$final_price=0;
//$first_hotel_found assumes the actual $row
$first_hotel_found=$row['htl_name'];
于 2012-09-01T22:38:10.683 に答える