目次
ヒアドキュメント
<<<で指定したIDから終点のIDまでは変数の展開、HTMLの直書き、改行の反映がされる。関数は展開できない。
終点はID+セミコロン(;)で書くが、前にそれ以外の文字(スペース、タブも含む)が含まれてはならない。
PHPマニュアルから引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php $str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; /* 変数を使用するより複雑な例 */ class foo { var $foo; var $bar; function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; echo <<<EOT My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': \x41 EOT; ?> |
出力結果
My name is "MyName". I am printing some Foo. Now, I am printing some Bar2. This should print a capital 'A': A
これをつかってじゃんけんのプログラム(手の選択と結果表示を同じページ内であたかも違うページの様に遷移する)作る話だったんだけど、
ヒアドキュメント縛りと勘違いしてbody内が全部ヒアドキュメントになってるアレげなコードを書いてしまったので割愛。
フォームの入力値をチェックする
前回のフォームの続き。
入力ミスや悪意のある入力を防ぐための処理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php // 中略 $errors = array(); foreach ($_SESSION as $key => $value) { if (is_array($value)) { $value = implode('', $value); } if (!mb_check_encoding($value)) { $errors[] = '文字コードに誤りがあります。'; break; } } if (trim($_SESSION['name']) === '') { $errors[] = '名前入力は必須です。'; } if (mb_strlen($_SESSION['name']) > 50) { $errors[] = '名前は50文字以内です。'; } if (!ctype_digit($_SESSION['age'])) { $errors[] = '年齢は整数で入力してください。'; } $opts = array('win','mac','linux'); if (isset($_SESSION['os'])) { foreach ($_SESSION['os'] as $os) { if (!in_array($os, $opts)) { $errors[] = 'OSは決められた選択肢の中から選択してください。'; break; } } } if (count($errors) > 0) { exit(implode('<br />', $errors).'<br /><input type="button" value="戻る" onclick="location.href=\'enquete1.php\'">'); } ?> // 以下略 |
配列$errorsに一つでもデータが格納されたらエラー表示と戻りボタンをのみを出力する。(exitの引数以外のHTMLは表示しない)
$errorsにデータが一つも格納されていない場合は、通常の投稿完了ページを表示する。
is_array
引数として与えた変数が配列かどうかを検査する。
今回は文字コードチェックのために、配列になっているデータはimplodeで文字列化している。
mb_check_encoding
文字列が指定したエンコーディングで有効なものか調べる。
第二引数が未指定の場合はphp.iniで設定したmbstring.internal_encodingの文字コードで有効かチェックする。
TRUEかFALSEを返すので今回はFALSEだった場合にエラーメッセージをセットする。
あくまで有効であるかどうかを調べるだけで可読性はチェックされない。
なかなかこれはややこしい関数のようですね。
PHPのバージョンが古いと実装されてなかったり使い物にならなかったり。
参考サイト
trim
文字列の前後のホワイトスペースを取り除く。
第二引数に取り除く空白文字を指定できるが、省略する場合は様々な空白文字を取り除く。文字の種類は公式マニュアルでどうぞ。
スペースなどの空白文字だけでチェックを通過されるのを防止している。
mb_strlen
引数の文字列の長さを取得する。
第二引数を省略した場合はmb_check_encodingと同様のエンコーディングを使用する。
mbなのでマルチバイト文字の一文字を1個でカウントする。
ctype_digit
引数の文字列が数字(10進数)かどうか調べる。
TRUEかFALSEを返す。ただしinteger型の数値を渡すのはダメらしい。
HTMLフォームから飛んでくる整数値はstring型で返されるのでフォームの値をチェックする場合は特に問題はない。
in_array
配列に値があるかチェックする。
第一引数:探す値
第二引数:配列
第三引数:TRUEを与えた場合は型の一致までチェックする。省略可。
こちらが用意したもの以外を値に指定されたらエラーメッセージをセットする。
ここの値は配列なのでforeachで全ての要素をチェックしている。
コメント
No Trackbacks.