Edited at

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

More than 3 years have passed since last update.


引用/参考

「プロになるためのWeb技術入門」

「よくわかるPHPの教科書」


ChromeでのHTTPログ確認方法

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


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

スクリーンショット 2015-08-21 15.56.33.png

(※引用/プロになるためのWeb技術入門)


GET

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


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>


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


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>


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


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>


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

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


Chrome/Firefox/Safari

chrome.png

※日本語使用できる


$_REQUEST


htmlspecialcharsとENT_QUOTES

http://php.net/manual/ja/function.htmlspecialchars.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>



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>



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


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


  • 「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

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


  • コピー元は、temp_name

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


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


<?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>



join/index.php

if ($_REQUEST['action'] == 'rewrite') {

$_POST = $_SESSION['join'];
$error['rewrite'] = true;
}
?>

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



投稿表示


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>



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

//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;
?>


<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
if ($page < $maxPage) {
?>
<li><a href="index.php?page=<?php print($page + 1); ?>">次のページへ</a></li>


hidden


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>


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>