フォームやパラメーターについて

#引用/参考
「プロになるためのWeb技術入門」
「よくわかるPHPの教科書」

#ChromeでのHTTPログ確認方法
http://www.littleforest.jp/webtext/appendix.html

#GETリクエストとPOSTリクエスト

![スクリーンショット 2015-08-21 15.56.33.png](https://qiita-image-store.s3.amazonaws.com/0/62264/ec625236-19b5-a265-69a1-1dbd0aab7e18.png)
(※引用/プロになるためのWeb技術入門)


#GET

http://www.littleforest.jp/webtext/calc_get.html

```php:get.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メソッドによるパラメーター渡し</title>
</head>
<body>
<h1>GETメソッドによるパラメーター渡し</h1>
<form action="get.php" method="get">
	<input type="text" name="arg1" size="8">
	+
	<input type="text" name="arg2" size="8">
	<input type="submit" value="計算">
</form>
</body>
</html>
```

```php:get.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メソッドによるパラメーター渡し</title>
</head>
<body>
<h1>GETメソッドによるパラメーター渡し</h1>
<?php
$arg1=$_GET['arg1'];
$arg2=$_GET['arg2'];
$result=$arg1+$arg2;
echo htmlspecialchars($arg1)."+".htmlspecialchars($arg2)."=".htmlspecialchars($result);
?>
<br/>
<a href="get.html">もう一度計算する</a>
</body>
</html>
```

#POST

http://www.littleforest.jp/webtext/calc_post.html

```php:post.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メソッドによるパラメーター渡し</title>
</head>
<body>
<h1>POSTメソッドによるパラメーター渡し</h1>
<form action="post.php" method="post">
	<input type="text" name="arg1" size="8">
	+
	<input type="text" name="arg2" size="8">
	<input type="submit" value="計算">
</form>
</body>
</html>
```

```php:post.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メソッドによるパラメーター渡し</title>
</head>
<body>
<h1>POSTメソッドによるパラメーター渡し</h1>
<?php
$arg1 = $_POST['arg1'];
$arg2 = $_POST['arg2'];
$result = $arg1 + $arg2;
echo htmlspecialchars($arg1)."+".htmlspecialchars($arg2)."=".htmlspecialchars($result);
?>
<br/>
<a href="post.html">もう一度計算する</a>
</body>
</html>
```

#日本語のパラメーター渡しの件

http://www.littleforest.jp/webtext/greeting.html

```php:greeting.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>日本語のパラメータ渡し</title>
</head>
<body>
<h1>日本語のパラメータ渡し</h1>
<form action="greeting.php" method="get">
名前：<input type="text" name="name" size="16">
<input type="submit" value="ごあいさつ">
</form>
</body>
</html>
```

```php:greeting.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>日本語のパラメータ渡し</title>
</head>
<body>
<h1>日本語のパラメータ渡し</h1>
<?php
$name = $_GET[name];
echo 'こんにちは'.$name.'さん';
?>
</br>
<a href="greeting.html">もう一度ごあいさつする</a>
</body>
</html>
```

###IE
![ie.png](https://qiita-image-store.s3.amazonaws.com/0/62264/eff09a76-68f0-4946-147a-b3f776421340.png)

※自動でパーセントエンコーディング

###Chrome/Firefox/Safari
![chrome.png](https://qiita-image-store.s3.amazonaws.com/0/62264/5270ecae-89f7-5b8e-4885-a65131267beb.png)

※日本語使用できる


#$_REQUEST
####htmlspecialcharsとENT_QUOTES

http://php.net/manual/ja/function.htmlspecialchars.php

```php:get2.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>フォームに入力した内容を取得する</title>
</head>
<body>

	<form action="get2.php" method="get">
		<label for="my_name">お名前：</label>
		<input id="my_name" type="text" name="my_name" size="35" maxlength="255" value="" />
		<input type="submit" value="送信する" />
	</form>

</body>
</html>
```

```php:get2.php
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>フォームに入力した内容を取得する</title>
</head>
<body>
<?php
print('お名前： ' . htmlspecialchars($_REQUEST['my_name'], ENT_QUOTES));
?>
</body>
</html>
```


#$_SERVER
####1. 自ページから自ページへの遷移

http://pentan.info/php/php_self_security.html
https://secure.php.net/manual/ja/reserved.variables.server.php

```
<form method="post" action="">
```

- $_SERVER[PHP_SELF]を使わない
- URLに何も書かなければよい


```
<?php
echo $_SERVER['SERVER_NAME'];
?>
```
https://secure.php.net/manual/ja/reserved.variables.server.php



#$_FILES(画像をアップロードする)

```imgupload.html
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>画像をアップロード</title>
</head>
<body>
<h1>画像をアップロード</h1>

<form action="imgupload.php" method="post" enctype="multipart/form-data">
	<input name="my_img" type="file" id="my_img" size="50" />
	<input type="submit" value="送信する" />
</form>

</body>
</html>
```

```php:imgupload.php
<?php
ini_set('display_errors', 'on');
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<title>画像をアップロード</title>
</head>

<body>
<h1>画像をアップロード</h1>
<p>
<?php
$file = $_FILES['my_img'];

print('ファイル名(name): ' . $file['name'] . '<br />');
print('ファイルタイプ(type): ' . $file['type'] . '<br />');
print('アップロードしたファイル(tmp_name): ' . $file['tmp_name'] . '<br />');
print('エラー内容(error): ' . $file['error'] . '<br />');
print('サイズ(size): ' . $file['size'] . '<br />');

// ファイルアップロードの処理をする
$ext = substr($file['name'], -3);
if ($ext == 'gif' || $ext == 'jpg' || $ext == 'png') {
	$filePath = './user_img/' . $file['name'];
	move_uploaded_file($file['tmp_name'], $filePath);
	print('<img src="' . $filePath . '" />');
} else {
	print('※拡張子が.gif, .jpg, .pngのいずれかのファイルをアップロードしてください');
}
?>
</p>
</body>
</html>
```

![スクリーンショット 2015-08-21 20.08.21.png](https://qiita-image-store.s3.amazonaws.com/0/62264/350ce74d-6c67-7276-47e0-18f4ebf85557.png)


- フォームを送信するとき、エンコードをする。

- 「multipart/form-data」は、ファイルを送信できる方式
　　(画像をアップロードするときには必ずこの属性が必要)

- POST方式を使う。(GETでは送信されない)

- 特別な変数「$_FILES」で渡される。連想配列として格納されているので、「$_FILES['my_img']」などキーを指定して取り出す。


###ファイルのアップロード

- ファイルアップロードでは、決まった連想配列になっている。
- 「name」「type」「error」「tmp_name」(一時的にアップロードされたファイル名)というキー


```
// ファイルアップロードの処理をする
$ext = substr($file['name'], -3);
if ($ext == 'gif' || $ext == 'jpg' || $ext == 'png') {
	$filePath = './user_img/' . $file['name'];
	move_uploaded_file($file['tmp_name'], $filePath);
	print('<img src="' . $filePath . '" />');
} else {
	print('※拡張子が.gif, .jpg, .pngのいずれかのファイルをアップロードしてください');
}
```

###拡張子のチェック(substr)

http://php.net/manual/ja/function.substr.php

うしろから3文字の部分を切り取りチェック


###move_uploaded_file

アップロードされたファイルは、フォームが送信されると一時的に保存する。
それからプログラムの指示に従って、適切な場所に移動する。

![スクリーンショット 2015-08-21 20.22.27.png](https://qiita-image-store.s3.amazonaws.com/0/62264/93829fcd-cc5d-7665-0d02-0ea00d6b46c6.png)

```
プール値 = move_uploaded_file(コピー元,コピー先);
```

- コピー元は、temp_name
- ここではuser_imgというフォルダを作成(書き込み権限を与える)しておき、画像を移動させている。

###一時保存される場所を知る(「php.ini」で設定可能)

```php

<?php
print ini_get('upload_temp_dir');
?>
```

####マニュアル
http://jp.php.net/manual/ja/features.file-upload.post-method.php


#パラメータの使い方(サンプルから抜粋)

##会員登録

#####「$_REQUEST」
http://php.net/manual/ja/reserved.variables.request.php
http://plog.pya.jp/program/php/lesson09/sample01.html

```join/check.php
 <div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div>
```

```php:join/index.php
if ($_REQUEST['action'] == 'rewrite') {
    $_POST = $_SESSION['join'];
    $error['rewrite'] = true;
}
?>

//セッションに保存した値を$_POSTに代入(フォームに入力していた内容を再現)
//画像を再アップロードのエラー文言を表示
```

##投稿表示

```php:index.php
<?php echo makeLink(h($post['message'])); ?><span class="name">（<?php echo h($post['name']); ?>）</span>[<a href="index.php?res=<?php echo h($post['id']); ?>">Re</a>]</p>
```

```php

<p class="day"><a href="view.php?id=<?php echo h($post['id']); ?>"><?php echo h($post['created']); ?></a>
```

```php
//1件以上あればリンク表示
<?php
if ($post['reply_post_id'] > 0):
?>
<a href="view.php?id=<?php echo h($post['reply_post_id']); ?>">返信元のメッセージ</a>
<?php
endif;
?>
<?php
if ($_SESSION['id'] == $post['member_id']):
?>
    [<a href="delete.php?id=<?php echo h($post['id']); ?>" style="color: #F33;">削除</a>]
<?php
endif;
?>
    </p>
    </div>
<?php
endwhile;
?>
```

```php

<ul class="paging">
<?php
if ($page > 1) {
?>
<li><a href="index.php?page=<?php print($page - 1); ?>">前のページへ</a></li>

<?php
} else {
?>
<li>前のページへ</li>
```

```php

<?php
}
?>
<?php
if ($page < $maxPage) {
?>
<li><a href="index.php?page=<?php print($page + 1); ?>">次のページへ</a></li>
```

##hidden

```php:join/check.php

<form action="" method="post">
    <input type="hidden" name="action" value="submit" />
    <dl>
        <dt>ニックネーム</dt>
        <dd>
        <?php echo htmlspecialchars($_SESSION['join']['name'], ENT_QUOTES, 'UTF-8'); ?>
        </dd>
        <dt>メールアドレス</dt>
        <dd>
        <?php echo htmlspecialchars($_SESSION['join']['email'], ENT_QUOTES, 'UTF-8'); ?>
        </dd>
        <dt>パスワード</dt>
        <dd>
        【表示されません】
        </dd>
        <dt>写真など</dt>
        <dd>
        <img src="../member_picture/<?php echo $_SESSION['join']['image']; ?>" width="100" height="100" alt="" />
        </dd>
    </dl>
    <div><a href="index.php?action=rewrite">&laquo;&nbsp;書き直す</a> | <input type="submit" value="登録する" /></div>
</form>
```

```php:index.php

// 投稿を記録する
if (!empty($_POST)) {
    if ($_POST['message'] != '') {
        $sql = sprintf('INSERT INTO posts SET member_id=%d, message="%s", reply_post_id=%d, created=NOW()',
            mysql_real_escape_string($member['id']),
            mysql_real_escape_string($_POST['message']),
            mysql_real_escape_string($_POST['reply_post_id'])
        );
        mysql_query($sql) or die(mysql_error());

　　　　　　　　　 //リロード処理
        header('Location: index.php'); exit();
    }
}

<form action="" method="post">
      <dl>
        <dt><?php echo htmlspecialchars($member['name']); ?>さん、メッセージをどうぞ</dt>
        <dd>
          <textarea name="message" cols="50" rows="5"><?php echo h($message); ?></textarea>

          <input type="hidden" name="reply_post_id" value="<?php echo h($_REQUEST['res']); ?>" />
        </dd>
      </dl>
      <div>
        <p>
          <input type="submit" value="投稿する" />
        </p>
      </div>
</form>
```