phpの最近のブログ記事

2011年6月12日

PHPを用いた入力データのエラーチェック処理


お問い合わせページなどで、再三行ってきた入力されたデータに対するエラー処理についてメモします。
先日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クラスを継承した独自のクラスを作成して、上記のタスクを達成します。
<?php
	//ROOT_DIRの定義。サーバのドキュメントルートとする。
	define("ROOT_DIR", $_SERVER['DOCUMENT_ROOT']."/..");
	//Smartyクラスの呼び出し
	require_once("Smarty.class.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(); } } ?>
▲独自に作成するMySmarty.class.php
これにより、作成するphpスクリプトで
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;
上記のような場合は、をエコーします。

rand()関数

randというだけあって、randomで値を取得するための関数です。
上記のプログラムに加えて、
$randHakashun = rand(1,$hakashunLength);
echo $randHakashun;
とすると、1から5のどれかをランダムでエコーすることになります。
OpenID対応しています OpenIDについて

このアーカイブについて

このページには、過去に書かれたブログ記事のうちphpカテゴリに属しているものが含まれています。

前のカテゴリはjavaScriptです。

次のカテゴリはその他です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。