プログラマはプログラマらしく、PHPプログラムを作って自己紹介をしたいと思います。あなたの自己紹介もできるようにしましたので是非ご利用ください。
自己紹介メーカー(成果物)
制作過程
最初は適当に
まずざっくりと、フォームに名前を入力してボタンを押すと自己紹介が表示されるものにしたいので、次のようなコードを書きました。
<?php
//名前を変数に代入する
$name = $_POST['name'];
//自己紹介文を組み立てる
$self_introduction = 'はぢめまして、'.$name.'です';
?>
<!-- ここからHTML -->
<div class="container text-center">
<p>あなたの名前を入力してボタンを押します</p>
<!-- 入力フォーム -->
<form action="" method="post">
<div>
<input type="text" name="name" value="">
</div>
<div>
<input type="submit" value="自己紹介をつくる">
</div>
</form>
<!-- 自己紹介の表示 -->
<div>
<?php
echo $self_introduction;
?>
</div>
</div>
ブラウザで表示してみます。
Notice: Undefined index: name in /Path/to/myself.php on line 4
はい出ました。毎回必ず出るエラーですよね。みんなそうだよね?ね?(不安)
初回アクセスと2回目以降の処理を切り分ける
初回アクセスでは $_POST['name']
が定義されていないのに、それを $name
に代入しようとしてるから、怒られるんですね。なので、初回アクセスとフォームを送信したときの処理を分けないといけないんですね。
empty()
関数を使って次のようにしました。
<?php
//POSTされている場合
if(!empty($_POST)){
//名前を変数に代入する
$name = $_POST['name'];
//自己紹介文を組み立てる
$self_introduction = 'はぢめまして、'.$name.'です';
}
//POSTされていない場合
else{
$name = '';
$self_introduction = '';
}
?>
XSS(クロスサイトスクリプティング)対策をする
ユーザが入力したデータをページに表示するときにはXSS(クロスサイトスクリプティング)対策をしなければなりません。サニタイジングしましょう。
<?php
//POSTされている場合
if(!empty($_POST)){
//名前をサニタイジングして変数に代入する
$name = htmlentities($_POST['name'], ENT_QUOTES, mb_internal_encoding());
//自己紹介文を組み立てる
$self_introduction = 'はぢめまして、'.$name.'です';
}
//POSTされていない場合
else{
$name = '';
$self_introduction = '';
}
?>
サニタイジングする関数は htmlspecialchars()
と htmlentities()
がありますが、私は htmlentities()
のほうが好きです。変換できる文字が多いので頭が良さそう。あと、titi のところが好き。
デフォルトではシングルクオートが変換されません。変換するために、第2引数に ENT_QUOTES
を指定します。
第3引数は mb_internal_encoding()
関数で内部文字エンコーディングを取得しています。だいたい UTF-8 だと思うので 'UTF-8'
と書いてもOKです。
あいさつをランダムにしたい
あいさつが「はぢめまして」で固定されているのはつまらないので、フォームを送信するたびにランダムで違うあいさつが表示されるようにしたいんじゃ。
<?php
//POSTされている場合
if(!empty($_POST)){
//あいさつをランダムに取得
$greeting_arr = array('はぢめまして', 'こんにちゎ', 'おはこんばんちわ');
$greeting = $greeting_arr[array_rand($greeting_arr)] ;
//名前をサニタイジングして変数に代入する
$name = htmlentities($_POST['name'], ENT_QUOTES, mb_internal_encoding());
//自己紹介文を組み立てる
$self_introduction = $greeting.'、'.$name.'です';
}
//POSTされていない場合
else{
$name = '';
$self_introduction = '';
}
?>
配列に複数のあいさつを入れて、その中からランダムに値を取得しています。array_rand()
関数は指定した配列のキーをランダムに返します。
もっと自己紹介したい
あいさつをランダムに表示したのと同じ要領で、ランダムな自己紹介文を付け足します。
<?php
//POSTされている場合
if(!empty($_POST)){
//自己紹介文1をランダムに取得
$str1_arr = array('休日は', '今日も明日も', '10年後は');
$str1 = $str1_arr[array_rand($str1_arr)] ;
//自己紹介文2をランダムに取得
$str2_arr = array('酒を呑んでいます', 'ひとりぼっちです', '遊んでいます');
$str2 = $str2_arr[array_rand($str2_arr)] ;
//あいさつをランダムに取得
$greeting_arr = array('はぢめまして', 'こんにちゎ', 'おはこんばんちわ');
$greeting = $greeting_arr[array_rand($greeting_arr)] ;
//名前をサニタイジングして変数に代入する
$name = htmlentities($_POST['name'], ENT_QUOTES, mb_internal_encoding());
//自己紹介文を組み立てる
$self_introduction = $str1.$str2.'<br>'.$greeting.'、'.$name.'です';
}
//POSTされていない場合
else{
$name = '';
$self_introduction = '';
}
?>
完成
さらにちょこっと修正して完成しました。
- POSTされた名前が空欄だったときの処理を追加した
- POSTされたあとの画面で入力欄に名前が表示されるようにした
<?php
//POSTされている場合
if(!empty($_POST)){
//自己紹介文1をランダムに取得
$str1_arr = array('休日は', '今日も明日も', '10年後は', '1日おきに', 'いつも明るく', '暇さえあれば', '家族に内緒で', '旅先では', '小一時間悩んだ結果', '飽きるまで', '丑三つ時に', '1週間に10日', 'どういうわけか', 'かれこれ5年ほど', '酒を呑みながら', 'あわよくば', '世界を視野に入れて', '生まれ変わったら', '優雅に');
$str1 = $str1_arr[array_rand($str1_arr)] ;
//自己紹介文2をランダムに取得
$str2_arr = array('酒を呑んでいます', 'ひとりぼっちです', '遊んでいます', '人生に疲れ果てています', '社長をしています', '太極拳をしています', 'バナナを3本食べています', '廊下で寝ています', '鼻血が止まりません', '血圧が200を超えています', '壁に語りかけています', '逆回しラジオ体操をしています', '「いいね」を押すバイトをしています', '風呂場で泣いています');
$str2 = $str2_arr[array_rand($str2_arr)] ;
//あいさつをランダムに取得
$greeting_arr = array('はぢめまして', 'こんにちゎ', 'ご機嫌麗しゅう', 'おはこんばんちわ', 'そうです私が', 'よろしくどうぞ', '素敵やん', 'うぇーい', 'ごめんください', '恐れ入ります');
$greeting = $greeting_arr[array_rand($greeting_arr)] ;
//$_POST['name']に値があるとき
if($_POST['name']){
//名前をサニタイジングして変数に代入する
$name = htmlentities($_POST['name'], ENT_QUOTES, mb_internal_encoding());
}
//$_POST['name']に値がないとき
else{
$name = '名も無き地蔵';
}
//自己紹介文を組み立てる
$self_introduction = $str1.$str2.'<br>'.$greeting.'、'.$name.'です';
}
//POSTされていない場合
else{
$name = '';
$self_introduction = '';
}
?>
<!-- ここからHTML -->
<div>
<p>あなたの名前を入力してボタンを押します</p>
<!-- 入力フォーム -->
<form action="" method="post">
<div>
<input type="text" name="name" value="<?php echo $name; ?>">
</div>
<div>
<input type="submit" value="自己紹介をつくる">
</div>
</form>
<!-- 自己紹介の表示 -->
<div>
<?php
echo $self_introduction;
?>
</div>
</div>
最後に私の自己紹介
でわでわ
コメント