Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

いきおいでPHPを勉強する。その6

さぁさぁいまさらながらのPOST, GET処理が分かってきたぞーーー!   急ぐぞーー!

POST送信されたデータを受け取る。

<html>
<head>
<title>POST送信されたデータを受け取る</title>
</head>
<body>
<?php
// 入力内容を表示する
echo "<p>入力内容(\$_POST):".@$_POST["text1"];

?>
<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
  <table>
    <tr>
      <td><input type="text" name="text1"></td>
      <td><input type="submit" value="送信" name="sub1"></td>
    </tr>
  </table>
</form>
</body>
</html>

GET送信されたデータを受け取る

GET送信されたデータを受け取る <?php // 入力内容を表示する echo "

入力内容(\$GET):".@$GET["text1"];

?>

">

POSTもGETも一緒じゃない

と思ったが。URLに含まれるパラメータの話がでてきた。

GETの場合だと

http://localhost/sample.php?text1=abc

のようなURLにアクセスするのと同じことになる。   これは昔どこかで。。

はい。

とりあえずがんがんすすみます。

リンクからデータを受け取る

<html>
<head>
<title>リンクからデータを受け取る</title>
</head>
<body>
<?php
// URLパラメータを表示する
echo "<p>リンクから受け取ったキーワード:".@$_GET["key"];
?>
<hr>
<a href="<?php echo $_SERVER["PHP_SELF"]?>?key=PHP">PHPのページはこちら</a>
<a href="<?php echo $_SERVER["PHP_SELF"]?>?key=ASP">ASPのページはこちら</a>
<a href="<?php echo $_SERVER["PHP_SELF"]?>?key=JSP">JSPのページはこちら</a>
</body>
</html>

リンク先URLに自分を指定してあげて、そのあとパラメータの文字列(?key=param)を付加している。

フォームのデータをまとめて処理する

<html>
<head>
<title>フォームのデータをまとめて処理する</title>
</head>
<body>
<?php
// フォームから送信されたデータを表示する
foreach($_POST as $idx => $val){
    echo "<p>$idx = $val";
}

?>
<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
  <table>
    <tr>
      <td><input type="text" name="text1"></td>
    </tr>
    <tr>
      <td><input type="text" name="text2"></td>
    </tr>
    <tr>
      <td><input type="text" name="text3"></td>
    </tr>
    <tr>
      <td><input type="submit" value="送信" name="sub1"></td>
    </tr>
  </table>
</form>
</body>
</html>

foreach()ってなんだ

PHP: foreach - Manual

foreach は、配列を反復処理するための便利な方法です。
foreach が使えるのは配列とオブジェクトだけであり、 別のデータ型や初期化前の変数に対して使うとエラーになります。
この構造には二種類の構文があります。

foreach (array_expression as $value)
    文
foreach (array_expression as $key => $value)
    文

最初の形式は、array_expressionで指定した配列に 関してループ処理を行います。
各反復において現在の要素の値が $valueに代入され、内部配列ポインタが一つ前に 進められます。
(よって、次の反復では次の要素を見ることになります。)

2番目の形式は、さらに各反復で現在の要素のキーを変数 $keyに代入します

既にご存知かと思いますが、以下の文は機能的に等価です。

<?php
$arr = array("one", "two", "three");
reset($arr);
while (list(, $value) = each($arr)) {
    echo "Value: $value<br />\n";
}

foreach ($arr as $value) {
    echo "Value: $value<br />\n";
}
?>

以下の文も機能的に等価です。

<?php
$arr = array("one", "two", "three");
reset($arr);
while (list($key, $value) = each($arr)) {
    echo "Key: $key; Value: $value<br />\n";
}

foreach ($arr as $key => $value) {
    echo "Key: $key; Value: $value<br />\n";
}
?>

フォームのデータをまとめて変数にセットする

$text1 = $_POST["text1"];
$text2 = $_POST["text2"];
$text3 = $_POST["text3"];
は
extract($_POST);
と同等。
<html>
<head>
<title>フォームのデータをまとめて変数にセットする</title>
</head>
<body>
<?php

// フォームから送信されたデータをまとめて変数にセットする
extract($_POST);

echo "<p>テキスト1:".@$text1;
echo "<p>テキスト2:".@$text2;
echo "<p>テキスト3:".@$text3;

?>
<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
  <table>
    <tr>
      <td><input type="text" name="text1"></td>
    </tr>
    <tr>
      <td><input type="text" name="text2"></td>
    </tr>
    <tr>
      <td><input type="text" name="text3"></td>
    </tr>
    <tr>
      <td><input type="submit" value="送信" name="sub1"></td>
    </tr>
  </table>
</form>
</body>
</html>

(最後に) 配列のデータを受け取る

配列内には""が含まれているためうまくデータを渡せない。
そのため、serialize()関数で人つなぎの文字列に変化し、base64_encode()関数でエンコードする必要がある。

<html>
<head>
<title>配列のデータを受け取る</title>
</head>
<body>
<?php
// 配列を定義する
$array = array("menu"=>"カレー", "price"=>"380", "date"=>"2005/01/01");

// フォームから送信された配列を取得する
echo "<p>配列の内容(エンコードした場合):";
print_r(unserialize(base64_decode($_POST["ar_enc"])));
echo "<p>配列の内容(そのまま渡すと失敗):";
print_r($_POST["ar"]);
?>
<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
    <input type="submit" value="送信" name="sub1">
    <input type="hidden" name="ar" value="<?php echo $array ?>">
    <input type="hidden" name="ar_enc"
        value="<?php echo base64_encode(serialize($array)) ?>">
</form>
</body>
</html>