phpの最近のブログ記事
2011年6月12日
PHPを用いた入力データのエラーチェック処理
お問い合わせページなどで、再三行ってきた入力されたデータに対するエラー処理についてメモします。
先日AJAXを勉強したこともあって、現在は、非同期通信でのお問い合わせフォームをそそくさと作っている所です。
phpでのエラーチェックについてこれまで自分が用いてきたものとは違う方法を、書籍で見つけたのでまとめていきたいと思います。
複数の項目のエラーをまとめて返せるように、以下のように、配列変数をはじめにセットし、初期化します。
まずisset関数を用いて、$check_data["name"]変数があるかを調べ、
かつtrim関数を用いた空白文字の削除後に、名前が空っぽになっていないかを調べています。
さらに、mb_strlen関数で、きちんとマルチバイト文字の文字数をカウントして、許容量以上の文字数でないかを調べています。
はじめにisset関数を変数の存在を確認するのは、定義されていない変数を判定に掛けるとNOTICEエラーが生じてしまうからだそうです。(いまいち理解できていない・・・汗)
先日AJAXを勉強したこともあって、現在は、非同期通信でのお問い合わせフォームをそそくさと作っている所です。
phpでのエラーチェックについてこれまで自分が用いてきたものとは違う方法を、書籍で見つけたのでまとめていきたいと思います。
エラー内容はまとめて配列変数に格納する
ここでは、$error_listという変数を用います。複数の項目のエラーをまとめて返せるように、以下のように、配列変数をはじめにセットし、初期化します。
$error_list = array();各項目でエラーがあった場合は、その判定ごとにスクリプトを生成し、この配列に入れていくこととします。
submitボタン後の処理
submitボタンが押されたことを確認したら、実行するスクリプトは以下のようになります。if (isset($_POST["submit"])){ $_SESSION["name"] = isset($_POST["name"]) ? $_POST["name"] : " "; $_SESSION["age"] = isset($_POST["age"]) ? $_POST["age"] : " "; $_SESSION["comment"] = isset($_POST["comment"]) ? $_POST["comment"] : " "; //他で定義したerror_check()関数を実行する。 //引数は、上記の$_SESSION配列変数 $error_list = error_check($_SESSION); }
error_check()関数
上記で登場したerror_check()関数は、実際には別のphpファイルに書いて、require_onceで読み込みます。function error_check($check_data){ $error_list = array(); if (isset($check_data["name"]) && trim($check_data["name"]) === ""){ $error_list[] = "名前を入力してください。"; }elseif (mb_strlen($check_data["name"]) > 100){ $error_list[] = "名前は100文字以内で入力してください。"; } return $error_list; }入力された名前のエラーの有無を調べる上のスクリプトでは、若干複雑な条件分岐を作っています。
まずisset関数を用いて、$check_data["name"]変数があるかを調べ、
かつtrim関数を用いた空白文字の削除後に、名前が空っぽになっていないかを調べています。
さらに、mb_strlen関数で、きちんとマルチバイト文字の文字数をカウントして、許容量以上の文字数でないかを調べています。
はじめにisset関数を変数の存在を確認するのは、定義されていない変数を判定に掛けるとNOTICEエラーが生じてしまうからだそうです。(いまいち理解できていない・・・汗)
Smartyスクリプト使用上の注意点
Smartyのスクリプトを格納するサーバー上のフォルダは、Smartyのデフォルトの設定では、危険とのことです。スクリプトが漏洩してしまいます。
アクセスされては困るフォルダは、サーバのドキュメントルートより上の階層に置くことにします。
ここでは、「templates」と「templates_c」フォルダをドキュメントルートより上の階層に置くこととします。
Smartyクラスを継承した独自のクラスを作成して、上記のタスクを達成します。
アクセスされては困るフォルダは、サーバのドキュメントルートより上の階層に置くことにします。
ここでは、「templates」と「templates_c」フォルダをドキュメントルートより上の階層に置くこととします。
Smartyクラスを継承した独自のクラスを作成して、上記のタスクを達成します。
<?php //ROOT_DIRの定義。サーバのドキュメントルートとする。 define("ROOT_DIR", $_SERVER['DOCUMENT_ROOT']."/.."); //Smartyクラスの呼び出し require_once("Smarty.class.php");▲独自に作成するMySmarty.class.php これにより、作成するphpスクリプトで
//Smartyクラスを継承した新しいクラスを定義 class MySmarty extends Smarty{ //コンストラクタの記述 function MySmarty(){ $this -> template_dir = ROOT_DIR . "/templates"; $this -> compile_dir = ROOT_DIR . "/templates_c"; $this -> left_delimiter = "{{"; $this -> right_delimiter = "}}"; $this -> default_modifiers = array('escape'); $this -> Smarty(); } } ?>
require_once("../../lib/MySmarty.class.php"); 〜省略〜 $smarty -> display("hakashun.tpl");とすれば、自分で作成したテンプレートファイルを呼び出すことが出来る。
include関数、スーパーグローバル変数の呼び出し|Smartyメモ002
インクルード関数
別ファイルに記述されたテンプレートをインクルードするためのSmaty関数です。<html>
<head>
<title>include関数</title>
</head>
<body>
{include file="読み込みたいテンプレートのパス"}
</body>
</html>
movabletypeを使っているので、ヘッダーはヘッダー、フッターはフッターで管理することがSmartyで実現できます。PHP側で定義されたスーパーグローバル変数をSmartyで呼び出す
//$_SERVER["HTTP_HOST"] {$smarty.server.HTTP_HOST} //$_GET["key"] {$smarty.get.key} //$_POST["key"] {$smarty.post.key} //$_COOKIE["key"] {$smarty.cookie.key} //$_SESSION["key"] {$smarty.session.key}すごい直感的に書けるね!
if文とforeach文|Smartyメモ001
Smartyでのif文
{if $hakashun == "inStarbucks"} スターバックスにいます。 {elseif $hakashun == "inSFC"} 学校にいます。 {else} 自宅にいます。 {/if}
Smartyでのforeach文
基本形はこんな感じです。{foreach from=ループする配列 key=キー値取得変数名 item=要素取得変数名} {foreachelse} {/foreach}
phpと組み合わせる例です。
<?php require_once("../../lib/Smarty.class.php"); $star[] = "浜松"; $star[] = "鎌倉"; $star[] = "みなとみらい"; $star[] = "渋谷"; $star[] = "原宿"; $star[] = "ザザ"; $smarty = new Smarty(); $smarty -> assign("star", $star); $smarty -> display("template.tpl"); ?>▲phpコード
<select name="star">
{foreach from=$star key=num item=star_name}
<option value="{$num}">{$star_name}</option>
{foreachelse}
<option value="">選択できません。</option>
{/foreach}
</select>
ENT_QUOTES|最近使ったPHPメモ002
シングルクオテーションもちゃんとエスケープするには?
htmlspecialchars を使うときは、第2引数にENT_QUOTESをつけないと、シングルクオテーションをエスケープしてくれない。htmlspecialchars($str, ENT_QUOTES);
2011年6月11日
count()関数、rand()関数|最近使ったPHPのメモ001
count()関数
count関数は、配列の数を取得する関数です。$hakashun[] = "は"
$hakashun[] = "か"
$hakashun[] = "し"
$hakashun[] = "ゅ"
$hakashun[] = "ん"
$hakashunLength = count($hakashun);
echo $hakashunLength;
上記のような場合は、5をエコーします。rand()関数
randというだけあって、randomで値を取得するための関数です。上記のプログラムに加えて、
$randHakashun = rand(1,$hakashunLength);
echo $randHakashun;
とすると、1から5のどれかをランダムでエコーすることになります。