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']);
?>
コメント