第14回 スケジューラーを作ろう(5) - データの特定方法 - - PHP基礎講座

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

  



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

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

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)