時刻表検索アプリの作り方(PHP x MySQL)

PHP + MySQL で時刻表検索アプリの作り方を紹介します

 

わざわざ作らなくても、世の中には既に便利なアプリがたくさんありますよ

 

そうですね
JRや大手の路線は既に便利なアプリがありますね
でも、アプリでカバーされていないローカル路線もあります

というわけで、ここではローカル路線の時刻表の検索アプリについて解説していきます

題材は、筆者の地元を走っている直Qバス(京阪バス)

完成形のイメージ

こちらに完成形のリンクです

アクセスすると、現在日時から早い順に時刻表を表示します(3つ)

乗り場と降り場は、デフォルトで設定されています

(乗り場:あかねヶ丘、降り場:京都駅八条口)

各ボタンの機能

更新

日時やバス停を変更して、更新をクリックするとその設定に合わせて、時刻表を表示

始発/最終

始発や最終をクリックすると、その日の始発を最終の時刻表を表示

ファイルの構成

11個のファイルを作成します

    index.php
    bus_update.php
    bus_earliest.php
    bus_latest.php
    header.php
    footer.php
    functions.php
    functions_result.php
    functions_result_latest.php
    mystylesheet.css
    timetable.csv

大まかな機能の説明です

index.php は、現在日時の時刻表を表示

bus_update.php は、日時やバス停を設定した時の時刻表を表示

bus_earliest.php は、現在日付(または設定した日付)の始発の時刻表を表示

bus_latest.php は、現在日付(または設定した日付)の最終の時刻表を表示

functions.php は、 4つの変数を返します

    $results
    $results2
    $count
    $count2

$results は、設定日時以降のデータ全て

$results2 は、設定日時のデータ全て

$count は、$results のデータ数

$count2 は、$results2 のデータ数 -1 { = 最終の時刻表の添字}

functions_result.php は、 function.php で求めた $result$count を使って、 9つの変数に値を代入します

    $result_d1
    $result_a1
    $result_p1
    $result_d2
    $result_a2
    $result_p2
    $result_d3
    $result_a3
    $result_p3

$result_d1 は、出発時刻

$result_a1 は、到着時刻

$result_p1 は、料金タイプ

同様に 次の時刻表は $result_d2, $result_a2, $result_p2

次の次の時刻表は、$result_d3, $result_a3, $result_p3

$count が、

2の場合は、$result_d3, $result_a3, $result_p3 は代入無し

1の場合は、$result_d2, $result_a2, $result_p2 も代入無し

functions_result_latest.php は、 function.php で求めた $result2$count2 を使って 3つの変数に代入します

    $result_d1
    $result_a1
    $result_p1

$result_d1 は、出発時刻

$result_a1 は、到着時刻

$result_p1 は、料金タイプ

timetable.csv は、時刻表のデータが入っています

ソースコード

ソースコードを説明していきます

index.php

4つのphpファイルを呼び出しています

    header.php
    functions.php
    functions_result.php
    footer.php

出発するバス停を “あかねヶ丘” で設定 現在日時から、早い順に3つの時刻表を表示させています

各ボタンクリックで、 3つのphpファイルへ移動します

    bus_update.php
    bus_earliest.php
    bus_latest.php
<?php 

include('header.php'); 

$date = date('Y-m-d');
$time = date('G:i');
$departure='あかねヶ丘';

include('functions.php');
include('functions_result.php');

?>

<div class="m-4">
  <form action="?" method="get">
    <label>日付</label>
    <?php
    $input_date = "<input type='date' class='form-control text-center' name='date' value='$date'>";
    echo $input_date;
    ?>
    <label class="mt-2">時刻</label>
    <?php
    $input_time = "<input type='time' class='form-control text-center' name='time' value='$time'>";
    echo $input_time;
    ?>
    <label class="mt-2">出発バス停</label>
    <select class="form-control text-center" name='departure'>
      <option value="あかねヶ丘">あかねヶ丘</option>
      <option value="京都駅八条口">京都駅八条口</option>
    </select>
    <label class="mt-2">到着バス停</label>
    <select class="form-control text-center">
      <option value="京都駅八条口">京都駅八条口</option>
      <option value="あかねヶ丘">あかねヶ丘</option>          
    </select>
    <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_update.php">更新</button>
    <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_earliest.php">始発</button>
    <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_latest.php">最終</button>
  </form>
</div>

<div class="m-3"><!--検索結果ここから-->
    <table class="text-center">
      <thead>
        <tr>
          <td>出発時刻</td>
          <td>到着時刻</td>
          <td>料金</td>
          <td></td>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><span><?php
          if($result_d1=='--:--'){
            echo $result_d1;
          }else{
            echo date('H:i',strtotime($result_d1));
          }
          ?></span></td>
          <td><span><?php
          if($result_a1=='--:--'){
            echo $result_a1;
          }else{
            echo date('H:i',strtotime($result_a1));
          } 
          ?></span></td>
          <td><span><?php
          if($result_p1=='  '){
            echo $result_p1;
          }else{
            echo $result_p1;
          }  
          ?></span></td>
          <td class="text-start">先発</td>
        </tr>
        <tr>
          <td><span><?php
          if($result_d2=='--:--'){
            echo $result_d2;
          }else{
            echo date('H:i',strtotime($result_d2));
          } 
          ?></span></td>
          <td><span><?php
          if($result_a2=='--:--'){
            echo $result_a2;
          }else{
            echo date('H:i',strtotime($result_a2));
          }
           ?></span></td>
          <td><span><?php
          if($result_p2=='  '){
            echo $result_p2;
          }else{
            echo $result_p2;
          }
          ?></span></td>
          <td class="text-start">次発</td>
        </tr>
        <tr>
          <td><span><?php 
          if($result_d3=='--:--'){
            echo $result_d3;
          }else{
            echo date('H:i',strtotime($result_d3));
          } 
          ?></span></td>
          <td><span><?php
          if($result_a3=='--:--'){
            echo $result_a3;
          }else{
            echo date('H:i',strtotime($result_a3));
          } 
          ?></span></td>
          <td><span><?php
          if($result_p3=='  '){
            echo $result_p3;
          }else{
            echo $result_p3;
          } 
          ?></span></td>
          <td class="text-start">次々発</td>
        </tr>
      </tbody>
    </table>
</div><!--検索結果ここまで-->

<?php include('footer.php');

bus_update.php

3つの変数を受け取って、指定条件(日時とバス停)から 時刻表を求めて表示させています

    $date
    $time
    $departure

他は、index.phpとほぼ同じです

 

<?php 

include('header.php'); 

$date = filter_input(INPUT_GET,'date');
$time = filter_input(INPUT_GET,'time');
$departure = filter_input(INPUT_GET,'departure');

include('functions.php');
include('functions_result.php');

?>

<div class="m-4">
    <form action="?" method="get">
        <label>日付</label>
        <?php
        $input_date = "<input type='date' class='form-control text-center' name='date' value='$date'>";
        echo $input_date;
        ?>
        <label class="mt-2">時刻</label>
        <?php
        $input_time = "<input type='time' class='form-control text-center' name='time' value='$time'>";
        echo $input_time;
        ?>
        <label class="mt-2">出発バス停</label>
        <select class="form-control text-center" name='departure'>
            <?php
            if($departure=='\"あかねヶ丘\"'){
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
                echo '<option value="京都駅八条口">京都駅八条口</option>';
            }else{
                echo '<option value="京都駅八条口">京都駅八条口</option>';
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
            }
            ?>
        </select>
        <label class="mt-2">到着バス停</label>
        <select class="form-control text-center">
        <?php
            if($departure=='\"あかねヶ丘\"'){
                echo '<option value="京都駅八条口">京都駅八条口</option>';
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
            }else{
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
                echo '<option value="京都駅八条口">京都駅八条口</option>';   
            }
            ?>        
        </select>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_update.php">更新</button>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="index.php">現在</button>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_earliest.php">始発</button>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_latest.php">最終</button>
    </form>
</div>

<div class="m-3"><!--検索結果ここから-->
    <table class="text-center">
      <thead>
        <tr>
          <td>出発時刻</td>
          <td>到着時刻</td>
          <td>料金</td>
          <td></td>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><span><?php
          if($result_d1=='--:--'){
            echo $result_d1;
          }else{
            echo date('H:i',strtotime($result_d1));
          }
          ?></span></td>
          <td><span><?php
          if($result_a1=='--:--'){
            echo $result_a1;
          }else{
            echo date('H:i',strtotime($result_a1));
          } 
          ?></span></td>
          <td><span><?php
          if($result_p1=='  '){
            echo $result_p1;
          }else{
            echo $result_p1;
          }  
          ?></span></td>
          <td class="text-start">先発</td>
        </tr>
        <tr>
          <td><span><?php
          if($result_d2=='--:--'){
            echo $result_d2;
          }else{
            echo date('H:i',strtotime($result_d2));
          } 
          ?></span></td>
          <td><span><?php
          if($result_a2=='--:--'){
            echo $result_a2;
          }else{
            echo date('H:i',strtotime($result_a2));
          }
           ?></span></td>
          <td><span><?php
          if($result_p2=='  '){
            echo $result_p2;
          }else{
            echo $result_p2;
          }
          ?></span></td>
          <td class="text-start">次発</td>
        </tr>
        <tr>
          <td><span><?php 
          if($result_d3=='--:--'){
            echo $result_d3;
          }else{
            echo date('H:i',strtotime($result_d3));
          } 
          ?></span></td>
          <td><span><?php
          if($result_a3=='--:--'){
            echo $result_a3;
          }else{
            echo date('H:i',strtotime($result_a3));
          } 
          ?></span></td>
          <td><span><?php
          if($result_p3=='  '){
            echo $result_p3;
          }else{
            echo $result_p3;
          } 
          ?></span></td>
          <td class="text-start">次々発</td>
        </tr>
      </tbody>
    </table>
</div><!--検索結果ここまで-->

<?php include('footer.php');

 

bus_earliest.php

2つの変数を受け取って、これらの変数の値から 始発の時刻表を求めて表示させています

    $date
    $departure

他は、index.phpとほぼ同じです

 

<?php 

include('header.php'); 

$date = filter_input(INPUT_GET,'date');
$time = filter_input(INPUT_GET,'time');
$departure = filter_input(INPUT_GET,'departure');


include('functions.php');

$results=$results2;

include('functions_result.php');

?>

<div class="m-4">
    <form action="?" method="get">
        <label>日付</label>
        <?php
        $input_date = "<input type='date' class='form-control text-center' name='date' value='$date'>";
        echo $input_date;
        ?>
        <label class="mt-2">時刻</label>
        <?php
        $input_time = "<input type='time' class='form-control text-center' name='time' value='$time_earliest'>";
        echo $input_time;
        ?>
        <label class="mt-2">出発バス停</label>
        <select class="form-control text-center" name='departure'>
            <?php
            if($departure=='\"あかねヶ丘\"'){
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
                echo '<option value="京都駅八条口">京都駅八条口</option>';
            }else{
                echo '<option value="京都駅八条口">京都駅八条口</option>';
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
            }
            ?>
        </select>
        <label class="mt-2">到着バス停</label>
        <select class="form-control text-center">
        <?php
            if($departure=='\"あかねヶ丘\"'){
                echo '<option value="京都駅八条口">京都駅八条口</option>';
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
            }else{
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
                echo '<option value="京都駅八条口">京都駅八条口</option>';   
            }
            ?>        
        </select>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_update.php">更新</button>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="index.php">現在</button>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_latest.php">最終</button>

    </form>
</div>

<div class="m-3"><!--検索結果ここから-->
    <table class="text-center">
      <thead>
        <tr>
          <td>出発時刻</td>
          <td>到着時刻</td>
          <td>料金</td>
          <td></td>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><span><?php
          if($result_d1=='--:--'){
            echo $result_d1;
          }else{
            echo date('H:i',strtotime($result_d1));
          }
          ?></span></td>
          <td><span><?php
          if($result_a1=='--:--'){
            echo $result_a1;
          }else{
            echo date('H:i',strtotime($result_a1));
          } 
          ?></span></td>
          <td><span><?php
          if($result_p1=='  '){
            echo $result_p1;
          }else{
            echo $result_p1;
          }  
          ?></span></td>
          <td class="text-start">先発</td>
        </tr>
        <tr>
          <td><span><?php
          if($result_d2=='--:--'){
            echo $result_d2;
          }else{
            echo date('H:i',strtotime($result_d2));
          } 
          ?></span></td>
          <td><span><?php
          if($result_a2=='--:--'){
            echo $result_a2;
          }else{
            echo date('H:i',strtotime($result_a2));
          }
           ?></span></td>
          <td><span><?php
          if($result_p2=='  '){
            echo $result_p2;
          }else{
            echo $result_p2;
          }
          ?></span></td>
          <td class="text-start">次発</td>
        </tr>
        <tr>
          <td><span><?php 
          if($result_d3=='--:--'){
            echo $result_d3;
          }else{
            echo date('H:i',strtotime($result_d3));
          } 
          ?></span></td>
          <td><span><?php
          if($result_a3=='--:--'){
            echo $result_a3;
          }else{
            echo date('H:i',strtotime($result_a3));
          } 
          ?></span></td>
          <td><span><?php
          if($result_p3=='  '){
            echo $result_p3;
          }else{
            echo $result_p3;
          } 
          ?></span></td>
          <td class="text-start">次々発</td>
        </tr>
      </tbody>
    </table>
</div><!--検索結果ここまで-->

<?php include('footer.php');

bus_latest.php

2つの変数を受け取って、これらの変数の値から 最終の時刻表を求めて表示させています

    $date
    $departure

他は、index.phpとほぼ同じです

<?php 

include('header.php'); 

$date = filter_input(INPUT_GET,'date');
$time = filter_input(INPUT_GET,'time');
$departure = filter_input(INPUT_GET,'departure');

include('functions.php');
include('functions_result_latest.php');

?>

<div class="m-4">
    <form action="?" method="get">
        <label>日付</label>
        <?php
        $input_date = "<input type='date' class='form-control text-center' name='date' value='$date'>";
        echo $input_date;
        ?>
        <label class="mt-2">時刻</label>
        <?php
        $input_time = "<input type='time' class='form-control text-center' name='time' value='$time_latest'>";
        echo $input_time;
        ?>
        <label class="mt-2">出発バス停</label>
        <select class="form-control text-center" name='departure'>
            <?php
            if($departure=='\"あかねヶ丘\"'){
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
                echo '<option value="京都駅八条口">京都駅八条口</option>';
            }else{
                echo '<option value="京都駅八条口">京都駅八条口</option>';
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
            }
            ?>
        </select>
        <label class="mt-2">到着バス停</label>
        <select class="form-control text-center">
        <?php
            if($departure=='\"あかねヶ丘\"'){
                echo '<option value="京都駅八条口">京都駅八条口</option>';
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
            }else{
                echo '<option value="あかねヶ丘">あかねヶ丘</option>';
                echo '<option value="京都駅八条口">京都駅八条口</option>';   
            }
            ?>        
        </select>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_update.php">更新</button>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="index.php">現在</button>
        <button class="mt-3 rounded-3 px-3 py-2 bg-white border-1" style="border-color:#ced4da;" formaction="bus_earliest.php">始発</button>

    </form>
</div>

<div class="m-3"><!--検索結果ここから-->
    <table class="text-center">
      <thead>
        <tr>
          <td>出発時刻</td>
          <td>到着時刻</td>
          <td>料金</td>
          <td></td>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><span><?php
          if($result_d1=='--:--'){
            echo $result_d1;
          }else{
            echo date('H:i',strtotime($result_d1));
          }
          ?></span></td>
          <td><span><?php
          if($result_a1=='--:--'){
            echo $result_a1;
          }else{
            echo date('H:i',strtotime($result_a1));
          } 
          ?></span></td>
          <td><span><?php
          if($result_p1=='  '){
            echo $result_p1;
          }else{
            echo $result_p1;
          }  
          ?></span></td>
          <td class="text-start">先発</td>
        </tr>
        <tr>
          <td><span><?php
          if($result_d2=='--:--'){
            echo $result_d2;
          }else{
            echo date('H:i',strtotime($result_d2));
          } 
          ?></span></td>
          <td><span><?php
          if($result_a2=='--:--'){
            echo $result_a2;
          }else{
            echo date('H:i',strtotime($result_a2));
          }
           ?></span></td>
          <td><span><?php
          if($result_p2=='  '){
            echo $result_p2;
          }else{
            echo $result_p2;
          }
          ?></span></td>
          <td class="text-start">次発</td>
        </tr>
        <tr>
          <td><span><?php 
          if($result_d3=='--:--'){
            echo $result_d3;
          }else{
            echo date('H:i',strtotime($result_d3));
          } 
          ?></span></td>
          <td><span><?php
          if($result_a3=='--:--'){
            echo $result_a3;
          }else{
            echo date('H:i',strtotime($result_a3));
          } 
          ?></span></td>
          <td><span><?php
          if($result_p3=='  '){
            echo $result_p3;
          }else{
            echo $result_p3;
          } 
          ?></span></td>
          <td class="text-start">次々発</td>
        </tr>
      </tbody>
    </table>
</div><!--検索結果ここまで-->

<?php include('footer.php');

functions.php

コメントアウトしている箇所は、最初とcsvファイル更新時のみ使用します

ここで、csvファイルを読み込んでtableを作成しています

現在日時とバス停(デフォルト:”あかねヶ丘”)の条件にヒットする情報を 4つの変数で出力します

    $results
    $results2
    $count
    $count2
<?php

$week = [
    '日',
    '月',
    '火',
    '水',
    '木',
    '金',
    '土'];

$youbi = date('w', strtotime($date));

$pdo = new PDO(
    'mysql:host=localhost;dbname=xs410589_de;charset=utf8mb4',
    'xs410589_wp1',
    'pennychen',
    [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
      PDO::ATTR_EMULATE_PREPARES => true,
      PDO::MYSQL_ATTR_LOCAL_INFILE => true,
    ]
  );

// csvファイルを読み込むときに使用する
//   $pdo->query("DROP TABLE IF EXISTS timetable");

//   $pdo->query("CREATE TABLE timetable(
//     id INT NOT NULL AUTO_INCREMENT,
//     xjitsu VARCHAR(140),
//     bstop_dep VARCHAR(140),
//     bstop_arr VARCHAR(140),
//     time_dep TIME,
//     time_arr TIME,
//     pay VARCHAR(140),
//     bline VARCHAR(140),
//     PRIMARY KEY(id)
//   )");

// $pdo->query("SET character_set_database=sjis");

//   $pdo->query("LOAD DATA LOCAL INFILE 'timetable.csv' INTO TABLE timetable
//   FIELDS TERMINATED BY ','
//   (xjitsu,bstop_dep,bstop_arr,time_dep,time_arr,pay,bline)
// ");

$pdo->query("DROP TABLE IF EXISTS timetable_copy");

$kyuji=['土','日'];

if (in_array($week[$youbi],$kyuji)){
  $xjitsu='\"休日\"';
}else{
  $xjitsu='\"平日\"';
}

$departure = '\"' . $departure . '\"';

$pdo->query("CREATE TABLE timetable_copy as SELECT * FROM timetable WHERE xjitsu = '".$xjitsu."' AND bstop_dep ='".$departure."' AND time_arr !=''");

$stmt = $pdo->query("SELECT time_dep,time_arr,pay FROM timetable_copy WHERE time_dep >= '".$time."'");
$stmt2 = $pdo->query("SELECT time_dep,time_arr,pay FROM timetable_copy");
  
 $results = $stmt->fetchAll();
 $results2 = $stmt2->fetchAll();

 $count = count($results);
 $count2 = count($results2)-1;

 $time_earliest = $results2[0]['time_dep'];
 $time_latest = $results2[$count2]['time_dep'];

$result_d1 = "--:--";
$result_a1= "--:--";
$result_p1="  ";
$result_d2 = "--:--";
$result_a2= "--:--";
$result_p2="  ";
$result_d3 = "--:--";
$result_a3= "--:--";
$result_p3="  ";

?>

 

functions_result.php

functions.php でヒットしたデータ数に応じて処理を切り替えています

データ数が、3以上の場合は、早い順に 3つの時刻表の情報を変数で出力

データ数が、2の場合は、早い順に 2つの時刻表の情報を変数で出力

データ数が、1の場合は、1つの時刻表の情報を変数で出力

<?php
if ($count >=3){
      $result_d1 = $results[0]['time_dep'];
      $result_a1= $results[0]['time_arr'];
      $result_p1= str_replace('"','',$results[0]['pay']);
      $result_d2 = $results[1]['time_dep'];
      $result_a2= $results[1]['time_arr'];
      $result_p2= str_replace('"','',$results[1]['pay']);
      $result_d3 = $results[2]['time_dep'];
      $result_a3= $results[2]['time_arr'];
      $result_p3= str_replace('"','',$results[2]['pay']);;
  }elseif($count ==2){
      $result_d1 = $results[0]['time_dep'];
      $result_a1= $results[0]['time_arr'];
      $result_p1= str_replace('"','',$results[0]['pay']);
      $result_d2 = $results[1]['time_dep'];
      $result_a2= $results[1]['time_arr'];
      $result_p2= str_replace('"','',$results[1]['pay']);
  }elseif($count==1){
      $result_d1 = $results[0]['time_dep'];
      $result_a1= $results[0]['time_arr'];
      $result_p1= str_replace('"','',$results[0]['pay']);
  }
?>

 

functions_result_latest.php

functions.php で取得したデータから最終の時刻表の情報を変数で出力します

<?php
    $result_d1 = $results2[$count2]['time_dep'];
    $result_a1= $results2[$count2]['time_arr'];
    $result_p1= str_replace('"','',$results2[$count2]['pay']);
?>

コメント

この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
タイトルとURLをコピーしました