わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

PHPコーディング指導

質問を送ってから

作業をしていて,技術的なところでつまずいて,少し考えても(Webでも調べても)自力解決が難しいと思ったら,遠慮なくこちらまでメールをください.
問題によっては,書いているコードはそのままにして,サーバの設定を変えれば解決するものもありますので.
ただし,質問を送って,回答が来るまで,「何もしない」ということがないようにもしましょう.こちらがメール着信を目にし,読んでアドバイスを考え,文章にして返信する間にも,あなたの側でも「何かする」ようにしてください.それは質問と別のことにしましょう.リスクの分散・タスクの分散です.

画面遷移

ページ間で情報を渡す方法,ですね.
どの手法をとるか,決めるよりもまずは,大きめの紙を用意して,ページ間でどんな情報を受け渡しする必要があるかを書いてみてください.
「HOW(手段)」で行き詰まったら「WHAT(対象)」を,WHATで行き詰まったら「WHY(目的*1)」を見直しましょう.
ところで,POSTではなくGETでやりとりするほうが簡単に実装できるのではと書いてありましたが,それは試す価値があると思いますよ.うまいこと,進めていってください.

ビジネス層とプレゼンテーション層の分離

送ってくれたphpファイルを見ました.全体構成としては,保守性に欠けるように思います.このままコード量を増やしていくと,バグの対処や機能の追加の際,どこをどうすればいいかで苦労しそうです.
今の段階から,「ビジネス層とプレゼンテーション層の分離」を心がけ,見通しの良いコードにしてください.
具体的には,初期設定やDB問い合わせなどで,HTML表示に使用する値を変数を格納するところまでで,一つの大きな <?php ... ?> を書きます.その中には,printなどの出力関数を使いません.ここまでが,「ビジネス層」です.
そのあとに,HTMLとして見せる部分を書きます.「プレゼンテーション層」です.変数の値(配列・ハッシュなどならその一部)に置き換える箇所だけ,<?php ... ?> を書いていってください.一つ一つは短めにします.forやifなどの制御構造を入れても,かまいません.
(補足:学生には「ロジックとプレゼンテーションの分離」と伝えましたが,ここここを読んで,改めました.もし「ロジック」という言葉を使うのなら,プレゼンテーション層を,プレゼンテーション本体とプレゼンテーションロジックに分ける,とするのが良さそうです.)

ビジネス層でprintを使う

上の要領で,phpファイルを作り直したら,サーバに置いてブラウザで表示させ,エラーや警告をもとにデバッグしていきましょう.
SQLのエラーが出るときは,Cの授業でもやったと思う「デバッグライト」を試してください.まずそのSQL文を,変数に格納します.そして,問い合わせる直前で,その文字列を出力(print)するよう,1行追加します.一時的なものです.
表示される文字列は,期待するSQL文ではないはずなので,それより前の処理を見直してデバッグします.思い通りの値や動作になったら,printを---ビジネス層のところにずっと書くわけにはいきませんので---削除しましょう.

名前は英語で

データベースのテーブル名とカラム名,またHTMLやPHPのファイル名(拡張子より前の部分)は,原則として英語を使いましょう.訳せないもののみ,ローマ字表記にしてください.
いくつか例を示します*2

  • eki → station
  • basutei → busstop
  • zikokuhyou → timetable
  • kaitei → revise_timetable
  • setti → setupあるいはestablish
  • haishi → teardownあるいはeliminate

それから,ファイルをzipでまとめてくれたのはいいけれど,ファイル名に「&」という記号を入れるのも,あまりよくありません.単語の区切りなら「_」にしましょう.andに相当するものなら「+」と書いてもかまいません."lost+found"は,海外においてもUnix文化でも,"lost and found"と読まれます.

HTMLにもインデント

HTMLのタグの並びがぐちゃぐちゃで,読みにくいです.保守性にも欠けます.
タグのインデントのポリシーを決め,統一させてください.
ただ,C言語と同様のルールにすると,レベルが深くなって,大変なことになるかもしれません(HTMLでは関数コールができませんので).
私が直書きするときには,次のルールを使っています:空行で区切られたひとまとまりごとに,インデント幅を半角空白2文字とします.
深くなってきたら,あるまとまりの前後に空白を置き,そこだけでインデントを仕切り直します.
そうすると,外側のタグと閉じタグとの間で,行数が大きくなります.そこには,「<!-- t1 -->」といった,共通するコメントをそれぞれの直後に書くといいでしょう.

文字列はダブルクオートにこだわらない

$form = "<FORM method=\"GET\" action=\"sinsetu_kakunin.php\"><INPUT type=\"submit\" name=\"submit\" value=\"確認\"></FORM>";

という文字列もまた,保守性に欠けます.シングルクオートを使って,次のようにしましょう.

$form = '<form method="GET" action="sinsetu_kakunin.php"><input type="submit" name="submit" value="確認"></form>';

とはいえ,これは一時しのぎの対策です.時間があれば,「この文字列は,PHPの変数に格納する必要があるのか?」も,考えられるといいでしょう.
ある条件に限り,このフォームを表示させたいのなら,次のようにもできます.

<?php  if ($condition) { ?>
<form method="GET" action="confirm_setup.php">
  <input type="submit" value="確認OK!">
</form>
<?php } ?>

このようなifの書き方は,WordPressのテーマデザインでよく使うPHP構文、if-else文について | WordPress(ワードプレス)コミュニティで整理されています.

不具合の相談には,再現できる情報を

はじめのうちは「ファイルを書くだけ」でいいのですが,実装が進むと,サーバにファイルを置き,ブラウザで「動作を確認する」機会が増えてきます.
期待どおり動作しない状況も,よく発生すると思います.
理想は,班(学生間)で話し合って解決を図ることですが,それでも解決できそうにないか,話し合っている暇がないときは,遠慮せずこちらまで,不具合の状況をメールで送ってください.
その際,こちらがその不具合を再現できる情報を,書くようにしてください.
基本は,どのURLで,何をしたら,どうなってほしいけれど,実際にはどうなる,の4点セットです.

その他

  • 「<DIV>」「<BR>」と書いていますが,HTMLのタグはすべて小文字とし,「<div>」「<br>」と書いてください.
  • PHPの文字列連結演算子「.」を使う場合,「+」と同様に,前後に空白を置いてください.
  • 「<?php if($var == 0) ?>{」では不具合が出ます.「{」は,「?>」の手前に移動しましょう.
  • 「<tr>」をHTMLとして書いている箇所と,PHPのprint関数で出力させている箇所があるので,統一してください.一般にはHTMLで書くほうがいいのですが,送ってくれたコードであれば,printを使うのが良さそうです.

(補足:実際の指示では,「<DIV>」ではなく「<CENTER>」を書いていました.しかしcenter要素はHTML5で廃止されたので,ここでは別のタグにしました.廃止された要素とその代替コードについては,HTML5で廃止された要素|HTML5|PHP & JavaScript Roomがまとまっています.)

何これ

3年生に送ったメールを,書き直しました.

(最終更新:2013-01-13 朝)

*1:目的→なぜそれをするのか?→WHY

*2:関連:エコシステム