忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP 配列(array)何に使う:$_POST[] のデータを配列に取得


配列(array) は「連想配列」であり、その宣言等については以下のページで説明しましたが、 いざ 配列 の使い道は何があるのかは初心者の方には分かりづらいと思います。

PHP 配列(array)の使い方について(「添字配列」「連想配列」)

それで今回は 配列 を使って $_POST[] のデータを配列に取得する方法を説明します。
$_POST[] はウエブページから入力データを PHP に渡す一般的な方法です。
例えば、以下の様な HTML ページが在ったとします。 (「名前」「年齢」「メモ」の項目を入力し SUBMIT ボタンで「arr-post.php」に遷移させます)

<html>
<head>
  <meta charset="utf-8">
  <title>test array post</title>
</head>
<body>
<form name="test" action="arr-post.php" method="post">
  <p>名前:</p><input type="text" name="name" />
  <p>年齢:</p><input type="text" name="age"  />
  <p>メモ:</p><input type="text" name="memo"  />
  <input type="submit" value="送信" />
</form>
</body>
</html>


この form タグの遷移先の test.php での $_POST[] の取得は個別に行えば以下の様になります。
各項目ごとに $_POST[] にデータが存在することを確認し、個別の変数に値を設定します。

<?php
// $_POST["name"] 取得
$strName = "";
if ((isset($_POST["name"]) == true) && ($_POST["name"] != "")) {
    $strName = $_POST["name"];
}
// $_POST["age"] 取得
$strAge = "";
if ((isset($_POST["age"]) == true) && ($_POST["age"] != "")) {
    $strAge = $_POST["age"];
}
// $_POST["memo"] 取得
$strMemo = "";
if ((isset($_POST["memo"]) == true) && ($_POST["memo"] != "")) {
    $strMemo = $_POST["memo"];
}

// 取得データ表示
echo "名前:".$strName."<br />";
echo "年齢:".$strAge."<br />";
echo "メモ:".$strMemo."<br />";
?>

渡されるデータの個数が少なければこれでもいのですが、数が増えるとソース記述量も増えますので $_POST[] のキー値と、そのデータを格納する配列を導入します。

<?php
// $_POST のキー値
$arrKey = array("name", "age", "memo");
// データ格納用配列の初期化
$arrPara = array();
// $_POST のキー値を順次処理する
foreach($arrKey as $strKey) {
    // 各キー毎の格納用配列の初期化
    $arrPara[$strKey] = "";
    // $_POST の存在チェック
    if ((isset($_POST[$strKey]) == true) && ($_POST[$strKey] != "")) {
        // $_POST に存在すれば値を退避
        $arrPara[$strKey] = $_POST[$strKey];
    }
}
// 取得データの表示
foreach($arrPara as $strKey => $strPara) {
    echo "\$arrPara[".$strKey."] = ".$strPara."<br />";
}
?>

このままでもいいのですが、データが文字列として扱うのか、それとも数値として扱うのかを区別したり、 また、文字列データの場合には文字数制限を行ったりできる様にします。

1個のデータのキーに対して、複数の属性を持つことになりますので、属性データも配列で持ちます。
<?php
// $_POST のキー値
$arrKey = array(
    "name" => array("title" => "名前", "attr" => "string",  "maxlength" => 10) ,
    "age"  => array("title" => "年齢", "attr" => "integer", "maxlength" => 3 , "min" => 0, "max" => 99) ,
    "memo" => array("title" => "メモ", "attr" => "string",  "maxlength" => 20) ,
);
?>

"title" はデータのタイトル、"attr" はデータ属性、"maxlength" は文字列の最大長で、"min","max" は数値の場合の最大最小値のチェック用です。
この属性配列を使って $_POST[] からデータを取得しながらエラーチェックを行う処理は以下の様になります。

<?php
// $_POST のキー値
$arrKey = array(
    "name" => array("title" => "名前", "attr" => "string",  "maxlength" => 10) ,
    "age"  => array("title" => "年齢", "attr" => "integer", "maxlength" => 3 , "min" => 0, "max" => 99) ,
    "memo" => array("title" => "メモ", "attr" => "string",  "maxlength" => 20) ,
);
// データ格納用配列の初期化
$arrPara = array();
// エラーメッセージ
$strError = "";
// $_POST のキー値を順次処理する
foreach($arrKey as $strKey => $arrAttr) {
    switch ($arrAttr["attr"]) {
        case "string":
            $arrPara[$strKey] = "";
            if ((isset($_POST[$strKey]) === true) || ($_POST[$strKey] === "")) {
                $arrPara[$strKey] = $_POST[$strKey];
                // 文字列長チェック
                if (mb_strlen($arrPara[$strKey]) > $arrAttr["maxlength"]) {
                    $strError .= $arrAttr["title"].":データ長エラー<br />";
                }
            }
            break;
        case "integer":
            $arrPara[$strKey] = "";
            if ((isset($_POST[$strKey]) === true) || ($_POST[$strKey] === "")) {
                $arrPara[$strKey] = $_POST[$strKey];
                // 文字列長チェック
                if (mb_strlen($arrPara[$strKey]) > $arrAttr["maxlength"]) {
                    $strError .= $arrAttr["title"].":データ長エラー<br />";
                } elseif (is_numeric($arrPara[$strKey]) === false) {
                    // 数値チェックエラー
                    $strError .= $arrAttr["title"].":数値チェックエラー<br />";
                } else {
                    // 最小最大値チェック
                    $intAge = intval($arrPara[$strKey]);
                    if ($intAge < $arrAttr["min"] || $arrAttr["max"] < $intAge) {
                        $strError .= $arrAttr["title"].":最小最大値チェックエラー<br />";
                    }
                }
            }
            break;
    }
}
// 取得データの表示
foreach($arrPara as $strKey => $strPara) {
    echo "\$arrPara[".$strKey."] = ".$strPara."<br />";
}
// エラー表示
if ($strError != "") {
    echo "<br />".$strError;
}
?>

ラジオボタン、チェックボックス、セレクトボックス(コンボボックス)などのデータ属性はは考慮していませんので、 皆さんで拡張して下さい。


$_POST[] からデータを取得し配列に格納する処理は行ってきましたが、 それぞれのデータを別の変数に格納する場合にはどうするのかと言いますと、 以下の様に属性配列に格納先変数を 「参照変数」 として記述します。

<?php
// 各データ用変数
$strName = "";
$strAge  = "";
$strMemo = "";
// $_POST のキー値
$arrKey = array(
    "name" => array("title" => "名前", "attr" => "string",  "save" =>&$strName , "maxlength" => 10) ,
    "age"  => array("title" => "年齢", "attr" => "integer", "save" =>&$strAge  , "maxlength" => 3 , "min" => 0, "max" => 99) ,
    "memo" => array("title" => "メモ", "attr" => "string",  "save" =>&$strMemo , "maxlength" => 20) ,
);
// エラーメッセージ
$strError = "";
// $_POST のキー値を順次処理する
foreach($arrKey as $strKey => $arrAttr) {
    switch ($arrAttr["attr"]) {
        case "string":
            $arrAttr["save"] = "";
            if ((isset($_POST[$strKey]) === true) || ($_POST[$strKey] === "")) {
                $arrAttr["save"] = $_POST[$strKey];
                // 文字列長チェック
                if (mb_strlen($arrAttr["save"]) > $arrAttr["maxlength"]) {
                    $strError .= $arrAttr["title"].":データ長エラー<br />";
                }
            }
            break;
        case "integer":
            $arrAttr["save"] = "";
            if ((isset($_POST[$strKey]) === true) || ($_POST[$strKey] === "")) {
                $arrAttr["save"] = $_POST[$strKey];
                // 文字列長チェック
                if (mb_strlen($arrAttr["save"]) > $arrAttr["maxlength"]) {
                    $strError .= $arrAttr["title"].":データ長エラー<br />";
                } elseif (is_numeric($arrAttr["save"]) === false) {
                    // 数値チェックエラー
                    $strError .= $arrAttr["title"].":数値チェックエラー<br />";
                } else {
                    // 最小最大値チェック
                    $intAge = intval($arrAttr["save"]);
                    if ($intAge < $arrAttr["min"] || $arrAttr["max"] < $intAge) {
                        $strError .= $arrAttr["title"].":最小最大値チェックエラー<br />";
                    }
                }
            }
            break;
    }
}
// 取得データの表示(この処理も属性配列から格納先データを参照)
foreach($arrKey as $strKey => $arrAttr) {
    echo $arrAttr["title"]." = ".$arrAttr["save"]."<br />";
}
// エラー表示
if ($strError != "") {
    echo "<br />".$strError;
}
?>











PR

コメント

コメントを書く