2016-06-21 28 views
2

予約Webサイトの利用可能時間を取得したいと思います。私のMySQLのテーブルには、(例で)このように見ている:PHPはデータベースに存在しない値を取得します

id(AI,PK), 
date(2016-06-21), 
start_time(14:00:00), 
end_time(14:30:00), 
working(20:00:00), 
provider(aaa). 

私はstart_timeend_timeの間で利用可能な時間をエコーし​​ます。私はそれを達成する:

$sql = "SELECT * FROM `appo` WHERE date = '2016-06-17'"; 
$result_set = mysql_query($sql); 
while($row = mysql_fetch_array($result_set)) { 
    for($echodate = 11; $echodate.':00:00' < $row['working']; $echodate++) { 
     if($row['start_time'] > $echodate.':00:00' && $row['end_time'] > $echodate.':30:00' || $row['start_time'] < $echodate.':00:00' && $row['end_time'] < $echodate.':30:00') { 
      echo $echodate.':00<br>'; 
      echo $echodate.':15<br>'; 
      echo $echodate.':30<br>'; 
      echo $echodate.':45<br>'; 
     } 
    } 
    echo '<br>'; 
    } 
} 

これは素晴らしいです!しかし、私の問題は次のようなものです。データベース上に複数のレジストリがあると、異なる行の時刻を返します。

その日に2つの予定があるとします。 1つは14:00に終了し、14:30に終了し、16:00に1つは16:30に終了する。

私のスクリプトはこれをエコーし​​ます:

11:00 
11:15 
11:30 
11:45 
12:00 
12:15 
12:30 
12:45 
13:00 
13:15 
13:30 
13:45 
15:00 
15:15 
15:30 
15:45 
16:00 
16:15 
16:30 
16:45 
17:00 
17:15 
17:30 
17:45 
18:00 
18:15 
18:30 
18:45 
19:00 
19:15 
19:30 
19:45 

11:00 
11:15 
11:30 
11:45 
12:00 
12:15 
12:30 
12:45 
13:00 
13:15 
13:30 
13:45 
14:00 
14:15 
14:30 
14:45 
15:00 
15:15 
15:30 
15:45 
17:00 
17:15 
17:30 
17:45 
18:00 
18:15 
18:30 
18:45 
19:00 
19:15 
19:30 
19:45 

は今、ここで問題です。私はそれらを合計し、1つの列だけを表示したい。私はSQLクエリではあまり良くありません。それを行うための方法(PHPまたはSQL)があるなら、私はそれを聞いて嬉しいです!

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

+0

データベースエントリの1つの例を挙げてください。どのようにDBに保存されますか? –

+0

ID = 1 日= 2016年6月17日 のstart_time = 14時〇〇分00秒 END_TIME =午前14時30分00秒 作業=午後08時00分00秒 プロバイダは= AAA –

答えて

1

複数のエントリがあるため、データベースクエリを直接処理する方法がわかりません。しかし、ループで配列のすべてのエントリを収集し、このように別のループのすべてのエントリをチェックすることはできますか?多分ファットネットではなく、解決策です。

$sql = "SELECT * FROM `appo` WHERE date = '2016-06-17'"; 
$result_set = mysql_query($sql); 

     $working = null; 
     $blockedEntries = array(); 

while($row = mysql_fetch_array($result_set)) { 
          $working = $row['working']; 
          array_push($blockedEntries, array('start'=>$row['start_time'],'end'=>$row['end_time'])); 
} 

     for($echodate = 11; $echodate.':00:00' < $working; $echodate++) { 
      $entryFound = false; 
      foreach($blockedEntries as $entry) { 
       if(!($entry['start'] > $echodate.':00:00' && $entry['end'] > $echodate.':30:00' || $entry['start'] < $echodate.':00:00' && $entry['end'] < $echodate.':30:00')) { 
          $entryFound = true; 
          break; 
       } 
      } 
      if($entryFound == false) { 
       echo $echodate.':00<br>'; 
       echo $echodate.':15<br>'; 
       echo $echodate.':30<br>'; 
       echo $echodate.':45<br>'; 
      } 
     } 

このコードはテストされていませんが、私が達成したいことは明らかです。 workingのエントリが異なる可能性がありますか?

+0

が、これは私がすることができます...うまくいくかもしれませんなぜそうは見えないのですか?私はそれをテストし、私はあなたに通知するつもりです! –

+0

array_push戻り値nullエラーが発生しました: 警告:array_push()は、配列1になることを期待しています。 –

+0

'$ blockedEntries = [];'を '$ blockedEntries = array()に変更する必要があります); ' –

関連する問題