第14回 スケジューラーを作ろう(5) - データの特定方法 - - PHP基礎講座
Saity先生のPHP基礎講座
Lecutures on PHP
第14回 スケジューラーを作ろう(5) - データの特定方法 - (その1)
- さて、前回はちょっと趣向を変えて、デザインの修正をしてみたよね。
- そうそう!熊ちゃんのおかげで、だいぶサッパリしたデザインになりました!

- そうだね☆
- 今回はどういう事をしましょう?
- うん。またプログラムに戻って、そろそろ登録関係を全クリアしよう!
- じゃあ、まずは編集画面に取り掛かりましょう♪
編集画面と登録画面は似ている
- プログラム的には、編集画面は登録画面は、やることは大差ないんだ。
- どういう意味ですか?
- 登録画面を作った時に、どういう処理をしたか覚えてる?
- えっと・・・まず、入力フォームを出して。。。そして送信されたら、その入力チェックをして問題なければファイルに保存、っていう流れだったかな。

- そうだね。編集画面の処理も、これとほとんど同じになるのに気づいたかな? 違いは、
- 最初に表示するときに、ファイルから該当するスケジュールを読み込む
- 保存時には、該当するスケジュールを削除した後、新しいスケジュールを保存する
の2点しかないんだ。
- そっか、確かにそうだ。フォームとか入力チェックは、登録時も編集時も、同じコードになりそうですね。
- でしょ。じゃ、早速編集画面を作っていこう。
スケジュール情報を送信する
- まず問題となるのは、編集画面を表示させるときだ。この時編集画面に、どのスケジュールを読み込むか、引数で指定してやる必要がある。
- 編集画面も、登録画面と同じschedule_edit.phpを使うってことでいいのかしら?
- その通り。そう思って、最初からこの名前にしておいたんだよ☆

- なるほど~。考えてますねぇ。。。
- まず、スケジュール編集をするためには、どのスケジュールを編集したいのかを選択して、編集画面に教えないといけない。それをどうするか、まずは考えよう。
- 要するに、schedule_list.phpからschedule_edit.phpに、どうスケジュール情報を送信するかですね。

- PHPの世界(Webの世界)だと、データの受け渡し方法は一般的にはGETとPOSTの2種類しか与えられていない。いずれにせよ、「スケジュール」という大雑把なものを、どうやって別の画面に伝えるのか、難しい問題なんだ。
- セッションもありますよ!
- その通りだね。ただ、セッションはデータを持続させるための技術で、1ページ間の受け渡しにはあまり使われないんだ。
- ふむ・・・。

- なんにせよ、送信する情報は、数値とか文字列とか、PHPが変数化できるシンプルなものに限られてくるね。スケジュールをどうやって送信したらいいと思う?
- なるほど、そういう事ですかぁ。確かに、スケジュールって、年月日、タイトル、本文と色々な要素に分解できますよね。。。
- データを保持する上で考える必要があるのが、「プライマリキー」という概念なんだ。これは1データベース用語なんだけどね。今回の場合だと、スケジュールにおいて、その要素のうちどのデータを使うと、スケジュールを唯一断定できるかを考えるんだ。その、断定できるデータのことを、プライマリキー(あるいは主キー)と呼ぶんだよ。
- うーん、、、??要するに、今回の場合は年月日ってこと?年月日があれば、スケジュールを判断できますよ。
- おっとっと。でも1日に複数のスケジュールを書き込むことがあるよねぇ?その場合、年月日だけではどのスケジュールか、判断できないよ~!
- そっか。じゃあ、年月日+タイトルはどう?あ~でもタイトルも重複できるか。。。
- まぁ本来、それは入力チェック時にはじいちゃっても良いのかもしれない。1日で複数件、同じタイトルがあったら、それは入力ミスの可能性の方が高いかもしれない。
- じゃあ、年月日+タイトルにしましょうか。登録画面では、タイトルの重複チェックも付けてね。
- 確かに、それだと間違いじゃないね。ただ、1つ問題点がある。プログラミングの世界で、プライマリキーを文字列にするのはあまり良くないと言われているんだ。

- どういう意味ですか?
- 文字列って、以前説明した通り複数の文字コードがあるし、なんせ、長い。プライマリキーって日常用語でいうIDに相当するんだけど、IDの多くは数字だよね。これは、IDの方が管理が簡単だし、文字列(特に日本語)みたいな不確かさが無いからなんだ。
- じゃあ、今回のスケジュールの例でいうと、何がプライマリキーになるんでしょう。年月日じゃないとすれば、数値って無くないですか?
- それが有るんだなぁ。なんだと思う?1,2,3・・・と続く連番があるよ。
- エー、なんだろ・・・。
- 正解は「行番号」だよ☆スケジュールは、ファイルに1行1行書き込まれていたよね。ということは、何行目かが分かれば、どのスケジュールか分かるってことだよね!
- おお~なるほど。その考え、斬新だわ。。。
- まぁ本当のことを言うと、1つ1つのスケジュールにIDを割り振ったりする方がエレガントかもしれない。ただ、今回のスケジュールでは、登録時に特にそういった内容を保存していないよね。そこで僕が考えたのが、行番号をプライマリキーにする方法さ。
- エレガントじゃないってことは、何か問題があるのかしら?
- ファイルをエディタとかで開いて、スケジュールの行を移動することで、簡単に行番号も変わってしまうよね。本当はそういった「もろい」構造はあまり良くないんだ。
- ふむぅー。なんか難しいですねぇ。テツガク入ってる??

- 今は自分のちょっとしたスケジュール位だからいいけど、これがもっと大事なデータだったら、そんな簡単に壊れてしまうようではまずいよね。
- ふむふむ。。。
- まぁそろそろこの話も終わりにして、コーディングに移ろう。
- そうね。とにかく、行番号をschedule_edit.phpに渡せばいい、ってことが分かったわけだし。
- じゃあ、schedule_list.phpを修正して、行番号をschedule_edit.phpに渡すように変えてやろう!
schedule_list.php
<?php
$filename = "C:\\Program Files\\xampp\\htdocs\\samplefile.txt";
$schedule_list = file($filename);
foreach ($schedule_list as $lineno => $line) {
list($schedule_date, $title, $body) = explode("|", $line);
print("日付:$schedule_date タイトル:$title 内容:$body");
print("<a href=\"schedule_edit.php?lineno=$lineno\">
編集する</a>");
print("<br>");
}
?>
- 変更した行を太字の赤字で書いておいたよ。
- なるほど。行番号っていうのは、file関数で受け取った配列のキーなんですね。
- そのとおり。だから、正確には1から始まる番号ではなくて、0から始まるんだ。

- なるほど。まぁでも大差ないですね。
- うんうん。ちょっと理屈を考えるところが多くて疲れたでしょう。
- あー疲れた。ちょっとばかし、愛しのスティッチちゃんと、お茶でもしよっと☆
- なんじゃそれ。。。





ページのトップへ


kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。