コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

PHPらしい使い方をしていなかったからまじめに使おうと思った

PHPらしい使い方ってなんだろう

今までとりあえずでPHPに触ってきたけど、どうもこの言語で書かなくてもいいのではないかみたいな使い方しかしていないことに気づいてしまった。

PHPの使い方ってなんだろうと考える。でもそれを考えようとすることがもうPHPなのかもしれない(哲学)。
しかしながら、コマンドラインで電卓にして遊んだり、曜日毎にサイトのデザインを変えたりするのはJavaScriptでいいじゃんとなるよね。


なにを作ろう

ちょうどこちらでサンプルプログラムがあったのでこちらを参考にフォームを作ろうと思います。
PHPサンプルプログラム

PHPの特徴の一つに簡便にフォーム機能を処理できるようになるものがある。PHPだと、HTMLで書かれたフォームの要素をPHPスクリプトで処理できるようになるとのことです。これをやったらPHPっぽいことやってる気がするのでやってみるよ。

作りました

以前も紹介した。php -S localhost:8000コマンドでサーバーが簡単に立てられて確認がすごい楽ちん。

まんまパクリのクイズを出しても仕方がないので多少改変します。
f:id:andron:20161017095601p:plain

f:id:andron:20161017095614p:plain



以下、ソース。
入力フォーム部分

<html>
<head>
<meta charset="UTF-8">
<title>PHP問題</title>
</head>
<body>

<p>
問題:PHPは何の略ですか?<br>*半角で答えなさい
</p>

<form method="POST" action="./a.php">
<input type="text" name="text1">
<input type="submit" name="btn1" value="回答">
</form>

</body>
</html>


回答部分

<html>
<head>
<meta charset="UTF-8">
<title>PHP問題 答え合わせ</title>
</head>
<body>

<?php

@$input_data = $_POST['text1'];

if ($input_data == "PHP: Hypertext Preprocessor"){
    print('正解です。おめでとうございます。');
}else{
    print('残念でした。もう一度チャンレンジして下さい。');

    print('<p>');
    print('問題:PHPは何の略ですか?<br>*半角で答えなさい');
    print('</p>');

    print('<form method="POST" action="./a.php">');
    print('<input type="text" name="text1">');
    print('<input type="submit" name="btn1" value="回答">');
    print('</form>');
}

?>
</body>
</html>

多少改変してますが、実行すると正解なら「正解ですおめでとう」。不正解なら「もう一度チャレンジしてね」が表示されます。
中身はGETとPOSTの処理をしているだけです。

ところで、簿記で言う貸方・借方みたいに、GETとPOSTがどっちの処理するか混乱してしまうのは僕だけなのかな。

改変したところの雑な解説

1. 問題文のテキストを変更しています。さすがに算数の問題はつまらないもんね。
 「PHPは何の略か?」という問題にしています。答えは「PHP: Hypertext Preprocessor」。PHPは何の略かと聞かれているのに答えにPHPが入ってくるのは不思議な感じだけど、どうもそうらしいです。こういったものを再帰的頭字語と呼んだりするらしいよ。
ちなみに、改変に伴って解答が文字列になっているからそこも改変してるよ。

2. @マークで注意(notice)エラー回避
 問題文から入ってくること想定しているから、直接解答ページに飛んでしまうとNotice: Undefined index: xxxx in ...なんて表示されてしまう。それを回避するために@マークで非表示にしています。回避の仕方を調べるとisset使うとかPHPの設定ファイルをいじったりとかあるけど、次回まともなものにする時はフレームワークプラグインを利用してそうだなと思ったので応急処置的なエラー回避にしてます。